On Wed, Dec 9, 2020 at 2:51 AM <jma...@redhat.com> wrote: > > From: Jon Maloy <jma...@redhat.com> > > Using the new address structure tipc_uaddr, we simplify the signature > of function tipc_sk_publish() and tipc_namtbl_publish() so that fewer > parameters need to be passed around. > > Signed-off-by: Jon Maloy <jma...@redhat.com> > --- > net/tipc/name_table.c | 10 +++--- > net/tipc/name_table.h | 6 ++-- > net/tipc/net.c | 8 +++-- > net/tipc/node.c | 29 +++++++++-------- > net/tipc/socket.c | 75 +++++++++++++++++++++++-------------------- > 5 files changed, 70 insertions(+), 58 deletions(-) > > diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c > index 68e269b49780..d951e9345122 100644 > --- a/net/tipc/name_table.c > +++ b/net/tipc/name_table.c > @@ -742,9 +742,8 @@ void tipc_nametbl_build_group(struct net *net, struct > tipc_group *grp, > > /* tipc_nametbl_publish - add service binding to name table > */ > -struct publication *tipc_nametbl_publish(struct net *net, u32 type, u32 > lower, > - u32 upper, u32 scope, u32 port, > - u32 key) > +struct publication *tipc_nametbl_publish(struct net *net, struct tipc_uaddr > *ua, > + struct tipc_socket_addr *sk, u32 key) > { > struct name_table *nt = tipc_name_table(net); > struct tipc_net *tn = tipc_net(net); > @@ -759,8 +758,9 @@ struct publication *tipc_nametbl_publish(struct net *net, > u32 type, u32 lower, > goto exit; > } > > - p = tipc_nametbl_insert_publ(net, type, lower, upper, scope, > - tipc_own_addr(net), port, key); > + p = tipc_nametbl_insert_publ(net, ua->sr.type, ua->sr.lower, > + ua->sr.upper, ua->scope, > + sk->node, sk->ref, key); > if (p) { > nt->local_publ_count++; > skb = tipc_named_publish(net, p); > diff --git a/net/tipc/name_table.h b/net/tipc/name_table.h > index 3fff00440e1a..5e969e060509 100644 > --- a/net/tipc/name_table.h > +++ b/net/tipc/name_table.h > @@ -42,6 +42,7 @@ struct tipc_subscription; > struct tipc_plist; > struct tipc_nlist; > struct tipc_group; > +struct tipc_uaddr; > > /* > * TIPC name types reserved for internal TIPC use (both current and planned) > @@ -120,9 +121,8 @@ void tipc_nametbl_lookup_dst_nodes(struct net *net, u32 > type, u32 lower, > bool tipc_nametbl_lookup(struct net *net, u32 type, u32 instance, u32 domain, > struct list_head *dsts, int *dstcnt, u32 exclude, > bool all); > -struct publication *tipc_nametbl_publish(struct net *net, u32 type, u32 > lower, > - u32 upper, u32 scope, u32 port, > - u32 key); > +struct publication *tipc_nametbl_publish(struct net *net, struct tipc_uaddr > *ua, > + struct tipc_socket_addr *sk, u32 > key); > int tipc_nametbl_withdraw(struct net *net, u32 type, u32 lower, u32 upper, > u32 key); > struct publication *tipc_nametbl_insert_publ(struct net *net, u32 type, > diff --git a/net/tipc/net.c b/net/tipc/net.c > index a129f661bee3..3f927949bb23 100644 > --- a/net/tipc/net.c > +++ b/net/tipc/net.c > @@ -125,6 +125,11 @@ int tipc_net_init(struct net *net, u8 *node_id, u32 addr) > static void tipc_net_finalize(struct net *net, u32 addr) > { > struct tipc_net *tn = tipc_net(net); > + struct tipc_socket_addr sk = {0, addr}; > + struct tipc_uaddr ua; > + > + tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_CLUSTER_SCOPE, > + TIPC_NODE_STATE, addr, addr); > > if (cmpxchg(&tn->node_addr, 0, addr)) > return; > @@ -132,8 +137,7 @@ static void tipc_net_finalize(struct net *net, u32 addr) > tipc_named_reinit(net); > tipc_sk_reinit(net); > tipc_mon_reinit_self(net); > - tipc_nametbl_publish(net, TIPC_NODE_STATE, addr, addr, > - TIPC_CLUSTER_SCOPE, 0, addr); > + tipc_nametbl_publish(net, &ua, &sk, addr); > } > > void tipc_net_finalize_work(struct work_struct *work) > diff --git a/net/tipc/node.c b/net/tipc/node.c > index 86b4d7ffb47a..3a71e26c9509 100644 > --- a/net/tipc/node.c > +++ b/net/tipc/node.c > @@ -393,21 +393,23 @@ static void tipc_node_write_unlock_fast(struct > tipc_node *n) > > static void tipc_node_write_unlock(struct tipc_node *n) > { > + struct tipc_socket_addr sk; > struct net *net = n->net; > - u32 addr = 0; > u32 flags = n->action_flags; > - u32 link_id = 0; > - u32 bearer_id; > struct list_head *publ_list; > + struct tipc_uaddr ua; > + u32 bearer_id; > > if (likely(!flags)) { > write_unlock_bh(&n->lock); > return; > } > > - addr = n->addr; > - link_id = n->link_id; > - bearer_id = link_id & 0xffff; > + tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_NODE_SCOPE, > + TIPC_LINK_STATE, n->addr, n->addr); > + sk.ref = n->link_id; > + sk.node = n->addr; > + bearer_id = n->link_id & 0xffff; > publ_list = &n->publ_list; > > n->action_flags &= ~(TIPC_NOTIFY_NODE_DOWN | TIPC_NOTIFY_NODE_UP | > @@ -416,20 +418,19 @@ static void tipc_node_write_unlock(struct tipc_node *n) > write_unlock_bh(&n->lock); > > if (flags & TIPC_NOTIFY_NODE_DOWN) > - tipc_publ_notify(net, publ_list, addr, n->capabilities); > + tipc_publ_notify(net, publ_list, n->addr, n->capabilities); > > if (flags & TIPC_NOTIFY_NODE_UP) > - tipc_named_node_up(net, addr, n->capabilities); > + tipc_named_node_up(net, n->addr, n->capabilities); > > if (flags & TIPC_NOTIFY_LINK_UP) { > - tipc_mon_peer_up(net, addr, bearer_id); > - tipc_nametbl_publish(net, TIPC_LINK_STATE, addr, addr, > - TIPC_NODE_SCOPE, link_id, link_id); > + tipc_mon_peer_up(net, n->addr, bearer_id); > + tipc_nametbl_publish(net, &ua, &sk, n->link_id); > } > if (flags & TIPC_NOTIFY_LINK_DOWN) { > - tipc_mon_peer_down(net, addr, bearer_id); > - tipc_nametbl_withdraw(net, TIPC_LINK_STATE, addr, > - addr, link_id); > + tipc_mon_peer_down(net, n->addr, bearer_id); > + tipc_nametbl_withdraw(net, TIPC_LINK_STATE, n->addr, > + n->addr, n->link_id); > } > } > > diff --git a/net/tipc/socket.c b/net/tipc/socket.c > index bff14df40bc9..598c8611b75f 100644 > --- a/net/tipc/socket.c > +++ b/net/tipc/socket.c > @@ -111,7 +111,6 @@ struct tipc_sock { > struct sock sk; > u32 conn_type; > u32 conn_instance; > - int published; > u32 max_pkt; > u32 maxnagle; > u32 portid; > @@ -141,6 +140,7 @@ struct tipc_sock { > bool expect_ack; > bool nodelay; > bool group_is_open; > + bool published; > }; > > static int tipc_sk_backlog_rcv(struct sock *sk, struct sk_buff *skb); > @@ -151,8 +151,7 @@ static int tipc_release(struct socket *sock); > static int tipc_accept(struct socket *sock, struct socket *new_sock, int > flags, > bool kern); > static void tipc_sk_timeout(struct timer_list *t); > -static int tipc_sk_publish(struct tipc_sock *tsk, uint scope, > - struct tipc_service_range const *seq); > +static int tipc_sk_publish(struct tipc_sock *tsk, struct tipc_uaddr *ua); > static int tipc_sk_withdraw(struct tipc_sock *tsk, uint scope, > struct tipc_service_range const *seq); > static int tipc_sk_leave(struct tipc_sock *tsk); > @@ -677,22 +676,31 @@ static int tipc_release(struct socket *sock) > */ > static int __tipc_bind(struct socket *sock, struct sockaddr *skaddr, int > alen) > { > - struct sockaddr_tipc *addr = (struct sockaddr_tipc *)skaddr; > + struct tipc_uaddr *ua = (struct tipc_uaddr *)skaddr; > struct tipc_sock *tsk = tipc_sk(sock->sk); > + bool unbind = false; > > if (unlikely(!alen)) > return tipc_sk_withdraw(tsk, 0, NULL); > > - if (addr->addrtype == TIPC_SERVICE_ADDR) > - addr->addr.nameseq.upper = addr->addr.nameseq.lower; > + if (ua->addrtype == TIPC_SERVICE_ADDR) { > + ua->addrtype = TIPC_SERVICE_RANGE; > + ua->sr.upper = ua->sr.lower; > + } > + if (ua->scope < 0) { > + unbind = true; > + ua->scope = -ua->scope; > + } > + /* Users may still use deprecated TIPC_ZONE_SCOPE */ > + if (ua->scope != TIPC_NODE_SCOPE) > + ua->scope = TIPC_CLUSTER_SCOPE; > > if (tsk->group) > return -EACCES; > > - if (addr->scope >= 0) > - return tipc_sk_publish(tsk, addr->scope, &addr->addr.nameseq); > - else > - return tipc_sk_withdraw(tsk, -addr->scope, > &addr->addr.nameseq); > + if (unbind) > + return tipc_sk_withdraw(tsk, ua->scope, &ua->sr); > + return tipc_sk_publish(tsk, ua); > } > > int tipc_sk_bind(struct socket *sock, struct sockaddr *skaddr, int alen) > @@ -707,18 +715,17 @@ int tipc_sk_bind(struct socket *sock, struct sockaddr > *skaddr, int alen) > > static int tipc_bind(struct socket *sock, struct sockaddr *skaddr, int alen) > { > - struct sockaddr_tipc *addr = (struct sockaddr_tipc *)skaddr; > + struct tipc_uaddr *ua = (struct tipc_uaddr *)skaddr; > + u32 atype = ua->addrtype; > > if (alen) { > - if (alen < sizeof(struct sockaddr_tipc)) > + if (!tipc_uaddr_valid(ua, alen)) > return -EINVAL; > - if (addr->family != AF_TIPC) > + if (atype == TIPC_SOCKET_ADDR) > return -EAFNOSUPPORT; > - if (addr->addrtype > TIPC_SERVICE_ADDR) > - return -EAFNOSUPPORT; > - if (addr->addr.nameseq.type < TIPC_RESERVED_TYPES) { > + if (ua->sr.type < TIPC_RESERVED_TYPES) { > pr_warn_once("Can't bind to reserved service type > %u\n", > - addr->addr.nameseq.type); > + ua->sr.type); > return -EACCES; > } > } > @@ -2891,31 +2898,28 @@ static void tipc_sk_timeout(struct timer_list *t) > sock_put(sk); > } > > -static int tipc_sk_publish(struct tipc_sock *tsk, uint scope, > - struct tipc_service_range const *seq) > +static int tipc_sk_publish(struct tipc_sock *tsk, struct tipc_uaddr *ua) > { > struct sock *sk = &tsk->sk; > struct net *net = sock_net(sk); > - struct publication *publ; > + struct tipc_socket_addr skaddr; > + struct publication *p; > u32 key; > > - if (scope != TIPC_NODE_SCOPE) > - scope = TIPC_CLUSTER_SCOPE; > - > if (tipc_sk_connected(sk)) > return -EINVAL; > key = tsk->portid + tsk->pub_count + 1; > if (key == tsk->portid) > return -EADDRINUSE; > - > - publ = tipc_nametbl_publish(net, seq->type, seq->lower, seq->upper, > - scope, tsk->portid, key); > - if (unlikely(!publ)) > + skaddr.ref = tsk->portid; > + skaddr.node = tipc_own_addr(net); > + p = tipc_nametbl_publish(net, ua, &skaddr, key); > + if (unlikely(!p)) > return -EINVAL; > > - list_add(&publ->binding_sock, &tsk->publications); > + list_add(&p->binding_sock, &tsk->publications); > tsk->pub_count++; > - tsk->published = 1; > + tsk->published = true; > return 0; > } > > @@ -3067,7 +3071,7 @@ static int tipc_sk_join(struct tipc_sock *tsk, struct > tipc_group_req *mreq) > struct net *net = sock_net(&tsk->sk); > struct tipc_group *grp = tsk->group; > struct tipc_msg *hdr = &tsk->phdr; > - struct tipc_service_range seq; > + struct tipc_uaddr ua; > int rc; > > if (mreq->type < TIPC_RESERVED_TYPES) > @@ -3083,11 +3087,14 @@ static int tipc_sk_join(struct tipc_sock *tsk, struct > tipc_group_req *mreq) > msg_set_lookup_scope(hdr, mreq->scope); > msg_set_nametype(hdr, mreq->type); > msg_set_dest_droppable(hdr, true); > - seq.type = mreq->type; > - seq.lower = mreq->instance; > - seq.upper = seq.lower; > tipc_nametbl_build_group(net, grp, mreq->type, mreq->scope); > - rc = tipc_sk_publish(tsk, mreq->scope, &seq); Do we also need this check for tipc_sk_join(): if (ua->scope != TIPC_NODE_SCOPE) ua->scope = TIPC_CLUSTER_SCOPE; since this check has been removed from tipc_sk_publish()?
> + > + ua.sr.type = mreq->type; > + ua.sr.lower = mreq->instance; > + ua.sr.upper = ua.sr.lower; > + ua.scope = mreq->scope; > + ua.addrtype = TIPC_SERVICE_RANGE; Maybe just call: tipc_uaddr(&ua, TIPC_SERVICE_RANGE, mreq->scope, mreq->type, mreq->instance, ua.sr.lower) > + rc = tipc_sk_publish(tsk, &ua); > if (rc) { > tipc_group_delete(net, grp); > tsk->group = NULL; > -- > 2.28.0 > > > > _______________________________________________ > tipc-discussion mailing list > tipc-discussion@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/tipc-discussion _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion