diff options
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/node.c | 21 | ||||
-rw-r--r-- | net/tipc/node.h | 1 | ||||
-rw-r--r-- | net/tipc/socket.c | 13 |
3 files changed, 33 insertions, 2 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index e9c52e1416c5..81e6dd0cd1ca 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -195,6 +195,27 @@ int tipc_node_get_mtu(struct net *net, u32 addr, u32 sel) | |||
195 | return mtu; | 195 | return mtu; |
196 | } | 196 | } |
197 | 197 | ||
198 | bool tipc_node_get_id(struct net *net, u32 addr, u8 *id) | ||
199 | { | ||
200 | u8 *own_id = tipc_own_id(net); | ||
201 | struct tipc_node *n; | ||
202 | |||
203 | if (!own_id) | ||
204 | return true; | ||
205 | |||
206 | if (addr == tipc_own_addr(net)) { | ||
207 | memcpy(id, own_id, TIPC_NODEID_LEN); | ||
208 | return true; | ||
209 | } | ||
210 | n = tipc_node_find(net, addr); | ||
211 | if (!n) | ||
212 | return false; | ||
213 | |||
214 | memcpy(id, &n->peer_id, TIPC_NODEID_LEN); | ||
215 | tipc_node_put(n); | ||
216 | return true; | ||
217 | } | ||
218 | |||
198 | u16 tipc_node_get_capabilities(struct net *net, u32 addr) | 219 | u16 tipc_node_get_capabilities(struct net *net, u32 addr) |
199 | { | 220 | { |
200 | struct tipc_node *n; | 221 | struct tipc_node *n; |
diff --git a/net/tipc/node.h b/net/tipc/node.h index bb271a37c93f..846c8f240872 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h | |||
@@ -60,6 +60,7 @@ enum { | |||
60 | #define INVALID_BEARER_ID -1 | 60 | #define INVALID_BEARER_ID -1 |
61 | 61 | ||
62 | void tipc_node_stop(struct net *net); | 62 | void tipc_node_stop(struct net *net); |
63 | bool tipc_node_get_id(struct net *net, u32 addr, u8 *id); | ||
63 | u32 tipc_node_try_addr(struct net *net, u8 *id, u32 addr); | 64 | u32 tipc_node_try_addr(struct net *net, u8 *id, u32 addr); |
64 | void tipc_node_check_dest(struct net *net, u32 onode, u8 *peer_id128, | 65 | void tipc_node_check_dest(struct net *net, u32 onode, u8 *peer_id128, |
65 | struct tipc_bearer *bearer, | 66 | struct tipc_bearer *bearer, |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 252a52ae0893..c4992002fd68 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -2973,7 +2973,8 @@ static int tipc_getsockopt(struct socket *sock, int lvl, int opt, | |||
2973 | 2973 | ||
2974 | static int tipc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | 2974 | static int tipc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) |
2975 | { | 2975 | { |
2976 | struct sock *sk = sock->sk; | 2976 | struct net *net = sock_net(sock->sk); |
2977 | struct tipc_sioc_nodeid_req nr = {0}; | ||
2977 | struct tipc_sioc_ln_req lnr; | 2978 | struct tipc_sioc_ln_req lnr; |
2978 | void __user *argp = (void __user *)arg; | 2979 | void __user *argp = (void __user *)arg; |
2979 | 2980 | ||
@@ -2981,7 +2982,7 @@ static int tipc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
2981 | case SIOCGETLINKNAME: | 2982 | case SIOCGETLINKNAME: |
2982 | if (copy_from_user(&lnr, argp, sizeof(lnr))) | 2983 | if (copy_from_user(&lnr, argp, sizeof(lnr))) |
2983 | return -EFAULT; | 2984 | return -EFAULT; |
2984 | if (!tipc_node_get_linkname(sock_net(sk), | 2985 | if (!tipc_node_get_linkname(net, |
2985 | lnr.bearer_id & 0xffff, lnr.peer, | 2986 | lnr.bearer_id & 0xffff, lnr.peer, |
2986 | lnr.linkname, TIPC_MAX_LINK_NAME)) { | 2987 | lnr.linkname, TIPC_MAX_LINK_NAME)) { |
2987 | if (copy_to_user(argp, &lnr, sizeof(lnr))) | 2988 | if (copy_to_user(argp, &lnr, sizeof(lnr))) |
@@ -2989,6 +2990,14 @@ static int tipc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
2989 | return 0; | 2990 | return 0; |
2990 | } | 2991 | } |
2991 | return -EADDRNOTAVAIL; | 2992 | return -EADDRNOTAVAIL; |
2993 | case SIOCGETNODEID: | ||
2994 | if (copy_from_user(&nr, argp, sizeof(nr))) | ||
2995 | return -EFAULT; | ||
2996 | if (!tipc_node_get_id(net, nr.peer, nr.node_id)) | ||
2997 | return -EADDRNOTAVAIL; | ||
2998 | if (copy_to_user(argp, &nr, sizeof(nr))) | ||
2999 | return -EFAULT; | ||
3000 | return 0; | ||
2992 | default: | 3001 | default: |
2993 | return -ENOIOCTLCMD; | 3002 | return -ENOIOCTLCMD; |
2994 | } | 3003 | } |