Hi Partha, Actually, I didn't consider that option. What I did consider, was to add new commands for 'tipc node list' and 'tipc nametable show' along the existing ones, but I found it would be too much duplicated code. I also thought that regular user programs (others than the 'tipc' tool) might want to programmatically know this mapping, so I first considered a getsockopt, but those aren't really made for this. I know that ioctl() used to be considered deprecated(), but that is not the case any more AFAIK, and I feel it is simpler to use than netlink (i.e., no callback function) for a program which only needs to quickly check the id of a node, given the hash address. Can you see nay obvious advantages with using netlink here?
///jon > -----Original Message----- > From: Partha [mailto:[email protected]] > Sent: Tuesday, April 03, 2018 02:39 > To: Jon Maloy <[email protected]>; Jon Maloy > <[email protected]> > Cc: [email protected]; Mohan Krishna Ghanta > Krishnamurthy <[email protected]>; > [email protected] > Subject: Re: [tipc-discussion] [net-next 1/1] tipc: introduce ioctl for > fetching > node identity > > On 2018-03-30 01:15, Jon Maloy wrote: > > After the introduction of a 128-bit node identity it may be difficult > > for a user to correlate between this identity and the generated node > > hash address. > > > > We now try to make this easier by introducing a new ioctl() call for > > fetching a node identity by using the hash value as key. This will be > > particularly useful when we extend some of the commands in the 'tipc' > > tool. > > > Why don't we extend the Node info to include a new type > TIPC_NLA_NODE_FULL_IDENTITY, or something like that. > If the user space understand this new type, he processes it else discards it. > The user doesn't need to open a different socket (family > TIPC) for ioctl(). > > I would prefer that we continue to use the scalable netlink instead of > ioctl(). > > regards > Partha > > > Signed-off-by: Jon Maloy <[email protected]> > > --- > > include/uapi/linux/tipc.h | 9 ++++++--- > > net/tipc/node.c | 16 ++++++++++++++++ > > net/tipc/node.h | 1 + > > net/tipc/socket.c | 13 +++++++++++-- > > 4 files changed, 34 insertions(+), 5 deletions(-) > > > > diff --git a/include/uapi/linux/tipc.h b/include/uapi/linux/tipc.h > > index bf6d286..e24e068 100644 > > --- a/include/uapi/linux/tipc.h > > +++ b/include/uapi/linux/tipc.h > > @@ -209,16 +209,15 @@ struct tipc_group_req { > > * The string formatting for each name element is: > > * media: media > > * interface: media:interface name > > - * link: Z.C.N:interface-Z.C.N:interface > > - * > > */ > > - > > +#define TIPC_NODEID_LEN 16 > > #define TIPC_MAX_MEDIA_NAME 16 > > #define TIPC_MAX_IF_NAME 16 > > #define TIPC_MAX_BEARER_NAME 32 > > #define TIPC_MAX_LINK_NAME 68 > > > > #define SIOCGETLINKNAME SIOCPROTOPRIVATE > > +#define SIOCGETNODEID (SIOCPROTOPRIVATE + 1) > > > > struct tipc_sioc_ln_req { > > __u32 peer; > > @@ -226,6 +225,10 @@ struct tipc_sioc_ln_req { > > char linkname[TIPC_MAX_LINK_NAME]; > > }; > > > > +struct tipc_sioc_nodeid_req { > > + __u32 peer; > > + char node_id[TIPC_NODEID_LEN]; > > +}; > > > > /* The macros and functions below are deprecated: > > */ > > diff --git a/net/tipc/node.c b/net/tipc/node.c index c77dd2f..45a2d86 > > 100644 > > --- a/net/tipc/node.c > > +++ b/net/tipc/node.c > > @@ -195,6 +195,22 @@ int tipc_node_get_mtu(struct net *net, u32 addr, > u32 sel) > > return mtu; > > } > > > > +bool tipc_node_get_id(struct net *net, u32 addr, u8 *id) { > > + struct tipc_node *n; > > + > > + if (!addr || addr == tipc_own_addr(net)) { > > + memcpy(id, tipc_own_id(net), TIPC_NODEID_LEN); > > + return true; > > + } > > + n = tipc_node_find(net, addr); > > + if (!n) > > + return false; > > + memcpy(id, &n->peer_id, TIPC_NODEID_LEN); > > + tipc_node_put(n); > > + return true; > > +} > > + > > u16 tipc_node_get_capabilities(struct net *net, u32 addr) > > { > > struct tipc_node *n; > > diff --git a/net/tipc/node.h b/net/tipc/node.h index f24b835..22fc852 > > 100644 > > --- a/net/tipc/node.h > > +++ b/net/tipc/node.h > > @@ -60,6 +60,7 @@ enum { > > #define INVALID_BEARER_ID -1 > > > > void tipc_node_stop(struct net *net); > > +bool tipc_node_get_id(struct net *net, u32 addr, u8 *id); > > u32 tipc_node_try_addr(struct net *net, u8 *id, u32 addr); > > void tipc_node_check_dest(struct net *net, u32 onode, u8 *peer_id128, > > struct tipc_bearer *bearer, > > diff --git a/net/tipc/socket.c b/net/tipc/socket.c index > > 3e5eba3..468c2dc 100644 > > --- a/net/tipc/socket.c > > +++ b/net/tipc/socket.c > > @@ -2971,7 +2971,8 @@ static int tipc_getsockopt(struct socket *sock, > > int lvl, int opt, > > > > static int tipc_ioctl(struct socket *sock, unsigned int cmd, unsigned long > arg) > > { > > - struct sock *sk = sock->sk; > > + struct net *net = sock_net(sock->sk); > > + struct tipc_sioc_nodeid_req nr; > > struct tipc_sioc_ln_req lnr; > > void __user *argp = (void __user *)arg; > > > > @@ -2979,7 +2980,7 @@ static int tipc_ioctl(struct socket *sock, unsigned > int cmd, unsigned long arg) > > case SIOCGETLINKNAME: > > if (copy_from_user(&lnr, argp, sizeof(lnr))) > > return -EFAULT; > > - if (!tipc_node_get_linkname(sock_net(sk), > > + if (!tipc_node_get_linkname(net, > > lnr.bearer_id & 0xffff, lnr.peer, > > lnr.linkname, > TIPC_MAX_LINK_NAME)) { > > if (copy_to_user(argp, &lnr, sizeof(lnr))) @@ -2987,6 > +2988,14 @@ > > static int tipc_ioctl(struct socket *sock, unsigned int cmd, unsigned long > arg) > > return 0; > > } > > return -EADDRNOTAVAIL; > > + case SIOCGETNODEID: > > + if (copy_from_user(&nr, argp, sizeof(nr))) > > + return -EFAULT; > > + if (!tipc_node_get_id(net, nr.peer, nr.node_id)) > > + return -EADDRNOTAVAIL; > > + if (copy_to_user(argp, &nr, sizeof(nr))) > > + return -EFAULT; > > + return 0; > > default: > > return -ENOIOCTLCMD; > > } > > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ tipc-discussion mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/tipc-discussion
