Commit b7d5e297 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'tipc-cleanups-and-simplifications'



Jon Maloy says:

====================
tipc: cleanups and simplifications

We do a number of cleanups and simplifications, especially regarding
call signatures in the binding table. This makes the code easier to
understand and serves as preparation for upcoming functional additions.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 5c9e418b 5c834950
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
 *
 * Copyright (c) 2000-2006, 2018, Ericsson AB
 * Copyright (c) 2004-2005, 2010-2011, Wind River Systems
 * Copyright (c) 2020-2021, Red Hat Inc
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
+45 −1
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
 *
 * Copyright (c) 2000-2006, 2018, Ericsson AB
 * Copyright (c) 2004-2005, Wind River Systems
 * Copyright (c) 2020, Red Hat Inc
 * Copyright (c) 2020-2021, Red Hat Inc
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
@@ -44,6 +44,50 @@
#include <net/netns/generic.h>
#include "core.h"

/* Struct tipc_uaddr: internal version of struct sockaddr_tipc.
 * Must be kept aligned both regarding field positions and size.
 */
struct tipc_uaddr {
	unsigned short family;
	unsigned char addrtype;
	signed char scope;
	union {
		struct {
			struct tipc_service_addr sa;
			u32 lookup_node;
		};
		struct tipc_service_range sr;
		struct tipc_socket_addr sk;
	};
};

static inline void tipc_uaddr(struct tipc_uaddr *ua, u32 atype, u32 scope,
			      u32 type, u32 lower, u32 upper)
{
	ua->family = AF_TIPC;
	ua->addrtype = atype;
	ua->scope = scope;
	ua->sr.type = type;
	ua->sr.lower = lower;
	ua->sr.upper = upper;
}

static inline bool tipc_uaddr_valid(struct tipc_uaddr *ua, int len)
{
	u32 atype;

	if (len < sizeof(struct sockaddr_tipc))
		return false;
	atype = ua->addrtype;
	if (ua->family != AF_TIPC)
		return false;
	if (atype == TIPC_SERVICE_ADDR || atype == TIPC_SOCKET_ADDR)
		return true;
	if (atype == TIPC_SERVICE_RANGE)
		return ua->sr.upper >= ua->sr.lower;
	return false;
}

static inline u32 tipc_own_addr(struct net *net)
{
	return tipc_net(net)->node_addr;
+13 −10
Original line number Diff line number Diff line
@@ -707,8 +707,11 @@ bool tipc_msg_skb_clone(struct sk_buff_head *msg, struct sk_buff_head *cpy)
bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)
{
	struct tipc_msg *msg = buf_msg(skb);
	u32 dport, dnode;
	u32 onode = tipc_own_addr(net);
	u32 scope = msg_lookup_scope(msg);
	u32 self = tipc_own_addr(net);
	u32 inst = msg_nameinst(msg);
	struct tipc_socket_addr sk;
	struct tipc_uaddr ua;

	if (!msg_isdata(msg))
		return false;
@@ -722,16 +725,16 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)
	msg = buf_msg(skb);
	if (msg_reroute_cnt(msg))
		return false;
	dnode = tipc_scope2node(net, msg_lookup_scope(msg));
	dport = tipc_nametbl_translate(net, msg_nametype(msg),
				       msg_nameinst(msg), &dnode);
	if (!dport)
	tipc_uaddr(&ua, TIPC_SERVICE_RANGE, scope,
		   msg_nametype(msg), inst, inst);
	sk.node = tipc_scope2node(net, scope);
	if (!tipc_nametbl_lookup_anycast(net, &ua, &sk))
		return false;
	msg_incr_reroute_cnt(msg);
	if (dnode != onode)
		msg_set_prevnode(msg, onode);
	msg_set_destnode(msg, dnode);
	msg_set_destport(msg, dport);
	if (sk.node != self)
		msg_set_prevnode(msg, self);
	msg_set_destnode(msg, sk.node);
	msg_set_destport(msg, sk.ref);
	*err = TIPC_OK;

	return true;
+44 −49
Original line number Diff line number Diff line
/*
 * net/tipc/name_distr.c: TIPC name distribution code
 *
 * Copyright (c) 2000-2006, 2014, Ericsson AB
 * Copyright (c) 2000-2006, 2014-2019, Ericsson AB
 * Copyright (c) 2005, 2010-2011, Wind River Systems
 * Copyright (c) 2020-2021, Red Hat Inc
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
@@ -55,10 +56,10 @@ struct distr_queue_item {
 */
static void publ_to_item(struct distr_item *i, struct publication *p)
{
	i->type = htonl(p->type);
	i->lower = htonl(p->lower);
	i->upper = htonl(p->upper);
	i->port = htonl(p->port);
	i->type = htonl(p->sr.type);
	i->lower = htonl(p->sr.lower);
	i->upper = htonl(p->sr.upper);
	i->port = htonl(p->sk.ref);
	i->key = htonl(p->key);
}

@@ -90,20 +91,20 @@ static struct sk_buff *named_prepare_buf(struct net *net, u32 type, u32 size,
/**
 * tipc_named_publish - tell other nodes about a new publication by this node
 * @net: the associated network namespace
 * @publ: the new publication
 * @p: the new publication
 */
struct sk_buff *tipc_named_publish(struct net *net, struct publication *publ)
struct sk_buff *tipc_named_publish(struct net *net, struct publication *p)
{
	struct name_table *nt = tipc_name_table(net);
	struct distr_item *item;
	struct sk_buff *skb;

	if (publ->scope == TIPC_NODE_SCOPE) {
		list_add_tail_rcu(&publ->binding_node, &nt->node_scope);
	if (p->scope == TIPC_NODE_SCOPE) {
		list_add_tail_rcu(&p->binding_node, &nt->node_scope);
		return NULL;
	}
	write_lock_bh(&nt->cluster_scope_lock);
	list_add_tail(&publ->binding_node, &nt->cluster_scope);
	list_add_tail(&p->binding_node, &nt->cluster_scope);
	write_unlock_bh(&nt->cluster_scope_lock);
	skb = named_prepare_buf(net, PUBLICATION, ITEM_SIZE, 0);
	if (!skb) {
@@ -113,25 +114,25 @@ struct sk_buff *tipc_named_publish(struct net *net, struct publication *publ)
	msg_set_named_seqno(buf_msg(skb), nt->snd_nxt++);
	msg_set_non_legacy(buf_msg(skb));
	item = (struct distr_item *)msg_data(buf_msg(skb));
	publ_to_item(item, publ);
	publ_to_item(item, p);
	return skb;
}

/**
 * tipc_named_withdraw - tell other nodes about a withdrawn publication by this node
 * @net: the associated network namespace
 * @publ: the withdrawn publication
 * @p: the withdrawn publication
 */
struct sk_buff *tipc_named_withdraw(struct net *net, struct publication *publ)
struct sk_buff *tipc_named_withdraw(struct net *net, struct publication *p)
{
	struct name_table *nt = tipc_name_table(net);
	struct distr_item *item;
	struct sk_buff *skb;

	write_lock_bh(&nt->cluster_scope_lock);
	list_del(&publ->binding_node);
	list_del(&p->binding_node);
	write_unlock_bh(&nt->cluster_scope_lock);
	if (publ->scope == TIPC_NODE_SCOPE)
	if (p->scope == TIPC_NODE_SCOPE)
		return NULL;

	skb = named_prepare_buf(net, WITHDRAWAL, ITEM_SIZE, 0);
@@ -142,7 +143,7 @@ struct sk_buff *tipc_named_withdraw(struct net *net, struct publication *publ)
	msg_set_named_seqno(buf_msg(skb), nt->snd_nxt++);
	msg_set_non_legacy(buf_msg(skb));
	item = (struct distr_item *)msg_data(buf_msg(skb));
	publ_to_item(item, publ);
	publ_to_item(item, p);
	return skb;
}

@@ -233,33 +234,27 @@ void tipc_named_node_up(struct net *net, u32 dnode, u16 capabilities)
/**
 * tipc_publ_purge - remove publication associated with a failed node
 * @net: the associated network namespace
 * @publ: the publication to remove
 * @p: the publication to remove
 * @addr: failed node's address
 *
 * Invoked for each publication issued by a newly failed node.
 * Removes publication structure from name table & deletes it.
 */
static void tipc_publ_purge(struct net *net, struct publication *publ, u32 addr)
static void tipc_publ_purge(struct net *net, struct publication *p, u32 addr)
{
	struct tipc_net *tn = tipc_net(net);
	struct publication *p;
	struct publication *_p;
	struct tipc_uaddr ua;

	tipc_uaddr(&ua, TIPC_SERVICE_RANGE, p->scope, p->sr.type,
		   p->sr.lower, p->sr.upper);
	spin_lock_bh(&tn->nametbl_lock);
	p = tipc_nametbl_remove_publ(net, publ->type, publ->lower, publ->upper,
				     publ->node, publ->key);
	if (p)
		tipc_node_unsubscribe(net, &p->binding_node, addr);
	_p = tipc_nametbl_remove_publ(net, &ua, &p->sk, p->key);
	if (_p)
		tipc_node_unsubscribe(net, &_p->binding_node, addr);
	spin_unlock_bh(&tn->nametbl_lock);

	if (p != publ) {
		pr_err("Unable to remove publication from failed node\n"
		       " (type=%u, lower=%u, node=0x%x, port=%u, key=%u)\n",
		       publ->type, publ->lower, publ->node, publ->port,
		       publ->key);
	}

	if (p)
		kfree_rcu(p, rcu);
	if (_p)
		kfree_rcu(_p, rcu);
}

void tipc_publ_notify(struct net *net, struct list_head *nsub_list,
@@ -293,30 +288,30 @@ static bool tipc_update_nametbl(struct net *net, struct distr_item *i,
				u32 node, u32 dtype)
{
	struct publication *p = NULL;
	u32 lower = ntohl(i->lower);
	u32 upper = ntohl(i->upper);
	u32 type = ntohl(i->type);
	u32 port = ntohl(i->port);
	struct tipc_socket_addr sk;
	struct tipc_uaddr ua;
	u32 key = ntohl(i->key);

	tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_CLUSTER_SCOPE,
		   ntohl(i->type), ntohl(i->lower), ntohl(i->upper));
	sk.ref = ntohl(i->port);
	sk.node = node;

	if (dtype == PUBLICATION) {
		p = tipc_nametbl_insert_publ(net, type, lower, upper,
					     TIPC_CLUSTER_SCOPE, node,
					     port, key);
		p = tipc_nametbl_insert_publ(net, &ua, &sk, key);
		if (p) {
			tipc_node_subscribe(net, &p->binding_node, node);
			return true;
		}
	} else if (dtype == WITHDRAWAL) {
		p = tipc_nametbl_remove_publ(net, type, lower,
					     upper, node, key);
		p = tipc_nametbl_remove_publ(net, &ua, &sk, key);
		if (p) {
			tipc_node_unsubscribe(net, &p->binding_node, node);
			kfree_rcu(p, rcu);
			return true;
		}
		pr_warn_ratelimited("Failed to remove binding %u,%u from %x\n",
				    type, lower, node);
		pr_warn_ratelimited("Failed to remove binding %u,%u from %u\n",
				    ua.sr.type, ua.sr.lower, node);
	} else {
		pr_warn("Unrecognized name table message received\n");
	}
@@ -410,15 +405,15 @@ void tipc_named_reinit(struct net *net)
{
	struct name_table *nt = tipc_name_table(net);
	struct tipc_net *tn = tipc_net(net);
	struct publication *publ;
	struct publication *p;
	u32 self = tipc_own_addr(net);

	spin_lock_bh(&tn->nametbl_lock);

	list_for_each_entry_rcu(publ, &nt->node_scope, binding_node)
		publ->node = self;
	list_for_each_entry_rcu(publ, &nt->cluster_scope, binding_node)
		publ->node = self;
	list_for_each_entry_rcu(p, &nt->node_scope, binding_node)
		p->sk.node = self;
	list_for_each_entry_rcu(p, &nt->cluster_scope, binding_node)
		p->sk.node = self;
	nt->rc_dests = 0;
	spin_unlock_bh(&tn->nametbl_lock);
}
+217 −209

File changed.

Preview size limit exceeded, changes collapsed.

Loading