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

Reply via email to