aboutsummaryrefslogtreecommitdiffstats
path: root/net/netlink/af_netlink.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2012-09-07 16:12:54 -0400
committerDavid S. Miller <davem@davemloft.net>2012-09-10 15:30:41 -0400
commit15e473046cb6e5d18a4d0057e61d76315230382b (patch)
tree893d2df5d46a6ce156933ac57a1398f0ad22b889 /net/netlink/af_netlink.c
parent9f00d9776bc5beb92e8bfc884a7e96ddc5589e2e (diff)
netlink: Rename pid to portid to avoid confusion
It is a frequent mistake to confuse the netlink port identifier with a process identifier. Try to reduce this confusion by renaming fields that hold port identifiers portid instead of pid. I have carefully avoided changing the structures exported to userspace to avoid changing the userspace API. I have successfully built an allyesconfig kernel with this change. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Acked-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/netlink/af_netlink.c')
-rw-r--r--net/netlink/af_netlink.c172
1 files changed, 86 insertions, 86 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 4d348e97e131..0f2e3ad69c47 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -67,8 +67,8 @@
67struct netlink_sock { 67struct netlink_sock {
68 /* struct sock has to be the first member of netlink_sock */ 68 /* struct sock has to be the first member of netlink_sock */
69 struct sock sk; 69 struct sock sk;
70 u32 pid; 70 u32 portid;
71 u32 dst_pid; 71 u32 dst_portid;
72 u32 dst_group; 72 u32 dst_group;
73 u32 flags; 73 u32 flags;
74 u32 subscriptions; 74 u32 subscriptions;
@@ -104,7 +104,7 @@ static inline int netlink_is_kernel(struct sock *sk)
104 return nlk_sk(sk)->flags & NETLINK_KERNEL_SOCKET; 104 return nlk_sk(sk)->flags & NETLINK_KERNEL_SOCKET;
105} 105}
106 106
107struct nl_pid_hash { 107struct nl_portid_hash {
108 struct hlist_head *table; 108 struct hlist_head *table;
109 unsigned long rehash_time; 109 unsigned long rehash_time;
110 110
@@ -118,7 +118,7 @@ struct nl_pid_hash {
118}; 118};
119 119
120struct netlink_table { 120struct netlink_table {
121 struct nl_pid_hash hash; 121 struct nl_portid_hash hash;
122 struct hlist_head mc_list; 122 struct hlist_head mc_list;
123 struct listeners __rcu *listeners; 123 struct listeners __rcu *listeners;
124 unsigned int flags; 124 unsigned int flags;
@@ -145,9 +145,9 @@ static inline u32 netlink_group_mask(u32 group)
145 return group ? 1 << (group - 1) : 0; 145 return group ? 1 << (group - 1) : 0;
146} 146}
147 147
148static inline struct hlist_head *nl_pid_hashfn(struct nl_pid_hash *hash, u32 pid) 148static inline struct hlist_head *nl_portid_hashfn(struct nl_portid_hash *hash, u32 portid)
149{ 149{
150 return &hash->table[jhash_1word(pid, hash->rnd) & hash->mask]; 150 return &hash->table[jhash_1word(portid, hash->rnd) & hash->mask];
151} 151}
152 152
153static void netlink_destroy_callback(struct netlink_callback *cb) 153static void netlink_destroy_callback(struct netlink_callback *cb)
@@ -239,17 +239,17 @@ netlink_unlock_table(void)
239 wake_up(&nl_table_wait); 239 wake_up(&nl_table_wait);
240} 240}
241 241
242static struct sock *netlink_lookup(struct net *net, int protocol, u32 pid) 242static struct sock *netlink_lookup(struct net *net, int protocol, u32 portid)
243{ 243{
244 struct nl_pid_hash *hash = &nl_table[protocol].hash; 244 struct nl_portid_hash *hash = &nl_table[protocol].hash;
245 struct hlist_head *head; 245 struct hlist_head *head;
246 struct sock *sk; 246 struct sock *sk;
247 struct hlist_node *node; 247 struct hlist_node *node;
248 248
249 read_lock(&nl_table_lock); 249 read_lock(&nl_table_lock);
250 head = nl_pid_hashfn(hash, pid); 250 head = nl_portid_hashfn(hash, portid);
251 sk_for_each(sk, node, head) { 251 sk_for_each(sk, node, head) {
252 if (net_eq(sock_net(sk), net) && (nlk_sk(sk)->pid == pid)) { 252 if (net_eq(sock_net(sk), net) && (nlk_sk(sk)->portid == portid)) {
253 sock_hold(sk); 253 sock_hold(sk);
254 goto found; 254 goto found;
255 } 255 }
@@ -260,7 +260,7 @@ found:
260 return sk; 260 return sk;
261} 261}
262 262
263static struct hlist_head *nl_pid_hash_zalloc(size_t size) 263static struct hlist_head *nl_portid_hash_zalloc(size_t size)
264{ 264{
265 if (size <= PAGE_SIZE) 265 if (size <= PAGE_SIZE)
266 return kzalloc(size, GFP_ATOMIC); 266 return kzalloc(size, GFP_ATOMIC);
@@ -270,7 +270,7 @@ static struct hlist_head *nl_pid_hash_zalloc(size_t size)
270 get_order(size)); 270 get_order(size));
271} 271}
272 272
273static void nl_pid_hash_free(struct hlist_head *table, size_t size) 273static void nl_portid_hash_free(struct hlist_head *table, size_t size)
274{ 274{
275 if (size <= PAGE_SIZE) 275 if (size <= PAGE_SIZE)
276 kfree(table); 276 kfree(table);
@@ -278,7 +278,7 @@ static void nl_pid_hash_free(struct hlist_head *table, size_t size)
278 free_pages((unsigned long)table, get_order(size)); 278 free_pages((unsigned long)table, get_order(size));
279} 279}
280 280
281static int nl_pid_hash_rehash(struct nl_pid_hash *hash, int grow) 281static int nl_portid_hash_rehash(struct nl_portid_hash *hash, int grow)
282{ 282{
283 unsigned int omask, mask, shift; 283 unsigned int omask, mask, shift;
284 size_t osize, size; 284 size_t osize, size;
@@ -296,7 +296,7 @@ static int nl_pid_hash_rehash(struct nl_pid_hash *hash, int grow)
296 size *= 2; 296 size *= 2;
297 } 297 }
298 298
299 table = nl_pid_hash_zalloc(size); 299 table = nl_portid_hash_zalloc(size);
300 if (!table) 300 if (!table)
301 return 0; 301 return 0;
302 302
@@ -311,23 +311,23 @@ static int nl_pid_hash_rehash(struct nl_pid_hash *hash, int grow)
311 struct hlist_node *node, *tmp; 311 struct hlist_node *node, *tmp;
312 312
313 sk_for_each_safe(sk, node, tmp, &otable[i]) 313 sk_for_each_safe(sk, node, tmp, &otable[i])
314 __sk_add_node(sk, nl_pid_hashfn(hash, nlk_sk(sk)->pid)); 314 __sk_add_node(sk, nl_portid_hashfn(hash, nlk_sk(sk)->portid));
315 } 315 }
316 316
317 nl_pid_hash_free(otable, osize); 317 nl_portid_hash_free(otable, osize);
318 hash->rehash_time = jiffies + 10 * 60 * HZ; 318 hash->rehash_time = jiffies + 10 * 60 * HZ;
319 return 1; 319 return 1;
320} 320}
321 321
322static inline int nl_pid_hash_dilute(struct nl_pid_hash *hash, int len) 322static inline int nl_portid_hash_dilute(struct nl_portid_hash *hash, int len)
323{ 323{
324 int avg = hash->entries >> hash->shift; 324 int avg = hash->entries >> hash->shift;
325 325
326 if (unlikely(avg > 1) && nl_pid_hash_rehash(hash, 1)) 326 if (unlikely(avg > 1) && nl_portid_hash_rehash(hash, 1))
327 return 1; 327 return 1;
328 328
329 if (unlikely(len > avg) && time_after(jiffies, hash->rehash_time)) { 329 if (unlikely(len > avg) && time_after(jiffies, hash->rehash_time)) {
330 nl_pid_hash_rehash(hash, 0); 330 nl_portid_hash_rehash(hash, 0);
331 return 1; 331 return 1;
332 } 332 }
333 333
@@ -356,9 +356,9 @@ netlink_update_listeners(struct sock *sk)
356 * makes sure updates are visible before bind or setsockopt return. */ 356 * makes sure updates are visible before bind or setsockopt return. */
357} 357}
358 358
359static int netlink_insert(struct sock *sk, struct net *net, u32 pid) 359static int netlink_insert(struct sock *sk, struct net *net, u32 portid)
360{ 360{
361 struct nl_pid_hash *hash = &nl_table[sk->sk_protocol].hash; 361 struct nl_portid_hash *hash = &nl_table[sk->sk_protocol].hash;
362 struct hlist_head *head; 362 struct hlist_head *head;
363 int err = -EADDRINUSE; 363 int err = -EADDRINUSE;
364 struct sock *osk; 364 struct sock *osk;
@@ -366,10 +366,10 @@ static int netlink_insert(struct sock *sk, struct net *net, u32 pid)
366 int len; 366 int len;
367 367
368 netlink_table_grab(); 368 netlink_table_grab();
369 head = nl_pid_hashfn(hash, pid); 369 head = nl_portid_hashfn(hash, portid);
370 len = 0; 370 len = 0;
371 sk_for_each(osk, node, head) { 371 sk_for_each(osk, node, head) {
372 if (net_eq(sock_net(osk), net) && (nlk_sk(osk)->pid == pid)) 372 if (net_eq(sock_net(osk), net) && (nlk_sk(osk)->portid == portid))
373 break; 373 break;
374 len++; 374 len++;
375 } 375 }
@@ -377,17 +377,17 @@ static int netlink_insert(struct sock *sk, struct net *net, u32 pid)
377 goto err; 377 goto err;
378 378
379 err = -EBUSY; 379 err = -EBUSY;
380 if (nlk_sk(sk)->pid) 380 if (nlk_sk(sk)->portid)
381 goto err; 381 goto err;
382 382
383 err = -ENOMEM; 383 err = -ENOMEM;
384 if (BITS_PER_LONG > 32 && unlikely(hash->entries >= UINT_MAX)) 384 if (BITS_PER_LONG > 32 && unlikely(hash->entries >= UINT_MAX))
385 goto err; 385 goto err;
386 386
387 if (len && nl_pid_hash_dilute(hash, len)) 387 if (len && nl_portid_hash_dilute(hash, len))
388 head = nl_pid_hashfn(hash, pid); 388 head = nl_portid_hashfn(hash, portid);
389 hash->entries++; 389 hash->entries++;
390 nlk_sk(sk)->pid = pid; 390 nlk_sk(sk)->portid = portid;
391 sk_add_node(sk, head); 391 sk_add_node(sk, head);
392 err = 0; 392 err = 0;
393 393
@@ -518,11 +518,11 @@ static int netlink_release(struct socket *sock)
518 518
519 skb_queue_purge(&sk->sk_write_queue); 519 skb_queue_purge(&sk->sk_write_queue);
520 520
521 if (nlk->pid) { 521 if (nlk->portid) {
522 struct netlink_notify n = { 522 struct netlink_notify n = {
523 .net = sock_net(sk), 523 .net = sock_net(sk),
524 .protocol = sk->sk_protocol, 524 .protocol = sk->sk_protocol,
525 .pid = nlk->pid, 525 .portid = nlk->portid,
526 }; 526 };
527 atomic_notifier_call_chain(&netlink_chain, 527 atomic_notifier_call_chain(&netlink_chain,
528 NETLINK_URELEASE, &n); 528 NETLINK_URELEASE, &n);
@@ -559,24 +559,24 @@ static int netlink_autobind(struct socket *sock)
559{ 559{
560 struct sock *sk = sock->sk; 560 struct sock *sk = sock->sk;
561 struct net *net = sock_net(sk); 561 struct net *net = sock_net(sk);
562 struct nl_pid_hash *hash = &nl_table[sk->sk_protocol].hash; 562 struct nl_portid_hash *hash = &nl_table[sk->sk_protocol].hash;
563 struct hlist_head *head; 563 struct hlist_head *head;
564 struct sock *osk; 564 struct sock *osk;
565 struct hlist_node *node; 565 struct hlist_node *node;
566 s32 pid = task_tgid_vnr(current); 566 s32 portid = task_tgid_vnr(current);
567 int err; 567 int err;
568 static s32 rover = -4097; 568 static s32 rover = -4097;
569 569
570retry: 570retry:
571 cond_resched(); 571 cond_resched();
572 netlink_table_grab(); 572 netlink_table_grab();
573 head = nl_pid_hashfn(hash, pid); 573 head = nl_portid_hashfn(hash, portid);
574 sk_for_each(osk, node, head) { 574 sk_for_each(osk, node, head) {
575 if (!net_eq(sock_net(osk), net)) 575 if (!net_eq(sock_net(osk), net))
576 continue; 576 continue;
577 if (nlk_sk(osk)->pid == pid) { 577 if (nlk_sk(osk)->portid == portid) {
578 /* Bind collision, search negative pid values. */ 578 /* Bind collision, search negative portid values. */
579 pid = rover--; 579 portid = rover--;
580 if (rover > -4097) 580 if (rover > -4097)
581 rover = -4097; 581 rover = -4097;
582 netlink_table_ungrab(); 582 netlink_table_ungrab();
@@ -585,7 +585,7 @@ retry:
585 } 585 }
586 netlink_table_ungrab(); 586 netlink_table_ungrab();
587 587
588 err = netlink_insert(sk, net, pid); 588 err = netlink_insert(sk, net, portid);
589 if (err == -EADDRINUSE) 589 if (err == -EADDRINUSE)
590 goto retry; 590 goto retry;
591 591
@@ -668,8 +668,8 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,
668 return err; 668 return err;
669 } 669 }
670 670
671 if (nlk->pid) { 671 if (nlk->portid) {
672 if (nladdr->nl_pid != nlk->pid) 672 if (nladdr->nl_pid != nlk->portid)
673 return -EINVAL; 673 return -EINVAL;
674 } else { 674 } else {
675 err = nladdr->nl_pid ? 675 err = nladdr->nl_pid ?
@@ -715,7 +715,7 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr,
715 715
716 if (addr->sa_family == AF_UNSPEC) { 716 if (addr->sa_family == AF_UNSPEC) {
717 sk->sk_state = NETLINK_UNCONNECTED; 717 sk->sk_state = NETLINK_UNCONNECTED;
718 nlk->dst_pid = 0; 718 nlk->dst_portid = 0;
719 nlk->dst_group = 0; 719 nlk->dst_group = 0;
720 return 0; 720 return 0;
721 } 721 }
@@ -726,12 +726,12 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr,
726 if (nladdr->nl_groups && !netlink_capable(sock, NL_CFG_F_NONROOT_SEND)) 726 if (nladdr->nl_groups && !netlink_capable(sock, NL_CFG_F_NONROOT_SEND))
727 return -EPERM; 727 return -EPERM;
728 728
729 if (!nlk->pid) 729 if (!nlk->portid)
730 err = netlink_autobind(sock); 730 err = netlink_autobind(sock);
731 731
732 if (err == 0) { 732 if (err == 0) {
733 sk->sk_state = NETLINK_CONNECTED; 733 sk->sk_state = NETLINK_CONNECTED;
734 nlk->dst_pid = nladdr->nl_pid; 734 nlk->dst_portid = nladdr->nl_pid;
735 nlk->dst_group = ffs(nladdr->nl_groups); 735 nlk->dst_group = ffs(nladdr->nl_groups);
736 } 736 }
737 737
@@ -750,10 +750,10 @@ static int netlink_getname(struct socket *sock, struct sockaddr *addr,
750 *addr_len = sizeof(*nladdr); 750 *addr_len = sizeof(*nladdr);
751 751
752 if (peer) { 752 if (peer) {
753 nladdr->nl_pid = nlk->dst_pid; 753 nladdr->nl_pid = nlk->dst_portid;
754 nladdr->nl_groups = netlink_group_mask(nlk->dst_group); 754 nladdr->nl_groups = netlink_group_mask(nlk->dst_group);
755 } else { 755 } else {
756 nladdr->nl_pid = nlk->pid; 756 nladdr->nl_pid = nlk->portid;
757 nladdr->nl_groups = nlk->groups ? nlk->groups[0] : 0; 757 nladdr->nl_groups = nlk->groups ? nlk->groups[0] : 0;
758 } 758 }
759 return 0; 759 return 0;
@@ -772,19 +772,19 @@ static void netlink_overrun(struct sock *sk)
772 atomic_inc(&sk->sk_drops); 772 atomic_inc(&sk->sk_drops);
773} 773}
774 774
775static struct sock *netlink_getsockbypid(struct sock *ssk, u32 pid) 775static struct sock *netlink_getsockbyportid(struct sock *ssk, u32 portid)
776{ 776{
777 struct sock *sock; 777 struct sock *sock;
778 struct netlink_sock *nlk; 778 struct netlink_sock *nlk;
779 779
780 sock = netlink_lookup(sock_net(ssk), ssk->sk_protocol, pid); 780 sock = netlink_lookup(sock_net(ssk), ssk->sk_protocol, portid);
781 if (!sock) 781 if (!sock)
782 return ERR_PTR(-ECONNREFUSED); 782 return ERR_PTR(-ECONNREFUSED);
783 783
784 /* Don't bother queuing skb if kernel socket has no input function */ 784 /* Don't bother queuing skb if kernel socket has no input function */
785 nlk = nlk_sk(sock); 785 nlk = nlk_sk(sock);
786 if (sock->sk_state == NETLINK_CONNECTED && 786 if (sock->sk_state == NETLINK_CONNECTED &&
787 nlk->dst_pid != nlk_sk(ssk)->pid) { 787 nlk->dst_portid != nlk_sk(ssk)->portid) {
788 sock_put(sock); 788 sock_put(sock);
789 return ERR_PTR(-ECONNREFUSED); 789 return ERR_PTR(-ECONNREFUSED);
790 } 790 }
@@ -935,7 +935,7 @@ static int netlink_unicast_kernel(struct sock *sk, struct sk_buff *skb,
935} 935}
936 936
937int netlink_unicast(struct sock *ssk, struct sk_buff *skb, 937int netlink_unicast(struct sock *ssk, struct sk_buff *skb,
938 u32 pid, int nonblock) 938 u32 portid, int nonblock)
939{ 939{
940 struct sock *sk; 940 struct sock *sk;
941 int err; 941 int err;
@@ -945,7 +945,7 @@ int netlink_unicast(struct sock *ssk, struct sk_buff *skb,
945 945
946 timeo = sock_sndtimeo(ssk, nonblock); 946 timeo = sock_sndtimeo(ssk, nonblock);
947retry: 947retry:
948 sk = netlink_getsockbypid(ssk, pid); 948 sk = netlink_getsockbyportid(ssk, portid);
949 if (IS_ERR(sk)) { 949 if (IS_ERR(sk)) {
950 kfree_skb(skb); 950 kfree_skb(skb);
951 return PTR_ERR(sk); 951 return PTR_ERR(sk);
@@ -1005,7 +1005,7 @@ static int netlink_broadcast_deliver(struct sock *sk, struct sk_buff *skb)
1005struct netlink_broadcast_data { 1005struct netlink_broadcast_data {
1006 struct sock *exclude_sk; 1006 struct sock *exclude_sk;
1007 struct net *net; 1007 struct net *net;
1008 u32 pid; 1008 u32 portid;
1009 u32 group; 1009 u32 group;
1010 int failure; 1010 int failure;
1011 int delivery_failure; 1011 int delivery_failure;
@@ -1026,7 +1026,7 @@ static int do_one_broadcast(struct sock *sk,
1026 if (p->exclude_sk == sk) 1026 if (p->exclude_sk == sk)
1027 goto out; 1027 goto out;
1028 1028
1029 if (nlk->pid == p->pid || p->group - 1 >= nlk->ngroups || 1029 if (nlk->portid == p->portid || p->group - 1 >= nlk->ngroups ||
1030 !test_bit(p->group - 1, nlk->groups)) 1030 !test_bit(p->group - 1, nlk->groups))
1031 goto out; 1031 goto out;
1032 1032
@@ -1078,7 +1078,7 @@ out:
1078 return 0; 1078 return 0;
1079} 1079}
1080 1080
1081int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb, u32 pid, 1081int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb, u32 portid,
1082 u32 group, gfp_t allocation, 1082 u32 group, gfp_t allocation,
1083 int (*filter)(struct sock *dsk, struct sk_buff *skb, void *data), 1083 int (*filter)(struct sock *dsk, struct sk_buff *skb, void *data),
1084 void *filter_data) 1084 void *filter_data)
@@ -1092,7 +1092,7 @@ int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb, u32 pid,
1092 1092
1093 info.exclude_sk = ssk; 1093 info.exclude_sk = ssk;
1094 info.net = net; 1094 info.net = net;
1095 info.pid = pid; 1095 info.portid = portid;
1096 info.group = group; 1096 info.group = group;
1097 info.failure = 0; 1097 info.failure = 0;
1098 info.delivery_failure = 0; 1098 info.delivery_failure = 0;
@@ -1130,17 +1130,17 @@ int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb, u32 pid,
1130} 1130}
1131EXPORT_SYMBOL(netlink_broadcast_filtered); 1131EXPORT_SYMBOL(netlink_broadcast_filtered);
1132 1132
1133int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, 1133int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 portid,
1134 u32 group, gfp_t allocation) 1134 u32 group, gfp_t allocation)
1135{ 1135{
1136 return netlink_broadcast_filtered(ssk, skb, pid, group, allocation, 1136 return netlink_broadcast_filtered(ssk, skb, portid, group, allocation,
1137 NULL, NULL); 1137 NULL, NULL);
1138} 1138}
1139EXPORT_SYMBOL(netlink_broadcast); 1139EXPORT_SYMBOL(netlink_broadcast);
1140 1140
1141struct netlink_set_err_data { 1141struct netlink_set_err_data {
1142 struct sock *exclude_sk; 1142 struct sock *exclude_sk;
1143 u32 pid; 1143 u32 portid;
1144 u32 group; 1144 u32 group;
1145 int code; 1145 int code;
1146}; 1146};
@@ -1156,7 +1156,7 @@ static int do_one_set_err(struct sock *sk, struct netlink_set_err_data *p)
1156 if (!net_eq(sock_net(sk), sock_net(p->exclude_sk))) 1156 if (!net_eq(sock_net(sk), sock_net(p->exclude_sk)))
1157 goto out; 1157 goto out;
1158 1158
1159 if (nlk->pid == p->pid || p->group - 1 >= nlk->ngroups || 1159 if (nlk->portid == p->portid || p->group - 1 >= nlk->ngroups ||
1160 !test_bit(p->group - 1, nlk->groups)) 1160 !test_bit(p->group - 1, nlk->groups))
1161 goto out; 1161 goto out;
1162 1162
@@ -1174,14 +1174,14 @@ out:
1174/** 1174/**
1175 * netlink_set_err - report error to broadcast listeners 1175 * netlink_set_err - report error to broadcast listeners
1176 * @ssk: the kernel netlink socket, as returned by netlink_kernel_create() 1176 * @ssk: the kernel netlink socket, as returned by netlink_kernel_create()
1177 * @pid: the PID of a process that we want to skip (if any) 1177 * @portid: the PORTID of a process that we want to skip (if any)
1178 * @groups: the broadcast group that will notice the error 1178 * @groups: the broadcast group that will notice the error
1179 * @code: error code, must be negative (as usual in kernelspace) 1179 * @code: error code, must be negative (as usual in kernelspace)
1180 * 1180 *
1181 * This function returns the number of broadcast listeners that have set the 1181 * This function returns the number of broadcast listeners that have set the
1182 * NETLINK_RECV_NO_ENOBUFS socket option. 1182 * NETLINK_RECV_NO_ENOBUFS socket option.
1183 */ 1183 */
1184int netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code) 1184int netlink_set_err(struct sock *ssk, u32 portid, u32 group, int code)
1185{ 1185{
1186 struct netlink_set_err_data info; 1186 struct netlink_set_err_data info;
1187 struct hlist_node *node; 1187 struct hlist_node *node;
@@ -1189,7 +1189,7 @@ int netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code)
1189 int ret = 0; 1189 int ret = 0;
1190 1190
1191 info.exclude_sk = ssk; 1191 info.exclude_sk = ssk;
1192 info.pid = pid; 1192 info.portid = portid;
1193 info.group = group; 1193 info.group = group;
1194 /* sk->sk_err wants a positive error value */ 1194 /* sk->sk_err wants a positive error value */
1195 info.code = -code; 1195 info.code = -code;
@@ -1354,7 +1354,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
1354 struct sock *sk = sock->sk; 1354 struct sock *sk = sock->sk;
1355 struct netlink_sock *nlk = nlk_sk(sk); 1355 struct netlink_sock *nlk = nlk_sk(sk);
1356 struct sockaddr_nl *addr = msg->msg_name; 1356 struct sockaddr_nl *addr = msg->msg_name;
1357 u32 dst_pid; 1357 u32 dst_portid;
1358 u32 dst_group; 1358 u32 dst_group;
1359 struct sk_buff *skb; 1359 struct sk_buff *skb;
1360 int err; 1360 int err;
@@ -1374,18 +1374,18 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
1374 err = -EINVAL; 1374 err = -EINVAL;
1375 if (addr->nl_family != AF_NETLINK) 1375 if (addr->nl_family != AF_NETLINK)
1376 goto out; 1376 goto out;
1377 dst_pid = addr->nl_pid; 1377 dst_portid = addr->nl_pid;
1378 dst_group = ffs(addr->nl_groups); 1378 dst_group = ffs(addr->nl_groups);
1379 err = -EPERM; 1379 err = -EPERM;
1380 if ((dst_group || dst_pid) && 1380 if ((dst_group || dst_portid) &&
1381 !netlink_capable(sock, NL_CFG_F_NONROOT_SEND)) 1381 !netlink_capable(sock, NL_CFG_F_NONROOT_SEND))
1382 goto out; 1382 goto out;
1383 } else { 1383 } else {
1384 dst_pid = nlk->dst_pid; 1384 dst_portid = nlk->dst_portid;
1385 dst_group = nlk->dst_group; 1385 dst_group = nlk->dst_group;
1386 } 1386 }
1387 1387
1388 if (!nlk->pid) { 1388 if (!nlk->portid) {
1389 err = netlink_autobind(sock); 1389 err = netlink_autobind(sock);
1390 if (err) 1390 if (err)
1391 goto out; 1391 goto out;
@@ -1399,7 +1399,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
1399 if (skb == NULL) 1399 if (skb == NULL)
1400 goto out; 1400 goto out;
1401 1401
1402 NETLINK_CB(skb).pid = nlk->pid; 1402 NETLINK_CB(skb).portid = nlk->portid;
1403 NETLINK_CB(skb).dst_group = dst_group; 1403 NETLINK_CB(skb).dst_group = dst_group;
1404 NETLINK_CB(skb).creds = siocb->scm->creds; 1404 NETLINK_CB(skb).creds = siocb->scm->creds;
1405 1405
@@ -1417,9 +1417,9 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
1417 1417
1418 if (dst_group) { 1418 if (dst_group) {
1419 atomic_inc(&skb->users); 1419 atomic_inc(&skb->users);
1420 netlink_broadcast(sk, skb, dst_pid, dst_group, GFP_KERNEL); 1420 netlink_broadcast(sk, skb, dst_portid, dst_group, GFP_KERNEL);
1421 } 1421 }
1422 err = netlink_unicast(sk, skb, dst_pid, msg->msg_flags&MSG_DONTWAIT); 1422 err = netlink_unicast(sk, skb, dst_portid, msg->msg_flags&MSG_DONTWAIT);
1423 1423
1424out: 1424out:
1425 scm_destroy(siocb->scm); 1425 scm_destroy(siocb->scm);
@@ -1482,7 +1482,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
1482 struct sockaddr_nl *addr = (struct sockaddr_nl *)msg->msg_name; 1482 struct sockaddr_nl *addr = (struct sockaddr_nl *)msg->msg_name;
1483 addr->nl_family = AF_NETLINK; 1483 addr->nl_family = AF_NETLINK;
1484 addr->nl_pad = 0; 1484 addr->nl_pad = 0;
1485 addr->nl_pid = NETLINK_CB(skb).pid; 1485 addr->nl_pid = NETLINK_CB(skb).portid;
1486 addr->nl_groups = netlink_group_mask(NETLINK_CB(skb).dst_group); 1486 addr->nl_groups = netlink_group_mask(NETLINK_CB(skb).dst_group);
1487 msg->msg_namelen = sizeof(*addr); 1487 msg->msg_namelen = sizeof(*addr);
1488 } 1488 }
@@ -1683,7 +1683,7 @@ void netlink_clear_multicast_users(struct sock *ksk, unsigned int group)
1683} 1683}
1684 1684
1685struct nlmsghdr * 1685struct nlmsghdr *
1686__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags) 1686__nlmsg_put(struct sk_buff *skb, u32 portid, u32 seq, int type, int len, int flags)
1687{ 1687{
1688 struct nlmsghdr *nlh; 1688 struct nlmsghdr *nlh;
1689 int size = NLMSG_LENGTH(len); 1689 int size = NLMSG_LENGTH(len);
@@ -1692,7 +1692,7 @@ __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
1692 nlh->nlmsg_type = type; 1692 nlh->nlmsg_type = type;
1693 nlh->nlmsg_len = size; 1693 nlh->nlmsg_len = size;
1694 nlh->nlmsg_flags = flags; 1694 nlh->nlmsg_flags = flags;
1695 nlh->nlmsg_pid = pid; 1695 nlh->nlmsg_pid = portid;
1696 nlh->nlmsg_seq = seq; 1696 nlh->nlmsg_seq = seq;
1697 if (!__builtin_constant_p(size) || NLMSG_ALIGN(size) - size != 0) 1697 if (!__builtin_constant_p(size) || NLMSG_ALIGN(size) - size != 0)
1698 memset(NLMSG_DATA(nlh) + len, 0, NLMSG_ALIGN(size) - size); 1698 memset(NLMSG_DATA(nlh) + len, 0, NLMSG_ALIGN(size) - size);
@@ -1788,7 +1788,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
1788 atomic_inc(&skb->users); 1788 atomic_inc(&skb->users);
1789 cb->skb = skb; 1789 cb->skb = skb;
1790 1790
1791 sk = netlink_lookup(sock_net(ssk), ssk->sk_protocol, NETLINK_CB(skb).pid); 1791 sk = netlink_lookup(sock_net(ssk), ssk->sk_protocol, NETLINK_CB(skb).portid);
1792 if (sk == NULL) { 1792 if (sk == NULL) {
1793 netlink_destroy_callback(cb); 1793 netlink_destroy_callback(cb);
1794 return -ECONNREFUSED; 1794 return -ECONNREFUSED;
@@ -1836,7 +1836,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
1836 1836
1837 sk = netlink_lookup(sock_net(in_skb->sk), 1837 sk = netlink_lookup(sock_net(in_skb->sk),
1838 in_skb->sk->sk_protocol, 1838 in_skb->sk->sk_protocol,
1839 NETLINK_CB(in_skb).pid); 1839 NETLINK_CB(in_skb).portid);
1840 if (sk) { 1840 if (sk) {
1841 sk->sk_err = ENOBUFS; 1841 sk->sk_err = ENOBUFS;
1842 sk->sk_error_report(sk); 1842 sk->sk_error_report(sk);
@@ -1845,12 +1845,12 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err)
1845 return; 1845 return;
1846 } 1846 }
1847 1847
1848 rep = __nlmsg_put(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, 1848 rep = __nlmsg_put(skb, NETLINK_CB(in_skb).portid, nlh->nlmsg_seq,
1849 NLMSG_ERROR, payload, 0); 1849 NLMSG_ERROR, payload, 0);
1850 errmsg = nlmsg_data(rep); 1850 errmsg = nlmsg_data(rep);
1851 errmsg->error = err; 1851 errmsg->error = err;
1852 memcpy(&errmsg->msg, nlh, err ? nlh->nlmsg_len : sizeof(*nlh)); 1852 memcpy(&errmsg->msg, nlh, err ? nlh->nlmsg_len : sizeof(*nlh));
1853 netlink_unicast(in_skb->sk, skb, NETLINK_CB(in_skb).pid, MSG_DONTWAIT); 1853 netlink_unicast(in_skb->sk, skb, NETLINK_CB(in_skb).portid, MSG_DONTWAIT);
1854} 1854}
1855EXPORT_SYMBOL(netlink_ack); 1855EXPORT_SYMBOL(netlink_ack);
1856 1856
@@ -1900,33 +1900,33 @@ EXPORT_SYMBOL(netlink_rcv_skb);
1900 * nlmsg_notify - send a notification netlink message 1900 * nlmsg_notify - send a notification netlink message
1901 * @sk: netlink socket to use 1901 * @sk: netlink socket to use
1902 * @skb: notification message 1902 * @skb: notification message
1903 * @pid: destination netlink pid for reports or 0 1903 * @portid: destination netlink portid for reports or 0
1904 * @group: destination multicast group or 0 1904 * @group: destination multicast group or 0
1905 * @report: 1 to report back, 0 to disable 1905 * @report: 1 to report back, 0 to disable
1906 * @flags: allocation flags 1906 * @flags: allocation flags
1907 */ 1907 */
1908int nlmsg_notify(struct sock *sk, struct sk_buff *skb, u32 pid, 1908int nlmsg_notify(struct sock *sk, struct sk_buff *skb, u32 portid,
1909 unsigned int group, int report, gfp_t flags) 1909 unsigned int group, int report, gfp_t flags)
1910{ 1910{
1911 int err = 0; 1911 int err = 0;
1912 1912
1913 if (group) { 1913 if (group) {
1914 int exclude_pid = 0; 1914 int exclude_portid = 0;
1915 1915
1916 if (report) { 1916 if (report) {
1917 atomic_inc(&skb->users); 1917 atomic_inc(&skb->users);
1918 exclude_pid = pid; 1918 exclude_portid = portid;
1919 } 1919 }
1920 1920
1921 /* errors reported via destination sk->sk_err, but propagate 1921 /* errors reported via destination sk->sk_err, but propagate
1922 * delivery errors if NETLINK_BROADCAST_ERROR flag is set */ 1922 * delivery errors if NETLINK_BROADCAST_ERROR flag is set */
1923 err = nlmsg_multicast(sk, skb, exclude_pid, group, flags); 1923 err = nlmsg_multicast(sk, skb, exclude_portid, group, flags);
1924 } 1924 }
1925 1925
1926 if (report) { 1926 if (report) {
1927 int err2; 1927 int err2;
1928 1928
1929 err2 = nlmsg_unicast(sk, skb, pid); 1929 err2 = nlmsg_unicast(sk, skb, portid);
1930 if (!err || err == -ESRCH) 1930 if (!err || err == -ESRCH)
1931 err = err2; 1931 err = err2;
1932 } 1932 }
@@ -1951,7 +1951,7 @@ static struct sock *netlink_seq_socket_idx(struct seq_file *seq, loff_t pos)
1951 loff_t off = 0; 1951 loff_t off = 0;
1952 1952
1953 for (i = 0; i < MAX_LINKS; i++) { 1953 for (i = 0; i < MAX_LINKS; i++) {
1954 struct nl_pid_hash *hash = &nl_table[i].hash; 1954 struct nl_portid_hash *hash = &nl_table[i].hash;
1955 1955
1956 for (j = 0; j <= hash->mask; j++) { 1956 for (j = 0; j <= hash->mask; j++) {
1957 sk_for_each(s, node, &hash->table[j]) { 1957 sk_for_each(s, node, &hash->table[j]) {
@@ -1999,7 +1999,7 @@ static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1999 j = iter->hash_idx + 1; 1999 j = iter->hash_idx + 1;
2000 2000
2001 do { 2001 do {
2002 struct nl_pid_hash *hash = &nl_table[i].hash; 2002 struct nl_portid_hash *hash = &nl_table[i].hash;
2003 2003
2004 for (; j <= hash->mask; j++) { 2004 for (; j <= hash->mask; j++) {
2005 s = sk_head(&hash->table[j]); 2005 s = sk_head(&hash->table[j]);
@@ -2038,7 +2038,7 @@ static int netlink_seq_show(struct seq_file *seq, void *v)
2038 seq_printf(seq, "%pK %-3d %-6d %08x %-8d %-8d %pK %-8d %-8d %-8lu\n", 2038 seq_printf(seq, "%pK %-3d %-6d %08x %-8d %-8d %pK %-8d %-8d %-8lu\n",
2039 s, 2039 s,
2040 s->sk_protocol, 2040 s->sk_protocol,
2041 nlk->pid, 2041 nlk->portid,
2042 nlk->groups ? (u32)nlk->groups[0] : 0, 2042 nlk->groups ? (u32)nlk->groups[0] : 0,
2043 sk_rmem_alloc_get(s), 2043 sk_rmem_alloc_get(s),
2044 sk_wmem_alloc_get(s), 2044 sk_wmem_alloc_get(s),
@@ -2183,12 +2183,12 @@ static int __init netlink_proto_init(void)
2183 order = get_bitmask_order(min(limit, (unsigned long)UINT_MAX)) - 1; 2183 order = get_bitmask_order(min(limit, (unsigned long)UINT_MAX)) - 1;
2184 2184
2185 for (i = 0; i < MAX_LINKS; i++) { 2185 for (i = 0; i < MAX_LINKS; i++) {
2186 struct nl_pid_hash *hash = &nl_table[i].hash; 2186 struct nl_portid_hash *hash = &nl_table[i].hash;
2187 2187
2188 hash->table = nl_pid_hash_zalloc(1 * sizeof(*hash->table)); 2188 hash->table = nl_portid_hash_zalloc(1 * sizeof(*hash->table));
2189 if (!hash->table) { 2189 if (!hash->table) {
2190 while (i-- > 0) 2190 while (i-- > 0)
2191 nl_pid_hash_free(nl_table[i].hash.table, 2191 nl_portid_hash_free(nl_table[i].hash.table,
2192 1 * sizeof(*hash->table)); 2192 1 * sizeof(*hash->table));
2193 kfree(nl_table); 2193 kfree(nl_table);
2194 goto panic; 2194 goto panic;