Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ping.c
Go to the documentation of this file.
1 /*
2  * INET An implementation of the TCP/IP protocol suite for the LINUX
3  * operating system. INET is implemented using the BSD Socket
4  * interface as the means of communication with the user level.
5  *
6  * "Ping" sockets
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version
11  * 2 of the License, or (at your option) any later version.
12  *
13  * Based on ipv4/udp.c code.
14  *
15  * Authors: Vasiliy Kulikov / Openwall (for Linux 2.6),
16  * Pavel Kankovsky (for Linux 2.4.32)
17  *
18  * Pavel gave all rights to bugs to Vasiliy,
19  * none of the bugs are Pavel's now.
20  *
21  */
22 
23 #include <linux/uaccess.h>
24 #include <linux/types.h>
25 #include <linux/fcntl.h>
26 #include <linux/socket.h>
27 #include <linux/sockios.h>
28 #include <linux/in.h>
29 #include <linux/errno.h>
30 #include <linux/timer.h>
31 #include <linux/mm.h>
32 #include <linux/inet.h>
33 #include <linux/netdevice.h>
34 #include <net/snmp.h>
35 #include <net/ip.h>
36 #include <net/ipv6.h>
37 #include <net/icmp.h>
38 #include <net/protocol.h>
39 #include <linux/skbuff.h>
40 #include <linux/proc_fs.h>
41 #include <linux/export.h>
42 #include <net/sock.h>
43 #include <net/ping.h>
44 #include <net/udp.h>
45 #include <net/route.h>
46 #include <net/inet_common.h>
47 #include <net/checksum.h>
48 
49 
50 static struct ping_table ping_table;
51 
52 static u16 ping_port_rover;
53 
54 static inline int ping_hashfn(struct net *net, unsigned int num, unsigned int mask)
55 {
56  int res = (num + net_hash_mix(net)) & mask;
57 
58  pr_debug("hash(%d) = %d\n", num, res);
59  return res;
60 }
61 
62 static inline struct hlist_nulls_head *ping_hashslot(struct ping_table *table,
63  struct net *net, unsigned int num)
64 {
65  return &table->hash[ping_hashfn(net, num, PING_HTABLE_MASK)];
66 }
67 
68 static int ping_v4_get_port(struct sock *sk, unsigned short ident)
69 {
70  struct hlist_nulls_node *node;
71  struct hlist_nulls_head *hlist;
72  struct inet_sock *isk, *isk2;
73  struct sock *sk2 = NULL;
74 
75  isk = inet_sk(sk);
77  if (ident == 0) {
78  u32 i;
79  u16 result = ping_port_rover + 1;
80 
81  for (i = 0; i < (1L << 16); i++, result++) {
82  if (!result)
83  result++; /* avoid zero */
84  hlist = ping_hashslot(&ping_table, sock_net(sk),
85  result);
86  ping_portaddr_for_each_entry(sk2, node, hlist) {
87  isk2 = inet_sk(sk2);
88 
89  if (isk2->inet_num == result)
90  goto next_port;
91  }
92 
93  /* found */
94  ping_port_rover = ident = result;
95  break;
96 next_port:
97  ;
98  }
99  if (i >= (1L << 16))
100  goto fail;
101  } else {
102  hlist = ping_hashslot(&ping_table, sock_net(sk), ident);
103  ping_portaddr_for_each_entry(sk2, node, hlist) {
104  isk2 = inet_sk(sk2);
105 
106  if ((isk2->inet_num == ident) &&
107  (sk2 != sk) &&
108  (!sk2->sk_reuse || !sk->sk_reuse))
109  goto fail;
110  }
111  }
112 
113  pr_debug("found port/ident = %d\n", ident);
114  isk->inet_num = ident;
115  if (sk_unhashed(sk)) {
116  pr_debug("was not hashed\n");
117  sock_hold(sk);
118  hlist_nulls_add_head(&sk->sk_nulls_node, hlist);
119  sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
120  }
122  return 0;
123 
124 fail:
126  return 1;
127 }
128 
129 static void ping_v4_hash(struct sock *sk)
130 {
131  pr_debug("ping_v4_hash(sk->port=%u)\n", inet_sk(sk)->inet_num);
132  BUG(); /* "Please do not press this button again." */
133 }
134 
135 static void ping_v4_unhash(struct sock *sk)
136 {
137  struct inet_sock *isk = inet_sk(sk);
138  pr_debug("ping_v4_unhash(isk=%p,isk->num=%u)\n", isk, isk->inet_num);
139  if (sk_hashed(sk)) {
141  hlist_nulls_del(&sk->sk_nulls_node);
142  sock_put(sk);
143  isk->inet_num = 0;
144  isk->inet_sport = 0;
145  sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
147  }
148 }
149 
150 static struct sock *ping_v4_lookup(struct net *net, __be32 saddr, __be32 daddr,
151  u16 ident, int dif)
152 {
153  struct hlist_nulls_head *hslot = ping_hashslot(&ping_table, net, ident);
154  struct sock *sk = NULL;
155  struct inet_sock *isk;
156  struct hlist_nulls_node *hnode;
157 
158  pr_debug("try to find: num = %d, daddr = %pI4, dif = %d\n",
159  (int)ident, &daddr, dif);
161 
162  ping_portaddr_for_each_entry(sk, hnode, hslot) {
163  isk = inet_sk(sk);
164 
165  pr_debug("found: %p: num = %d, daddr = %pI4, dif = %d\n", sk,
166  (int)isk->inet_num, &isk->inet_rcv_saddr,
167  sk->sk_bound_dev_if);
168 
169  pr_debug("iterate\n");
170  if (isk->inet_num != ident)
171  continue;
172  if (isk->inet_rcv_saddr && isk->inet_rcv_saddr != daddr)
173  continue;
174  if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif)
175  continue;
176 
177  sock_hold(sk);
178  goto exit;
179  }
180 
181  sk = NULL;
182 exit:
184 
185  return sk;
186 }
187 
188 static void inet_get_ping_group_range_net(struct net *net, kgid_t *low,
189  kgid_t *high)
190 {
191  kgid_t *data = net->ipv4.sysctl_ping_group_range;
192  unsigned int seq;
193 
194  do {
195  seq = read_seqbegin(&sysctl_local_ports.lock);
196 
197  *low = data[0];
198  *high = data[1];
199  } while (read_seqretry(&sysctl_local_ports.lock, seq));
200 }
201 
202 
203 static int ping_init_sock(struct sock *sk)
204 {
205  struct net *net = sock_net(sk);
208  int i, j, count = group_info->ngroups;
209  kgid_t low, high;
210 
211  inet_get_ping_group_range_net(net, &low, &high);
212  if (gid_lte(low, group) && gid_lte(group, high))
213  return 0;
214 
215  for (i = 0; i < group_info->nblocks; i++) {
216  int cp_count = min_t(int, NGROUPS_PER_BLOCK, count);
217  for (j = 0; j < cp_count; j++) {
218  kgid_t gid = group_info->blocks[i][j];
219  if (gid_lte(low, gid) && gid_lte(gid, high))
220  return 0;
221  }
222 
223  count -= cp_count;
224  }
225 
226  return -EACCES;
227 }
228 
229 static void ping_close(struct sock *sk, long timeout)
230 {
231  pr_debug("ping_close(sk=%p,sk->num=%u)\n",
232  inet_sk(sk), inet_sk(sk)->inet_num);
233  pr_debug("isk->refcnt = %d\n", sk->sk_refcnt.counter);
234 
235  sk_common_release(sk);
236 }
237 
238 /*
239  * We need our own bind because there are no privileged id's == local ports.
240  * Moreover, we don't allow binding to multi- and broadcast addresses.
241  */
242 
243 static int ping_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
244 {
245  struct sockaddr_in *addr = (struct sockaddr_in *)uaddr;
246  struct inet_sock *isk = inet_sk(sk);
247  unsigned short snum;
248  int chk_addr_ret;
249  int err;
250 
251  if (addr_len < sizeof(struct sockaddr_in))
252  return -EINVAL;
253 
254  pr_debug("ping_v4_bind(sk=%p,sa_addr=%08x,sa_port=%d)\n",
255  sk, addr->sin_addr.s_addr, ntohs(addr->sin_port));
256 
257  chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr);
258  if (addr->sin_addr.s_addr == htonl(INADDR_ANY))
259  chk_addr_ret = RTN_LOCAL;
260 
261  if ((sysctl_ip_nonlocal_bind == 0 &&
262  isk->freebind == 0 && isk->transparent == 0 &&
263  chk_addr_ret != RTN_LOCAL) ||
264  chk_addr_ret == RTN_MULTICAST ||
265  chk_addr_ret == RTN_BROADCAST)
266  return -EADDRNOTAVAIL;
267 
268  lock_sock(sk);
269 
270  err = -EINVAL;
271  if (isk->inet_num != 0)
272  goto out;
273 
274  err = -EADDRINUSE;
275  isk->inet_rcv_saddr = isk->inet_saddr = addr->sin_addr.s_addr;
276  snum = ntohs(addr->sin_port);
277  if (ping_v4_get_port(sk, snum) != 0) {
278  isk->inet_saddr = isk->inet_rcv_saddr = 0;
279  goto out;
280  }
281 
282  pr_debug("after bind(): num = %d, daddr = %pI4, dif = %d\n",
283  (int)isk->inet_num,
284  &isk->inet_rcv_saddr,
285  (int)sk->sk_bound_dev_if);
286 
287  err = 0;
288  if (isk->inet_rcv_saddr)
290  if (snum)
292  isk->inet_sport = htons(isk->inet_num);
293  isk->inet_daddr = 0;
294  isk->inet_dport = 0;
295  sk_dst_reset(sk);
296 out:
297  release_sock(sk);
298  pr_debug("ping_v4_bind -> %d\n", err);
299  return err;
300 }
301 
302 /*
303  * Is this a supported type of ICMP message?
304  */
305 
306 static inline int ping_supported(int type, int code)
307 {
308  if (type == ICMP_ECHO && code == 0)
309  return 1;
310  return 0;
311 }
312 
313 /*
314  * This routine is called by the ICMP module when it gets some
315  * sort of error condition.
316  */
317 
318 static int ping_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
319 
320 void ping_err(struct sk_buff *skb, u32 info)
321 {
322  struct iphdr *iph = (struct iphdr *)skb->data;
323  struct icmphdr *icmph = (struct icmphdr *)(skb->data+(iph->ihl<<2));
324  struct inet_sock *inet_sock;
325  int type = icmph->type;
326  int code = icmph->code;
327  struct net *net = dev_net(skb->dev);
328  struct sock *sk;
329  int harderr;
330  int err;
331 
332  /* We assume the packet has already been checked by icmp_unreach */
333 
334  if (!ping_supported(icmph->type, icmph->code))
335  return;
336 
337  pr_debug("ping_err(type=%04x,code=%04x,id=%04x,seq=%04x)\n", type,
338  code, ntohs(icmph->un.echo.id), ntohs(icmph->un.echo.sequence));
339 
340  sk = ping_v4_lookup(net, iph->daddr, iph->saddr,
341  ntohs(icmph->un.echo.id), skb->dev->ifindex);
342  if (sk == NULL) {
343  pr_debug("no socket, dropping\n");
344  return; /* No socket for error */
345  }
346  pr_debug("err on socket %p\n", sk);
347 
348  err = 0;
349  harderr = 0;
350  inet_sock = inet_sk(sk);
351 
352  switch (type) {
353  default:
354  case ICMP_TIME_EXCEEDED:
355  err = EHOSTUNREACH;
356  break;
357  case ICMP_SOURCE_QUENCH:
358  /* This is not a real error but ping wants to see it.
359  * Report it with some fake errno. */
360  err = EREMOTEIO;
361  break;
362  case ICMP_PARAMETERPROB:
363  err = EPROTO;
364  harderr = 1;
365  break;
366  case ICMP_DEST_UNREACH:
367  if (code == ICMP_FRAG_NEEDED) { /* Path MTU discovery */
368  ipv4_sk_update_pmtu(skb, sk, info);
369  if (inet_sock->pmtudisc != IP_PMTUDISC_DONT) {
370  err = EMSGSIZE;
371  harderr = 1;
372  break;
373  }
374  goto out;
375  }
376  err = EHOSTUNREACH;
377  if (code <= NR_ICMP_UNREACH) {
378  harderr = icmp_err_convert[code].fatal;
379  err = icmp_err_convert[code].errno;
380  }
381  break;
382  case ICMP_REDIRECT:
383  /* See ICMP_SOURCE_QUENCH */
384  ipv4_sk_redirect(skb, sk);
385  err = EREMOTEIO;
386  break;
387  }
388 
389  /*
390  * RFC1122: OK. Passes ICMP errors back to application, as per
391  * 4.1.3.3.
392  */
393  if (!inet_sock->recverr) {
394  if (!harderr || sk->sk_state != TCP_ESTABLISHED)
395  goto out;
396  } else {
397  ip_icmp_error(sk, skb, err, 0 /* no remote port */,
398  info, (u8 *)icmph);
399  }
400  sk->sk_err = err;
401  sk->sk_error_report(sk);
402 out:
403  sock_put(sk);
404 }
405 
406 /*
407  * Copy and checksum an ICMP Echo packet from user space into a buffer.
408  */
409 
410 struct pingfakehdr {
411  struct icmphdr icmph;
412  struct iovec *iov;
414 };
415 
416 static int ping_getfrag(void *from, char *to,
417  int offset, int fraglen, int odd, struct sk_buff *skb)
418 {
419  struct pingfakehdr *pfh = (struct pingfakehdr *)from;
420 
421  if (offset == 0) {
422  if (fraglen < sizeof(struct icmphdr))
423  BUG();
424  if (csum_partial_copy_fromiovecend(to + sizeof(struct icmphdr),
425  pfh->iov, 0, fraglen - sizeof(struct icmphdr),
426  &pfh->wcheck))
427  return -EFAULT;
428 
429  return 0;
430  }
431  if (offset < sizeof(struct icmphdr))
432  BUG();
434  (to, pfh->iov, offset - sizeof(struct icmphdr),
435  fraglen, &pfh->wcheck))
436  return -EFAULT;
437  return 0;
438 }
439 
440 static int ping_push_pending_frames(struct sock *sk, struct pingfakehdr *pfh,
441  struct flowi4 *fl4)
442 {
443  struct sk_buff *skb = skb_peek(&sk->sk_write_queue);
444 
445  pfh->wcheck = csum_partial((char *)&pfh->icmph,
446  sizeof(struct icmphdr), pfh->wcheck);
447  pfh->icmph.checksum = csum_fold(pfh->wcheck);
448  memcpy(icmp_hdr(skb), &pfh->icmph, sizeof(struct icmphdr));
449  skb->ip_summed = CHECKSUM_NONE;
450  return ip_push_pending_frames(sk, fl4);
451 }
452 
453 static int ping_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
454  size_t len)
455 {
456  struct net *net = sock_net(sk);
457  struct flowi4 fl4;
458  struct inet_sock *inet = inet_sk(sk);
459  struct ipcm_cookie ipc;
460  struct icmphdr user_icmph;
461  struct pingfakehdr pfh;
462  struct rtable *rt = NULL;
463  struct ip_options_data opt_copy;
464  int free = 0;
466  u8 tos;
467  int err;
468 
469  pr_debug("ping_sendmsg(sk=%p,sk->num=%u)\n", inet, inet->inet_num);
470 
471 
472  if (len > 0xFFFF)
473  return -EMSGSIZE;
474 
475  /*
476  * Check the flags.
477  */
478 
479  /* Mirror BSD error message compatibility */
480  if (msg->msg_flags & MSG_OOB)
481  return -EOPNOTSUPP;
482 
483  /*
484  * Fetch the ICMP header provided by the userland.
485  * iovec is modified!
486  */
487 
488  if (memcpy_fromiovec((u8 *)&user_icmph, msg->msg_iov,
489  sizeof(struct icmphdr)))
490  return -EFAULT;
491  if (!ping_supported(user_icmph.type, user_icmph.code))
492  return -EINVAL;
493 
494  /*
495  * Get and verify the address.
496  */
497 
498  if (msg->msg_name) {
499  struct sockaddr_in *usin = (struct sockaddr_in *)msg->msg_name;
500  if (msg->msg_namelen < sizeof(*usin))
501  return -EINVAL;
502  if (usin->sin_family != AF_INET)
503  return -EINVAL;
504  daddr = usin->sin_addr.s_addr;
505  /* no remote port */
506  } else {
507  if (sk->sk_state != TCP_ESTABLISHED)
508  return -EDESTADDRREQ;
509  daddr = inet->inet_daddr;
510  /* no remote port */
511  }
512 
513  ipc.addr = inet->inet_saddr;
514  ipc.opt = NULL;
515  ipc.oif = sk->sk_bound_dev_if;
516  ipc.tx_flags = 0;
517  err = sock_tx_timestamp(sk, &ipc.tx_flags);
518  if (err)
519  return err;
520 
521  if (msg->msg_controllen) {
522  err = ip_cmsg_send(sock_net(sk), msg, &ipc);
523  if (err)
524  return err;
525  if (ipc.opt)
526  free = 1;
527  }
528  if (!ipc.opt) {
529  struct ip_options_rcu *inet_opt;
530 
531  rcu_read_lock();
532  inet_opt = rcu_dereference(inet->inet_opt);
533  if (inet_opt) {
534  memcpy(&opt_copy, inet_opt,
535  sizeof(*inet_opt) + inet_opt->opt.optlen);
536  ipc.opt = &opt_copy.opt;
537  }
538  rcu_read_unlock();
539  }
540 
541  saddr = ipc.addr;
542  ipc.addr = faddr = daddr;
543 
544  if (ipc.opt && ipc.opt->opt.srr) {
545  if (!daddr)
546  return -EINVAL;
547  faddr = ipc.opt->opt.faddr;
548  }
549  tos = RT_TOS(inet->tos);
550  if (sock_flag(sk, SOCK_LOCALROUTE) ||
551  (msg->msg_flags & MSG_DONTROUTE) ||
552  (ipc.opt && ipc.opt->opt.is_strictroute)) {
553  tos |= RTO_ONLINK;
554  }
555 
556  if (ipv4_is_multicast(daddr)) {
557  if (!ipc.oif)
558  ipc.oif = inet->mc_index;
559  if (!saddr)
560  saddr = inet->mc_addr;
561  } else if (!ipc.oif)
562  ipc.oif = inet->uc_index;
563 
564  flowi4_init_output(&fl4, ipc.oif, sk->sk_mark, tos,
566  inet_sk_flowi_flags(sk), faddr, saddr, 0, 0);
567 
568  security_sk_classify_flow(sk, flowi4_to_flowi(&fl4));
569  rt = ip_route_output_flow(net, &fl4, sk);
570  if (IS_ERR(rt)) {
571  err = PTR_ERR(rt);
572  rt = NULL;
573  if (err == -ENETUNREACH)
575  goto out;
576  }
577 
578  err = -EACCES;
579  if ((rt->rt_flags & RTCF_BROADCAST) &&
580  !sock_flag(sk, SOCK_BROADCAST))
581  goto out;
582 
583  if (msg->msg_flags & MSG_CONFIRM)
584  goto do_confirm;
585 back_from_confirm:
586 
587  if (!ipc.addr)
588  ipc.addr = fl4.daddr;
589 
590  lock_sock(sk);
591 
592  pfh.icmph.type = user_icmph.type; /* already checked */
593  pfh.icmph.code = user_icmph.code; /* ditto */
594  pfh.icmph.checksum = 0;
595  pfh.icmph.un.echo.id = inet->inet_sport;
596  pfh.icmph.un.echo.sequence = user_icmph.un.echo.sequence;
597  pfh.iov = msg->msg_iov;
598  pfh.wcheck = 0;
599 
600  err = ip_append_data(sk, &fl4, ping_getfrag, &pfh, len,
601  0, &ipc, &rt, msg->msg_flags);
602  if (err)
604  else
605  err = ping_push_pending_frames(sk, &pfh, &fl4);
606  release_sock(sk);
607 
608 out:
609  ip_rt_put(rt);
610  if (free)
611  kfree(ipc.opt);
612  if (!err) {
613  icmp_out_count(sock_net(sk), user_icmph.type);
614  return len;
615  }
616  return err;
617 
618 do_confirm:
619  dst_confirm(&rt->dst);
620  if (!(msg->msg_flags & MSG_PROBE) || len)
621  goto back_from_confirm;
622  err = 0;
623  goto out;
624 }
625 
626 static int ping_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
627  size_t len, int noblock, int flags, int *addr_len)
628 {
629  struct inet_sock *isk = inet_sk(sk);
630  struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
631  struct sk_buff *skb;
632  int copied, err;
633 
634  pr_debug("ping_recvmsg(sk=%p,sk->num=%u)\n", isk, isk->inet_num);
635 
636  err = -EOPNOTSUPP;
637  if (flags & MSG_OOB)
638  goto out;
639 
640  if (addr_len)
641  *addr_len = sizeof(*sin);
642 
643  if (flags & MSG_ERRQUEUE)
644  return ip_recv_error(sk, msg, len);
645 
646  skb = skb_recv_datagram(sk, flags, noblock, &err);
647  if (!skb)
648  goto out;
649 
650  copied = skb->len;
651  if (copied > len) {
652  msg->msg_flags |= MSG_TRUNC;
653  copied = len;
654  }
655 
656  /* Don't bother checking the checksum */
657  err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
658  if (err)
659  goto done;
660 
661  sock_recv_timestamp(msg, sk, skb);
662 
663  /* Copy the address. */
664  if (sin) {
665  sin->sin_family = AF_INET;
666  sin->sin_port = 0 /* skb->h.uh->source */;
667  sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
668  memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
669  }
670  if (isk->cmsg_flags)
671  ip_cmsg_recv(msg, skb);
672  err = copied;
673 
674 done:
675  skb_free_datagram(sk, skb);
676 out:
677  pr_debug("ping_recvmsg -> %d\n", err);
678  return err;
679 }
680 
681 static int ping_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
682 {
683  pr_debug("ping_queue_rcv_skb(sk=%p,sk->num=%d,skb=%p)\n",
684  inet_sk(sk), inet_sk(sk)->inet_num, skb);
685  if (sock_queue_rcv_skb(sk, skb) < 0) {
686  kfree_skb(skb);
687  pr_debug("ping_queue_rcv_skb -> failed\n");
688  return -1;
689  }
690  return 0;
691 }
692 
693 
694 /*
695  * All we need to do is get the socket.
696  */
697 
698 void ping_rcv(struct sk_buff *skb)
699 {
700  struct sock *sk;
701  struct net *net = dev_net(skb->dev);
702  struct iphdr *iph = ip_hdr(skb);
703  struct icmphdr *icmph = icmp_hdr(skb);
704  __be32 saddr = iph->saddr;
705  __be32 daddr = iph->daddr;
706 
707  /* We assume the packet has already been checked by icmp_rcv */
708 
709  pr_debug("ping_rcv(skb=%p,id=%04x,seq=%04x)\n",
710  skb, ntohs(icmph->un.echo.id), ntohs(icmph->un.echo.sequence));
711 
712  /* Push ICMP header back */
713  skb_push(skb, skb->data - (u8 *)icmph);
714 
715  sk = ping_v4_lookup(net, saddr, daddr, ntohs(icmph->un.echo.id),
716  skb->dev->ifindex);
717  if (sk != NULL) {
718  pr_debug("rcv on socket %p\n", sk);
719  ping_queue_rcv_skb(sk, skb_get(skb));
720  sock_put(sk);
721  return;
722  }
723  pr_debug("no socket, dropping\n");
724 
725  /* We're called from icmp_rcv(). kfree_skb() is done there. */
726 }
727 
728 struct proto ping_prot = {
729  .name = "PING",
730  .owner = THIS_MODULE,
731  .init = ping_init_sock,
732  .close = ping_close,
733  .connect = ip4_datagram_connect,
734  .disconnect = udp_disconnect,
735  .setsockopt = ip_setsockopt,
736  .getsockopt = ip_getsockopt,
737  .sendmsg = ping_sendmsg,
738  .recvmsg = ping_recvmsg,
739  .bind = ping_bind,
740  .backlog_rcv = ping_queue_rcv_skb,
741  .hash = ping_v4_hash,
742  .unhash = ping_v4_unhash,
743  .get_port = ping_v4_get_port,
744  .obj_size = sizeof(struct inet_sock),
745 };
746 EXPORT_SYMBOL(ping_prot);
747 
748 #ifdef CONFIG_PROC_FS
749 
750 static struct sock *ping_get_first(struct seq_file *seq, int start)
751 {
752  struct sock *sk;
753  struct ping_iter_state *state = seq->private;
754  struct net *net = seq_file_net(seq);
755 
756  for (state->bucket = start; state->bucket < PING_HTABLE_SIZE;
757  ++state->bucket) {
758  struct hlist_nulls_node *node;
759  struct hlist_nulls_head *hslot;
760 
761  hslot = &ping_table.hash[state->bucket];
762 
763  if (hlist_nulls_empty(hslot))
764  continue;
765 
766  sk_nulls_for_each(sk, node, hslot) {
767  if (net_eq(sock_net(sk), net))
768  goto found;
769  }
770  }
771  sk = NULL;
772 found:
773  return sk;
774 }
775 
776 static struct sock *ping_get_next(struct seq_file *seq, struct sock *sk)
777 {
778  struct ping_iter_state *state = seq->private;
779  struct net *net = seq_file_net(seq);
780 
781  do {
782  sk = sk_nulls_next(sk);
783  } while (sk && (!net_eq(sock_net(sk), net)));
784 
785  if (!sk)
786  return ping_get_first(seq, state->bucket + 1);
787  return sk;
788 }
789 
790 static struct sock *ping_get_idx(struct seq_file *seq, loff_t pos)
791 {
792  struct sock *sk = ping_get_first(seq, 0);
793 
794  if (sk)
795  while (pos && (sk = ping_get_next(seq, sk)) != NULL)
796  --pos;
797  return pos ? NULL : sk;
798 }
799 
800 static void *ping_seq_start(struct seq_file *seq, loff_t *pos)
801 {
802  struct ping_iter_state *state = seq->private;
803  state->bucket = 0;
804 
806 
807  return *pos ? ping_get_idx(seq, *pos-1) : SEQ_START_TOKEN;
808 }
809 
810 static void *ping_seq_next(struct seq_file *seq, void *v, loff_t *pos)
811 {
812  struct sock *sk;
813 
814  if (v == SEQ_START_TOKEN)
815  sk = ping_get_idx(seq, 0);
816  else
817  sk = ping_get_next(seq, v);
818 
819  ++*pos;
820  return sk;
821 }
822 
823 static void ping_seq_stop(struct seq_file *seq, void *v)
824 {
826 }
827 
828 static void ping_format_sock(struct sock *sp, struct seq_file *f,
829  int bucket, int *len)
830 {
831  struct inet_sock *inet = inet_sk(sp);
832  __be32 dest = inet->inet_daddr;
833  __be32 src = inet->inet_rcv_saddr;
834  __u16 destp = ntohs(inet->inet_dport);
835  __u16 srcp = ntohs(inet->inet_sport);
836 
837  seq_printf(f, "%5d: %08X:%04X %08X:%04X"
838  " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %pK %d%n",
839  bucket, src, srcp, dest, destp, sp->sk_state,
840  sk_wmem_alloc_get(sp),
841  sk_rmem_alloc_get(sp),
842  0, 0L, 0,
843  from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)),
844  0, sock_i_ino(sp),
845  atomic_read(&sp->sk_refcnt), sp,
846  atomic_read(&sp->sk_drops), len);
847 }
848 
849 static int ping_seq_show(struct seq_file *seq, void *v)
850 {
851  if (v == SEQ_START_TOKEN)
852  seq_printf(seq, "%-127s\n",
853  " sl local_address rem_address st tx_queue "
854  "rx_queue tr tm->when retrnsmt uid timeout "
855  "inode ref pointer drops");
856  else {
857  struct ping_iter_state *state = seq->private;
858  int len;
859 
860  ping_format_sock(v, seq, state->bucket, &len);
861  seq_printf(seq, "%*s\n", 127 - len, "");
862  }
863  return 0;
864 }
865 
866 static const struct seq_operations ping_seq_ops = {
867  .show = ping_seq_show,
868  .start = ping_seq_start,
869  .next = ping_seq_next,
870  .stop = ping_seq_stop,
871 };
872 
873 static int ping_seq_open(struct inode *inode, struct file *file)
874 {
875  return seq_open_net(inode, file, &ping_seq_ops,
876  sizeof(struct ping_iter_state));
877 }
878 
879 static const struct file_operations ping_seq_fops = {
880  .open = ping_seq_open,
881  .read = seq_read,
882  .llseek = seq_lseek,
883  .release = seq_release_net,
884 };
885 
886 static int ping_proc_register(struct net *net)
887 {
888  struct proc_dir_entry *p;
889  int rc = 0;
890 
891  p = proc_net_fops_create(net, "icmp", S_IRUGO, &ping_seq_fops);
892  if (!p)
893  rc = -ENOMEM;
894  return rc;
895 }
896 
897 static void ping_proc_unregister(struct net *net)
898 {
899  proc_net_remove(net, "icmp");
900 }
901 
902 
903 static int __net_init ping_proc_init_net(struct net *net)
904 {
905  return ping_proc_register(net);
906 }
907 
908 static void __net_exit ping_proc_exit_net(struct net *net)
909 {
910  ping_proc_unregister(net);
911 }
912 
913 static struct pernet_operations ping_net_ops = {
914  .init = ping_proc_init_net,
915  .exit = ping_proc_exit_net,
916 };
917 
918 int __init ping_proc_init(void)
919 {
920  return register_pernet_subsys(&ping_net_ops);
921 }
922 
923 void ping_proc_exit(void)
924 {
925  unregister_pernet_subsys(&ping_net_ops);
926 }
927 
928 #endif
929 
930 void __init ping_init(void)
931 {
932  int i;
933 
934  for (i = 0; i < PING_HTABLE_SIZE; i++)
937 }