udp.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:25k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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.  * The User Datagram Protocol (UDP).
  7.  *
  8.  * Version: $Id: udp.c,v 1.100.2.4 2002/03/05 12:47:34 davem Exp $
  9.  *
  10.  * Authors: Ross Biro, <bir7@leland.Stanford.Edu>
  11.  * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  12.  * Arnt Gulbrandsen, <agulbra@nvg.unit.no>
  13.  * Alan Cox, <Alan.Cox@linux.org>
  14.  *
  15.  * Fixes:
  16.  * Alan Cox : verify_area() calls
  17.  * Alan Cox :  stopped close while in use off icmp
  18.  * messages. Not a fix but a botch that
  19.  * for udp at least is 'valid'.
  20.  * Alan Cox : Fixed icmp handling properly
  21.  * Alan Cox :  Correct error for oversized datagrams
  22.  * Alan Cox : Tidied select() semantics. 
  23.  * Alan Cox : udp_err() fixed properly, also now 
  24.  * select and read wake correctly on errors
  25.  * Alan Cox : udp_send verify_area moved to avoid mem leak
  26.  * Alan Cox : UDP can count its memory
  27.  * Alan Cox : send to an unknown connection causes
  28.  * an ECONNREFUSED off the icmp, but
  29.  * does NOT close.
  30.  * Alan Cox : Switched to new sk_buff handlers. No more backlog!
  31.  * Alan Cox : Using generic datagram code. Even smaller and the PEEK
  32.  * bug no longer crashes it.
  33.  * Fred Van Kempen :  Net2e support for sk->broadcast.
  34.  * Alan Cox : Uses skb_free_datagram
  35.  * Alan Cox : Added get/set sockopt support.
  36.  * Alan Cox : Broadcasting without option set returns EACCES.
  37.  * Alan Cox : No wakeup calls. Instead we now use the callbacks.
  38.  * Alan Cox : Use ip_tos and ip_ttl
  39.  * Alan Cox : SNMP Mibs
  40.  * Alan Cox : MSG_DONTROUTE, and 0.0.0.0 support.
  41.  * Matt Dillon : UDP length checks.
  42.  * Alan Cox : Smarter af_inet used properly.
  43.  * Alan Cox : Use new kernel side addressing.
  44.  * Alan Cox : Incorrect return on truncated datagram receive.
  45.  * Arnt Gulbrandsen  : New udp_send and stuff
  46.  * Alan Cox : Cache last socket
  47.  * Alan Cox : Route cache
  48.  * Jon Peatfield : Minor efficiency fix to sendto().
  49.  * Mike Shaver : RFC1122 checks.
  50.  * Alan Cox : Nonblocking error fix.
  51.  * Willy Konynenberg : Transparent proxying support.
  52.  * Mike McLagan : Routing by source
  53.  * David S. Miller : New socket lookup architecture.
  54.  * Last socket cache retained as it
  55.  * does have a high hit rate.
  56.  * Olaf Kirch : Don't linearise iovec on sendmsg.
  57.  * Andi Kleen : Some cleanups, cache destination entry
  58.  * for connect. 
  59.  * Vitaly E. Lavrov : Transparent proxy revived after year coma.
  60.  * Melvin Smith : Check msg_name not msg_namelen in sendto(),
  61.  * return ENOTCONN for unconnected sockets (POSIX)
  62.  * Janos Farkas : don't deliver multi/broadcasts to a different
  63.  * bound-to-device socket
  64.  *
  65.  *
  66.  * This program is free software; you can redistribute it and/or
  67.  * modify it under the terms of the GNU General Public License
  68.  * as published by the Free Software Foundation; either version
  69.  * 2 of the License, or (at your option) any later version.
  70.  */
  71.  
  72. #include <asm/system.h>
  73. #include <asm/uaccess.h>
  74. #include <asm/ioctls.h>
  75. #include <linux/types.h>
  76. #include <linux/fcntl.h>
  77. #include <linux/socket.h>
  78. #include <linux/sockios.h>
  79. #include <linux/in.h>
  80. #include <linux/errno.h>
  81. #include <linux/timer.h>
  82. #include <linux/mm.h>
  83. #include <linux/config.h>
  84. #include <linux/inet.h>
  85. #include <linux/netdevice.h>
  86. #include <net/snmp.h>
  87. #include <net/ip.h>
  88. #include <net/protocol.h>
  89. #include <linux/skbuff.h>
  90. #include <net/sock.h>
  91. #include <net/udp.h>
  92. #include <net/icmp.h>
  93. #include <net/route.h>
  94. #include <net/inet_common.h>
  95. #include <net/checksum.h>
  96. /*
  97.  * Snmp MIB for the UDP layer
  98.  */
  99. struct udp_mib udp_statistics[NR_CPUS*2];
  100. struct sock *udp_hash[UDP_HTABLE_SIZE];
  101. rwlock_t udp_hash_lock = RW_LOCK_UNLOCKED;
  102. /* Shared by v4/v6 udp. */
  103. int udp_port_rover;
  104. static int udp_v4_get_port(struct sock *sk, unsigned short snum)
  105. {
  106. write_lock_bh(&udp_hash_lock);
  107. if (snum == 0) {
  108. int best_size_so_far, best, result, i;
  109. if (udp_port_rover > sysctl_local_port_range[1] ||
  110.     udp_port_rover < sysctl_local_port_range[0])
  111. udp_port_rover = sysctl_local_port_range[0];
  112. best_size_so_far = 32767;
  113. best = result = udp_port_rover;
  114. for (i = 0; i < UDP_HTABLE_SIZE; i++, result++) {
  115. struct sock *sk;
  116. int size;
  117. sk = udp_hash[result & (UDP_HTABLE_SIZE - 1)];
  118. if (!sk) {
  119. if (result > sysctl_local_port_range[1])
  120. result = sysctl_local_port_range[0] +
  121. ((result - sysctl_local_port_range[0]) &
  122.  (UDP_HTABLE_SIZE - 1));
  123. goto gotit;
  124. }
  125. size = 0;
  126. do {
  127. if (++size >= best_size_so_far)
  128. goto next;
  129. } while ((sk = sk->next) != NULL);
  130. best_size_so_far = size;
  131. best = result;
  132. next:;
  133. }
  134. result = best;
  135. for(i = 0; i < (1 << 16) / UDP_HTABLE_SIZE; i++, result += UDP_HTABLE_SIZE) {
  136. if (result > sysctl_local_port_range[1])
  137. result = sysctl_local_port_range[0]
  138. + ((result - sysctl_local_port_range[0]) &
  139.    (UDP_HTABLE_SIZE - 1));
  140. if (!udp_lport_inuse(result))
  141. break;
  142. }
  143. if (i >= (1 << 16) / UDP_HTABLE_SIZE)
  144. goto fail;
  145. gotit:
  146. udp_port_rover = snum = result;
  147. } else {
  148. struct sock *sk2;
  149. for (sk2 = udp_hash[snum & (UDP_HTABLE_SIZE - 1)];
  150.      sk2 != NULL;
  151.      sk2 = sk2->next) {
  152. if (sk2->num == snum &&
  153.     sk2 != sk &&
  154.     sk2->bound_dev_if == sk->bound_dev_if &&
  155.     (!sk2->rcv_saddr ||
  156.      !sk->rcv_saddr ||
  157.      sk2->rcv_saddr == sk->rcv_saddr) &&
  158.     (!sk2->reuse || !sk->reuse))
  159. goto fail;
  160. }
  161. }
  162. sk->num = snum;
  163. if (sk->pprev == NULL) {
  164. struct sock **skp = &udp_hash[snum & (UDP_HTABLE_SIZE - 1)];
  165. if ((sk->next = *skp) != NULL)
  166. (*skp)->pprev = &sk->next;
  167. *skp = sk;
  168. sk->pprev = skp;
  169. sock_prot_inc_use(sk->prot);
  170. sock_hold(sk);
  171. }
  172. write_unlock_bh(&udp_hash_lock);
  173. return 0;
  174. fail:
  175. write_unlock_bh(&udp_hash_lock);
  176. return 1;
  177. }
  178. static void udp_v4_hash(struct sock *sk)
  179. {
  180. BUG();
  181. }
  182. static void udp_v4_unhash(struct sock *sk)
  183. {
  184. write_lock_bh(&udp_hash_lock);
  185. if (sk->pprev) {
  186. if (sk->next)
  187. sk->next->pprev = sk->pprev;
  188. *sk->pprev = sk->next;
  189. sk->pprev = NULL;
  190. sk->num = 0;
  191. sock_prot_dec_use(sk->prot);
  192. __sock_put(sk);
  193. }
  194. write_unlock_bh(&udp_hash_lock);
  195. }
  196. /* UDP is nearly always wildcards out the wazoo, it makes no sense to try
  197.  * harder than this. -DaveM
  198.  */
  199. struct sock *udp_v4_lookup_longway(u32 saddr, u16 sport, u32 daddr, u16 dport, int dif)
  200. {
  201. struct sock *sk, *result = NULL;
  202. unsigned short hnum = ntohs(dport);
  203. int badness = -1;
  204. for(sk = udp_hash[hnum & (UDP_HTABLE_SIZE - 1)]; sk != NULL; sk = sk->next) {
  205. if(sk->num == hnum) {
  206. int score = 0;
  207. if(sk->rcv_saddr) {
  208. if(sk->rcv_saddr != daddr)
  209. continue;
  210. score++;
  211. }
  212. if(sk->daddr) {
  213. if(sk->daddr != saddr)
  214. continue;
  215. score++;
  216. }
  217. if(sk->dport) {
  218. if(sk->dport != sport)
  219. continue;
  220. score++;
  221. }
  222. if(sk->bound_dev_if) {
  223. if(sk->bound_dev_if != dif)
  224. continue;
  225. score++;
  226. }
  227. if(score == 4) {
  228. result = sk;
  229. break;
  230. } else if(score > badness) {
  231. result = sk;
  232. badness = score;
  233. }
  234. }
  235. }
  236. return result;
  237. }
  238. __inline__ struct sock *udp_v4_lookup(u32 saddr, u16 sport, u32 daddr, u16 dport, int dif)
  239. {
  240. struct sock *sk;
  241. read_lock(&udp_hash_lock);
  242. sk = udp_v4_lookup_longway(saddr, sport, daddr, dport, dif);
  243. if (sk)
  244. sock_hold(sk);
  245. read_unlock(&udp_hash_lock);
  246. return sk;
  247. }
  248. static inline struct sock *udp_v4_mcast_next(struct sock *sk,
  249.      u16 loc_port, u32 loc_addr,
  250.      u16 rmt_port, u32 rmt_addr,
  251.      int dif)
  252. {
  253. struct sock *s = sk;
  254. unsigned short hnum = ntohs(loc_port);
  255. for(; s; s = s->next) {
  256. if ((s->num != hnum) ||
  257.     (s->daddr && s->daddr!=rmt_addr) ||
  258.     (s->dport != rmt_port && s->dport != 0) ||
  259.     (s->rcv_saddr  && s->rcv_saddr != loc_addr) ||
  260.     (s->bound_dev_if && s->bound_dev_if != dif))
  261. continue;
  262. break;
  263.    }
  264.    return s;
  265. }
  266. /*
  267.  * This routine is called by the ICMP module when it gets some
  268.  * sort of error condition.  If err < 0 then the socket should
  269.  * be closed and the error returned to the user.  If err > 0
  270.  * it's just the icmp type << 8 | icmp code.  
  271.  * Header points to the ip header of the error packet. We move
  272.  * on past this. Then (as it used to claim before adjustment)
  273.  * header points to the first 8 bytes of the udp header.  We need
  274.  * to find the appropriate port.
  275.  */
  276. void udp_err(struct sk_buff *skb, u32 info)
  277. {
  278. struct iphdr *iph = (struct iphdr*)skb->data;
  279. struct udphdr *uh = (struct udphdr*)(skb->data+(iph->ihl<<2));
  280. int type = skb->h.icmph->type;
  281. int code = skb->h.icmph->code;
  282. struct sock *sk;
  283. int harderr;
  284. int err;
  285. sk = udp_v4_lookup(iph->daddr, uh->dest, iph->saddr, uh->source, skb->dev->ifindex);
  286. if (sk == NULL) {
  287. ICMP_INC_STATS_BH(IcmpInErrors);
  288.         return; /* No socket for error */
  289. }
  290. err = 0;
  291. harderr = 0;
  292. switch (type) {
  293. default:
  294. case ICMP_TIME_EXCEEDED:
  295. err = EHOSTUNREACH;
  296. break;
  297. case ICMP_SOURCE_QUENCH:
  298. goto out;
  299. case ICMP_PARAMETERPROB:
  300. err = EPROTO;
  301. harderr = 1;
  302. break;
  303. case ICMP_DEST_UNREACH:
  304. if (code == ICMP_FRAG_NEEDED) { /* Path MTU discovery */
  305. if (sk->protinfo.af_inet.pmtudisc != IP_PMTUDISC_DONT) {
  306. err = EMSGSIZE;
  307. harderr = 1;
  308. break;
  309. }
  310. goto out;
  311. }
  312. err = EHOSTUNREACH;
  313. if (code <= NR_ICMP_UNREACH) {
  314. harderr = icmp_err_convert[code].fatal;
  315. err = icmp_err_convert[code].errno;
  316. }
  317. break;
  318. }
  319. /*
  320.  *      RFC1122: OK.  Passes ICMP errors back to application, as per 
  321.  * 4.1.3.3.
  322.  */
  323. if (!sk->protinfo.af_inet.recverr) {
  324. if (!harderr || sk->state != TCP_ESTABLISHED)
  325. goto out;
  326. } else {
  327. ip_icmp_error(sk, skb, err, uh->dest, info, (u8*)(uh+1));
  328. }
  329. sk->err = err;
  330. sk->error_report(sk);
  331. out:
  332. sock_put(sk);
  333. }
  334. static unsigned short udp_check(struct udphdr *uh, int len, unsigned long saddr, unsigned long daddr, unsigned long base)
  335. {
  336. return(csum_tcpudp_magic(saddr, daddr, len, IPPROTO_UDP, base));
  337. }
  338. struct udpfakehdr 
  339. {
  340. struct udphdr uh;
  341. u32 saddr;
  342. u32 daddr;
  343. struct iovec *iov;
  344. u32 wcheck;
  345. };
  346. /*
  347.  * Copy and checksum a UDP packet from user space into a buffer.
  348.  */
  349.  
  350. static int udp_getfrag(const void *p, char * to, unsigned int offset, unsigned int fraglen) 
  351. {
  352. struct udpfakehdr *ufh = (struct udpfakehdr *)p;
  353. if (offset==0) {
  354. if (csum_partial_copy_fromiovecend(to+sizeof(struct udphdr), ufh->iov, offset,
  355.    fraglen-sizeof(struct udphdr), &ufh->wcheck))
  356. return -EFAULT;
  357.   ufh->wcheck = csum_partial((char *)ufh, sizeof(struct udphdr),
  358.    ufh->wcheck);
  359. ufh->uh.check = csum_tcpudp_magic(ufh->saddr, ufh->daddr, 
  360.   ntohs(ufh->uh.len),
  361.   IPPROTO_UDP, ufh->wcheck);
  362. if (ufh->uh.check == 0)
  363. ufh->uh.check = -1;
  364. memcpy(to, ufh, sizeof(struct udphdr));
  365. return 0;
  366. }
  367. if (csum_partial_copy_fromiovecend(to, ufh->iov, offset-sizeof(struct udphdr),
  368.    fraglen, &ufh->wcheck))
  369. return -EFAULT;
  370. return 0;
  371. }
  372. /*
  373.  * Copy a UDP packet from user space into a buffer without checksumming.
  374.  */
  375.  
  376. static int udp_getfrag_nosum(const void *p, char * to, unsigned int offset, unsigned int fraglen) 
  377. {
  378. struct udpfakehdr *ufh = (struct udpfakehdr *)p;
  379. if (offset==0) {
  380. memcpy(to, ufh, sizeof(struct udphdr));
  381. return memcpy_fromiovecend(to+sizeof(struct udphdr), ufh->iov, offset,
  382.    fraglen-sizeof(struct udphdr));
  383. }
  384. return memcpy_fromiovecend(to, ufh->iov, offset-sizeof(struct udphdr),
  385.    fraglen);
  386. }
  387. int udp_sendmsg(struct sock *sk, struct msghdr *msg, int len)
  388. {
  389. int ulen = len + sizeof(struct udphdr);
  390. struct ipcm_cookie ipc;
  391. struct udpfakehdr ufh;
  392. struct rtable *rt = NULL;
  393. int free = 0;
  394. int connected = 0;
  395. u32 daddr;
  396. u8  tos;
  397. int err;
  398. /* This check is ONLY to check for arithmetic overflow
  399.    on integer(!) len. Not more! Real check will be made
  400.    in ip_build_xmit --ANK
  401.    BTW socket.c -> af_*.c -> ... make multiple
  402.    invalid conversions size_t -> int. We MUST repair it f.e.
  403.    by replacing all of them with size_t and revise all
  404.    the places sort of len += sizeof(struct iphdr)
  405.    If len was ULONG_MAX-10 it would be cathastrophe  --ANK
  406.  */
  407. if (len < 0 || len > 0xFFFF)
  408. return -EMSGSIZE;
  409. /* 
  410.  * Check the flags.
  411.  */
  412. if (msg->msg_flags&MSG_OOB) /* Mirror BSD error message compatibility */
  413. return -EOPNOTSUPP;
  414. /*
  415.  * Get and verify the address. 
  416.  */
  417.  
  418. if (msg->msg_name) {
  419. struct sockaddr_in * usin = (struct sockaddr_in*)msg->msg_name;
  420. if (msg->msg_namelen < sizeof(*usin))
  421. return -EINVAL;
  422. if (usin->sin_family != AF_INET) {
  423. if (usin->sin_family != AF_UNSPEC)
  424. return -EINVAL;
  425. }
  426. ufh.daddr = usin->sin_addr.s_addr;
  427. ufh.uh.dest = usin->sin_port;
  428. if (ufh.uh.dest == 0)
  429. return -EINVAL;
  430. } else {
  431. if (sk->state != TCP_ESTABLISHED)
  432. return -ENOTCONN;
  433. ufh.daddr = sk->daddr;
  434. ufh.uh.dest = sk->dport;
  435. /* Open fast path for connected socket.
  436.    Route will not be used, if at least one option is set.
  437.  */
  438. connected = 1;
  439.    }
  440. ipc.addr = sk->saddr;
  441. ufh.uh.source = sk->sport;
  442. ipc.opt = NULL;
  443. ipc.oif = sk->bound_dev_if;
  444. if (msg->msg_controllen) {
  445. err = ip_cmsg_send(msg, &ipc);
  446. if (err)
  447. return err;
  448. if (ipc.opt)
  449. free = 1;
  450. connected = 0;
  451. }
  452. if (!ipc.opt)
  453. ipc.opt = sk->protinfo.af_inet.opt;
  454. ufh.saddr = ipc.addr;
  455. ipc.addr = daddr = ufh.daddr;
  456. if (ipc.opt && ipc.opt->srr) {
  457. if (!daddr)
  458. return -EINVAL;
  459. daddr = ipc.opt->faddr;
  460. connected = 0;
  461. }
  462. tos = RT_TOS(sk->protinfo.af_inet.tos);
  463. if (sk->localroute || (msg->msg_flags&MSG_DONTROUTE) || 
  464.     (ipc.opt && ipc.opt->is_strictroute)) {
  465. tos |= RTO_ONLINK;
  466. connected = 0;
  467. }
  468. if (MULTICAST(daddr)) {
  469. if (!ipc.oif)
  470. ipc.oif = sk->protinfo.af_inet.mc_index;
  471. if (!ufh.saddr)
  472. ufh.saddr = sk->protinfo.af_inet.mc_addr;
  473. connected = 0;
  474. }
  475. if (connected)
  476. rt = (struct rtable*)sk_dst_check(sk, 0);
  477. if (rt == NULL) {
  478. err = ip_route_output(&rt, daddr, ufh.saddr, tos, ipc.oif);
  479. if (err)
  480. goto out;
  481. err = -EACCES;
  482. if (rt->rt_flags&RTCF_BROADCAST && !sk->broadcast) 
  483. goto out;
  484. if (connected)
  485. sk_dst_set(sk, dst_clone(&rt->u.dst));
  486. }
  487. if (msg->msg_flags&MSG_CONFIRM)
  488. goto do_confirm;
  489. back_from_confirm:
  490. ufh.saddr = rt->rt_src;
  491. if (!ipc.addr)
  492. ufh.daddr = ipc.addr = rt->rt_dst;
  493. ufh.uh.len = htons(ulen);
  494. ufh.uh.check = 0;
  495. ufh.iov = msg->msg_iov;
  496. ufh.wcheck = 0;
  497. /* RFC1122: OK.  Provides the checksumming facility (MUST) as per */
  498. /* 4.1.3.4. It's configurable by the application via setsockopt() */
  499. /* (MAY) and it defaults to on (MUST). */
  500. err = ip_build_xmit(sk,
  501.     (sk->no_check == UDP_CSUM_NOXMIT ?
  502.      udp_getfrag_nosum :
  503.      udp_getfrag),
  504.     &ufh, ulen, &ipc, rt, msg->msg_flags);
  505. out:
  506. ip_rt_put(rt);
  507. if (free)
  508. kfree(ipc.opt);
  509. if (!err) {
  510. UDP_INC_STATS_USER(UdpOutDatagrams);
  511. return len;
  512. }
  513. return err;
  514. do_confirm:
  515. dst_confirm(&rt->u.dst);
  516. if (!(msg->msg_flags&MSG_PROBE) || len)
  517. goto back_from_confirm;
  518. err = 0;
  519. goto out;
  520. }
  521. /*
  522.  * IOCTL requests applicable to the UDP protocol
  523.  */
  524.  
  525. int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
  526. {
  527. switch(cmd) 
  528. {
  529. case SIOCOUTQ:
  530. {
  531. int amount = atomic_read(&sk->wmem_alloc);
  532. return put_user(amount, (int *)arg);
  533. }
  534. case SIOCINQ:
  535. {
  536. struct sk_buff *skb;
  537. unsigned long amount;
  538. amount = 0;
  539. spin_lock_irq(&sk->receive_queue.lock);
  540. skb = skb_peek(&sk->receive_queue);
  541. if (skb != NULL) {
  542. /*
  543.  * We will only return the amount
  544.  * of this packet since that is all
  545.  * that will be read.
  546.  */
  547. amount = skb->len - sizeof(struct udphdr);
  548. }
  549. spin_unlock_irq(&sk->receive_queue.lock);
  550. return put_user(amount, (int *)arg);
  551. }
  552. default:
  553. return -ENOIOCTLCMD;
  554. }
  555. return(0);
  556. }
  557. static __inline__ int __udp_checksum_complete(struct sk_buff *skb)
  558. {
  559. return (unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum));
  560. }
  561. static __inline__ int udp_checksum_complete(struct sk_buff *skb)
  562. {
  563. return skb->ip_summed != CHECKSUM_UNNECESSARY &&
  564. __udp_checksum_complete(skb);
  565. }
  566. /*
  567.  *  This should be easy, if there is something there we
  568.  *  return it, otherwise we block.
  569.  */
  570. int udp_recvmsg(struct sock *sk, struct msghdr *msg, int len,
  571. int noblock, int flags, int *addr_len)
  572. {
  573.    struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
  574.    struct sk_buff *skb;
  575.    int copied, err;
  576. /*
  577.  * Check any passed addresses
  578.  */
  579. if (addr_len)
  580. *addr_len=sizeof(*sin);
  581. if (flags & MSG_ERRQUEUE)
  582. return ip_recv_error(sk, msg, len);
  583. skb = skb_recv_datagram(sk, flags, noblock, &err);
  584. if (!skb)
  585. goto out;
  586.   
  587.    copied = skb->len - sizeof(struct udphdr);
  588. if (copied > len) {
  589. copied = len;
  590. msg->msg_flags |= MSG_TRUNC;
  591. }
  592. if (skb->ip_summed==CHECKSUM_UNNECESSARY) {
  593. err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov,
  594.       copied);
  595. } else if (msg->msg_flags&MSG_TRUNC) {
  596. if (__udp_checksum_complete(skb))
  597. goto csum_copy_err;
  598. err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov,
  599.       copied);
  600. } else {
  601. err = skb_copy_and_csum_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov);
  602. if (err == -EINVAL)
  603. goto csum_copy_err;
  604. }
  605. if (err)
  606. goto out_free;
  607. sock_recv_timestamp(msg, sk, skb);
  608. /* Copy the address. */
  609. if (sin)
  610. {
  611. sin->sin_family = AF_INET;
  612. sin->sin_port = skb->h.uh->source;
  613. sin->sin_addr.s_addr = skb->nh.iph->saddr;
  614. memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
  615.    }
  616. if (sk->protinfo.af_inet.cmsg_flags)
  617. ip_cmsg_recv(msg, skb);
  618. err = copied;
  619.   
  620. out_free:
  621.    skb_free_datagram(sk, skb);
  622. out:
  623.    return err;
  624. csum_copy_err:
  625. UDP_INC_STATS_BH(UdpInErrors);
  626. /* Clear queue. */
  627. if (flags&MSG_PEEK) {
  628. int clear = 0;
  629. spin_lock_irq(&sk->receive_queue.lock);
  630. if (skb == skb_peek(&sk->receive_queue)) {
  631. __skb_unlink(skb, &sk->receive_queue);
  632. clear = 1;
  633. }
  634. spin_unlock_irq(&sk->receive_queue.lock);
  635. if (clear)
  636. kfree_skb(skb);
  637. }
  638. skb_free_datagram(sk, skb);
  639. return -EAGAIN;
  640. }
  641. int udp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
  642. {
  643. struct sockaddr_in *usin = (struct sockaddr_in *) uaddr;
  644. struct rtable *rt;
  645. u32 saddr;
  646. int oif;
  647. int err;
  648. if (addr_len < sizeof(*usin)) 
  649.    return -EINVAL;
  650. if (usin->sin_family != AF_INET) 
  651.    return -EAFNOSUPPORT;
  652. sk_dst_reset(sk);
  653. oif = sk->bound_dev_if;
  654. saddr = sk->saddr;
  655. if (MULTICAST(usin->sin_addr.s_addr)) {
  656. if (!oif)
  657. oif = sk->protinfo.af_inet.mc_index;
  658. if (!saddr)
  659. saddr = sk->protinfo.af_inet.mc_addr;
  660. }
  661. err = ip_route_connect(&rt, usin->sin_addr.s_addr, saddr,
  662.        RT_CONN_FLAGS(sk), oif);
  663. if (err)
  664. return err;
  665. if ((rt->rt_flags&RTCF_BROADCAST) && !sk->broadcast) {
  666. ip_rt_put(rt);
  667. return -EACCES;
  668. }
  669.    if(!sk->saddr)
  670.    sk->saddr = rt->rt_src; /* Update source address */
  671. if(!sk->rcv_saddr)
  672. sk->rcv_saddr = rt->rt_src;
  673. sk->daddr = rt->rt_dst;
  674. sk->dport = usin->sin_port;
  675. sk->state = TCP_ESTABLISHED;
  676. sk->protinfo.af_inet.id = jiffies;
  677. sk_dst_set(sk, &rt->u.dst);
  678. return(0);
  679. }
  680. int udp_disconnect(struct sock *sk, int flags)
  681. {
  682. /*
  683.  * 1003.1g - break association.
  684.  */
  685.  
  686. sk->state = TCP_CLOSE;
  687. sk->daddr = 0;
  688. sk->dport = 0;
  689. sk->bound_dev_if = 0;
  690. if (!(sk->userlocks&SOCK_BINDADDR_LOCK)) {
  691. sk->rcv_saddr = 0;
  692. sk->saddr = 0;
  693. #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
  694. memset(&sk->net_pinfo.af_inet6.saddr, 0, 16);
  695. memset(&sk->net_pinfo.af_inet6.rcv_saddr, 0, 16);
  696. #endif
  697. }
  698. if (!(sk->userlocks&SOCK_BINDPORT_LOCK)) {
  699. sk->prot->unhash(sk);
  700. sk->sport = 0;
  701. }
  702. sk_dst_reset(sk);
  703. return 0;
  704. }
  705. static void udp_close(struct sock *sk, long timeout)
  706. {
  707. inet_sock_release(sk);
  708. }
  709. static int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
  710. {
  711. /*
  712.  * Charge it to the socket, dropping if the queue is full.
  713.  */
  714. #if defined(CONFIG_FILTER)
  715. if (sk->filter && skb->ip_summed != CHECKSUM_UNNECESSARY) {
  716. if (__udp_checksum_complete(skb)) {
  717. UDP_INC_STATS_BH(UdpInErrors);
  718. IP_INC_STATS_BH(IpInDiscards);
  719. ip_statistics[smp_processor_id()*2].IpInDelivers--;
  720. kfree_skb(skb);
  721. return -1;
  722. }
  723. skb->ip_summed = CHECKSUM_UNNECESSARY;
  724. }
  725. #endif
  726. if (sock_queue_rcv_skb(sk,skb)<0) {
  727. UDP_INC_STATS_BH(UdpInErrors);
  728. IP_INC_STATS_BH(IpInDiscards);
  729. ip_statistics[smp_processor_id()*2].IpInDelivers--;
  730. kfree_skb(skb);
  731. return -1;
  732. }
  733. UDP_INC_STATS_BH(UdpInDatagrams);
  734. return 0;
  735. }
  736. /*
  737.  * Multicasts and broadcasts go to each listener.
  738.  *
  739.  * Note: called only from the BH handler context,
  740.  * so we don't need to lock the hashes.
  741.  */
  742. static int udp_v4_mcast_deliver(struct sk_buff *skb, struct udphdr *uh,
  743.  u32 saddr, u32 daddr)
  744. {
  745. struct sock *sk;
  746. int dif;
  747. read_lock(&udp_hash_lock);
  748. sk = udp_hash[ntohs(uh->dest) & (UDP_HTABLE_SIZE - 1)];
  749. dif = skb->dev->ifindex;
  750. sk = udp_v4_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif);
  751. if (sk) {
  752. struct sock *sknext = NULL;
  753. do {
  754. struct sk_buff *skb1 = skb;
  755. sknext = udp_v4_mcast_next(sk->next, uh->dest, daddr,
  756.    uh->source, saddr, dif);
  757. if(sknext)
  758. skb1 = skb_clone(skb, GFP_ATOMIC);
  759. if(skb1)
  760. udp_queue_rcv_skb(sk, skb1);
  761. sk = sknext;
  762. } while(sknext);
  763. } else
  764. kfree_skb(skb);
  765. read_unlock(&udp_hash_lock);
  766. return 0;
  767. }
  768. /* Initialize UDP checksum. If exited with zero value (success),
  769.  * CHECKSUM_UNNECESSARY means, that no more checks are required.
  770.  * Otherwise, csum completion requires chacksumming packet body,
  771.  * including udp header and folding it to skb->csum.
  772.  */
  773. static int udp_checksum_init(struct sk_buff *skb, struct udphdr *uh,
  774.      unsigned short ulen, u32 saddr, u32 daddr)
  775. {
  776. if (uh->check == 0) {
  777. skb->ip_summed = CHECKSUM_UNNECESSARY;
  778. } else if (skb->ip_summed == CHECKSUM_HW) {
  779. skb->ip_summed = CHECKSUM_UNNECESSARY;
  780. if (!udp_check(uh, ulen, saddr, daddr, skb->csum))
  781. return 0;
  782. NETDEBUG(if (net_ratelimit()) printk(KERN_DEBUG "udp v4 hw csum failure.n"));
  783. skb->ip_summed = CHECKSUM_NONE;
  784. }
  785. if (skb->ip_summed != CHECKSUM_UNNECESSARY)
  786. skb->csum = csum_tcpudp_nofold(saddr, daddr, ulen, IPPROTO_UDP, 0);
  787. /* Probably, we should checksum udp header (it should be in cache
  788.  * in any case) and data in tiny packets (< rx copybreak).
  789.  */
  790. return 0;
  791. }
  792. /*
  793.  * All we need to do is get the socket, and then do a checksum. 
  794.  */
  795.  
  796. int udp_rcv(struct sk_buff *skb)
  797. {
  798.    struct sock *sk;
  799.    struct udphdr *uh;
  800. unsigned short ulen;
  801. struct rtable *rt = (struct rtable*)skb->dst;
  802. u32 saddr = skb->nh.iph->saddr;
  803. u32 daddr = skb->nh.iph->daddr;
  804. int len = skb->len;
  805.    IP_INC_STATS_BH(IpInDelivers);
  806. /*
  807.  * Validate the packet and the UDP length.
  808.  */
  809. if (!pskb_may_pull(skb, sizeof(struct udphdr)))
  810. goto no_header;
  811.    uh = skb->h.uh;
  812. ulen = ntohs(uh->len);
  813. if (ulen > len || ulen < sizeof(*uh))
  814. goto short_packet;
  815. if (pskb_trim(skb, ulen))
  816. goto short_packet;
  817. if (udp_checksum_init(skb, uh, ulen, saddr, daddr) < 0)
  818. goto csum_error;
  819. if(rt->rt_flags & (RTCF_BROADCAST|RTCF_MULTICAST))
  820. return udp_v4_mcast_deliver(skb, uh, saddr, daddr);
  821. sk = udp_v4_lookup(saddr, uh->source, daddr, uh->dest, skb->dev->ifindex);
  822. if (sk != NULL) {
  823. udp_queue_rcv_skb(sk, skb);
  824. sock_put(sk);
  825. return 0;
  826. }
  827. /* No socket. Drop packet silently, if checksum is wrong */
  828. if (udp_checksum_complete(skb))
  829. goto csum_error;
  830. UDP_INC_STATS_BH(UdpNoPorts);
  831. icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
  832. /*
  833.  * Hmm.  We got an UDP packet to a port to which we
  834.  * don't wanna listen.  Ignore it.
  835.  */
  836. kfree_skb(skb);
  837. return(0);
  838. short_packet:
  839. NETDEBUG(if (net_ratelimit())
  840.  printk(KERN_DEBUG "UDP: short packet: %u.%u.%u.%u:%u %d/%d to %u.%u.%u.%u:%un",
  841. NIPQUAD(saddr),
  842. ntohs(uh->source),
  843. ulen,
  844. len,
  845. NIPQUAD(daddr),
  846. ntohs(uh->dest)));
  847. no_header:
  848. UDP_INC_STATS_BH(UdpInErrors);
  849. kfree_skb(skb);
  850. return(0);
  851. csum_error:
  852. /* 
  853.  * RFC1122: OK.  Discards the bad packet silently (as far as 
  854.  * the network is concerned, anyway) as per 4.1.3.4 (MUST). 
  855.  */
  856. NETDEBUG(if (net_ratelimit())
  857.  printk(KERN_DEBUG "UDP: bad checksum. From %d.%d.%d.%d:%d to %d.%d.%d.%d:%d ulen %dn",
  858. NIPQUAD(saddr),
  859. ntohs(uh->source),
  860. NIPQUAD(daddr),
  861. ntohs(uh->dest),
  862. ulen));
  863. UDP_INC_STATS_BH(UdpInErrors);
  864. kfree_skb(skb);
  865. return(0);
  866. }
  867. static void get_udp_sock(struct sock *sp, char *tmpbuf, int i)
  868. {
  869. unsigned int dest, src;
  870. __u16 destp, srcp;
  871. dest  = sp->daddr;
  872. src   = sp->rcv_saddr;
  873. destp = ntohs(sp->dport);
  874. srcp  = ntohs(sp->sport);
  875. sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X"
  876. " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p",
  877. i, src, srcp, dest, destp, sp->state, 
  878. atomic_read(&sp->wmem_alloc), atomic_read(&sp->rmem_alloc),
  879. 0, 0L, 0,
  880. sock_i_uid(sp), 0,
  881. sock_i_ino(sp),
  882. atomic_read(&sp->refcnt), sp);
  883. }
  884. int udp_get_info(char *buffer, char **start, off_t offset, int length)
  885. {
  886. int len = 0, num = 0, i;
  887. off_t pos = 0;
  888. off_t begin;
  889. char tmpbuf[129];
  890. if (offset < 128) 
  891. len += sprintf(buffer, "%-127sn",
  892.        "  sl  local_address rem_address   st tx_queue "
  893.        "rx_queue tr tm->when retrnsmt   uid  timeout inode");
  894. pos = 128;
  895. read_lock(&udp_hash_lock);
  896. for (i = 0; i < UDP_HTABLE_SIZE; i++) {
  897. struct sock *sk;
  898. for (sk = udp_hash[i]; sk; sk = sk->next, num++) {
  899. if (sk->family != PF_INET)
  900. continue;
  901. pos += 128;
  902. if (pos <= offset)
  903. continue;
  904. get_udp_sock(sk, tmpbuf, i);
  905. len += sprintf(buffer+len, "%-127sn", tmpbuf);
  906. if(len >= length)
  907. goto out;
  908. }
  909. }
  910. out:
  911. read_unlock(&udp_hash_lock);
  912. begin = len - (pos - offset);
  913. *start = buffer + begin;
  914. len -= begin;
  915. if(len > length)
  916. len = length;
  917. if (len < 0)
  918. len = 0; 
  919. return len;
  920. }
  921. struct proto udp_prot = {
  922.   name: "UDP",
  923. close: udp_close,
  924. connect: udp_connect,
  925. disconnect: udp_disconnect,
  926. ioctl: udp_ioctl,
  927. setsockopt: ip_setsockopt,
  928. getsockopt: ip_getsockopt,
  929. sendmsg: udp_sendmsg,
  930. recvmsg: udp_recvmsg,
  931. backlog_rcv: udp_queue_rcv_skb,
  932. hash: udp_v4_hash,
  933. unhash: udp_v4_unhash,
  934. get_port: udp_v4_get_port,
  935. };