sock.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:27k
源码类别:

嵌入式Linux

开发平台:

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.  * Generic socket support routines. Memory allocators, socket lock/release
  7.  * handler for protocols to use and generic option handler.
  8.  *
  9.  *
  10.  * Version: $Id: sock.c,v 1.116 2001/11/08 04:20:06 davem Exp $
  11.  *
  12.  * Authors: Ross Biro, <bir7@leland.Stanford.Edu>
  13.  * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  14.  * Florian La Roche, <flla@stud.uni-sb.de>
  15.  * Alan Cox, <A.Cox@swansea.ac.uk>
  16.  *
  17.  * Fixes:
  18.  * Alan Cox :  Numerous verify_area() problems
  19.  * Alan Cox : Connecting on a connecting socket
  20.  * now returns an error for tcp.
  21.  * Alan Cox : sock->protocol is set correctly.
  22.  * and is not sometimes left as 0.
  23.  * Alan Cox : connect handles icmp errors on a
  24.  * connect properly. Unfortunately there
  25.  * is a restart syscall nasty there. I
  26.  * can't match BSD without hacking the C
  27.  * library. Ideas urgently sought!
  28.  * Alan Cox : Disallow bind() to addresses that are
  29.  * not ours - especially broadcast ones!!
  30.  * Alan Cox : Socket 1024 _IS_ ok for users. (fencepost)
  31.  * Alan Cox : sock_wfree/sock_rfree don't destroy sockets,
  32.  * instead they leave that for the DESTROY timer.
  33.  * Alan Cox : Clean up error flag in accept
  34.  * Alan Cox : TCP ack handling is buggy, the DESTROY timer
  35.  * was buggy. Put a remove_sock() in the handler
  36.  * for memory when we hit 0. Also altered the timer
  37.  * code. The ACK stuff can wait and needs major 
  38.  * TCP layer surgery.
  39.  * Alan Cox : Fixed TCP ack bug, removed remove sock
  40.  * and fixed timer/inet_bh race.
  41.  * Alan Cox : Added zapped flag for TCP
  42.  * Alan Cox : Move kfree_skb into skbuff.c and tidied up surplus code
  43.  * Alan Cox : for new sk_buff allocations wmalloc/rmalloc now call alloc_skb
  44.  * Alan Cox : kfree_s calls now are kfree_skbmem so we can track skb resources
  45.  * Alan Cox : Supports socket option broadcast now as does udp. Packet and raw need fixing.
  46.  * Alan Cox : Added RCVBUF,SNDBUF size setting. It suddenly occurred to me how easy it was so...
  47.  * Rick Sladkey : Relaxed UDP rules for matching packets.
  48.  * C.E.Hawkins : IFF_PROMISC/SIOCGHWADDR support
  49.  * Pauline Middelink : identd support
  50.  * Alan Cox : Fixed connect() taking signals I think.
  51.  * Alan Cox : SO_LINGER supported
  52.  * Alan Cox : Error reporting fixes
  53.  * Anonymous : inet_create tidied up (sk->reuse setting)
  54.  * Alan Cox : inet sockets don't set sk->type!
  55.  * Alan Cox : Split socket option code
  56.  * Alan Cox : Callbacks
  57.  * Alan Cox : Nagle flag for Charles & Johannes stuff
  58.  * Alex : Removed restriction on inet fioctl
  59.  * Alan Cox : Splitting INET from NET core
  60.  * Alan Cox : Fixed bogus SO_TYPE handling in getsockopt()
  61.  * Adam Caldwell : Missing return in SO_DONTROUTE/SO_DEBUG code
  62.  * Alan Cox : Split IP from generic code
  63.  * Alan Cox : New kfree_skbmem()
  64.  * Alan Cox : Make SO_DEBUG superuser only.
  65.  * Alan Cox : Allow anyone to clear SO_DEBUG
  66.  * (compatibility fix)
  67.  * Alan Cox : Added optimistic memory grabbing for AF_UNIX throughput.
  68.  * Alan Cox : Allocator for a socket is settable.
  69.  * Alan Cox : SO_ERROR includes soft errors.
  70.  * Alan Cox : Allow NULL arguments on some SO_ opts
  71.  * Alan Cox :  Generic socket allocation to make hooks
  72.  * easier (suggested by Craig Metz).
  73.  * Michael Pall : SO_ERROR returns positive errno again
  74.  *              Steve Whitehouse:       Added default destructor to free
  75.  *                                      protocol private data.
  76.  *              Steve Whitehouse:       Added various other default routines
  77.  *                                      common to several socket families.
  78.  *              Chris Evans     :       Call suser() check last on F_SETOWN
  79.  * Jay Schulist : Added SO_ATTACH_FILTER and SO_DETACH_FILTER.
  80.  * Andi Kleen : Add sock_kmalloc()/sock_kfree_s()
  81.  * Andi Kleen : Fix write_space callback
  82.  * Chris Evans : Security fixes - signedness again
  83.  * Arnaldo C. Melo :       cleanups, use skb_queue_purge
  84.  *
  85.  * To Fix:
  86.  *
  87.  *
  88.  * This program is free software; you can redistribute it and/or
  89.  * modify it under the terms of the GNU General Public License
  90.  * as published by the Free Software Foundation; either version
  91.  * 2 of the License, or (at your option) any later version.
  92.  */
  93. #include <linux/config.h>
  94. #include <linux/errno.h>
  95. #include <linux/types.h>
  96. #include <linux/socket.h>
  97. #include <linux/in.h>
  98. #include <linux/kernel.h>
  99. #include <linux/major.h>
  100. #include <linux/sched.h>
  101. #include <linux/timer.h>
  102. #include <linux/string.h>
  103. #include <linux/sockios.h>
  104. #include <linux/net.h>
  105. #include <linux/fcntl.h>
  106. #include <linux/mm.h>
  107. #include <linux/slab.h>
  108. #include <linux/interrupt.h>
  109. #include <linux/poll.h>
  110. #include <linux/init.h>
  111. #include <asm/uaccess.h>
  112. #include <asm/system.h>
  113. #include <linux/netdevice.h>
  114. #include <net/protocol.h>
  115. #include <linux/skbuff.h>
  116. #include <net/sock.h>
  117. #include <linux/ipsec.h>
  118. #ifdef CONFIG_FILTER
  119. #include <linux/filter.h>
  120. #endif
  121. #ifdef CONFIG_INET
  122. #include <net/tcp.h>
  123. #endif
  124. /* Run time adjustable parameters. */
  125. __u32 sysctl_wmem_max = SK_WMEM_MAX;
  126. __u32 sysctl_rmem_max = SK_RMEM_MAX;
  127. __u32 sysctl_wmem_default = SK_WMEM_MAX;
  128. __u32 sysctl_rmem_default = SK_RMEM_MAX;
  129. /* Maximal space eaten by iovec or ancilliary data plus some space */
  130. int sysctl_optmem_max = sizeof(unsigned long)*(2*UIO_MAXIOV + 512);
  131. static int sock_set_timeout(long *timeo_p, char *optval, int optlen)
  132. {
  133. struct timeval tv;
  134. if (optlen < sizeof(tv))
  135. return -EINVAL;
  136. if (copy_from_user(&tv, optval, sizeof(tv)))
  137. return -EFAULT;
  138. *timeo_p = MAX_SCHEDULE_TIMEOUT;
  139. if (tv.tv_sec == 0 && tv.tv_usec == 0)
  140. return 0;
  141. if (tv.tv_sec < (MAX_SCHEDULE_TIMEOUT/HZ - 1))
  142. *timeo_p = tv.tv_sec*HZ + (tv.tv_usec+(1000000/HZ-1))/(1000000/HZ);
  143. return 0;
  144. }
  145. /*
  146.  * This is meant for all protocols to use and covers goings on
  147.  * at the socket level. Everything here is generic.
  148.  */
  149. int sock_setsockopt(struct socket *sock, int level, int optname,
  150.     char *optval, int optlen)
  151. {
  152. struct sock *sk=sock->sk;
  153. #ifdef CONFIG_FILTER
  154. struct sk_filter *filter;
  155. #endif
  156. int val;
  157. int valbool;
  158. struct linger ling;
  159. int ret = 0;
  160. /*
  161.  * Options without arguments
  162.  */
  163. #ifdef SO_DONTLINGER /* Compatibility item... */
  164. switch(optname)
  165. {
  166. case SO_DONTLINGER:
  167. sk->linger=0;
  168. return 0;
  169. }
  170. #endif
  171.    if(optlen<sizeof(int))
  172.    return(-EINVAL);
  173.   
  174. if (get_user(val, (int *)optval))
  175. return -EFAULT;
  176.    valbool = val?1:0;
  177. lock_sock(sk);
  178.    switch(optname) 
  179.    {
  180. case SO_DEBUG:
  181. if(val && !capable(CAP_NET_ADMIN))
  182. {
  183. ret = -EACCES;
  184. }
  185. else
  186. sk->debug=valbool;
  187. break;
  188. case SO_REUSEADDR:
  189. sk->reuse = valbool;
  190. break;
  191. case SO_TYPE:
  192. case SO_ERROR:
  193. ret = -ENOPROTOOPT;
  194.    break;
  195. case SO_DONTROUTE:
  196. sk->localroute=valbool;
  197. break;
  198. case SO_BROADCAST:
  199. sk->broadcast=valbool;
  200. break;
  201. case SO_SNDBUF:
  202. /* Don't error on this BSD doesn't and if you think
  203.    about it this is right. Otherwise apps have to
  204.    play 'guess the biggest size' games. RCVBUF/SNDBUF
  205.    are treated in BSD as hints */
  206.    
  207. if (val > sysctl_wmem_max)
  208. val = sysctl_wmem_max;
  209. sk->userlocks |= SOCK_SNDBUF_LOCK;
  210. if ((val * 2) < SOCK_MIN_SNDBUF)
  211. sk->sndbuf = SOCK_MIN_SNDBUF;
  212. else
  213. sk->sndbuf = (val * 2);
  214. /*
  215.  * Wake up sending tasks if we
  216.  * upped the value.
  217.  */
  218. sk->write_space(sk);
  219. break;
  220. case SO_RCVBUF:
  221. /* Don't error on this BSD doesn't and if you think
  222.    about it this is right. Otherwise apps have to
  223.    play 'guess the biggest size' games. RCVBUF/SNDBUF
  224.    are treated in BSD as hints */
  225.   
  226. if (val > sysctl_rmem_max)
  227. val = sysctl_rmem_max;
  228. sk->userlocks |= SOCK_RCVBUF_LOCK;
  229. /* FIXME: is this lower bound the right one? */
  230. if ((val * 2) < SOCK_MIN_RCVBUF)
  231. sk->rcvbuf = SOCK_MIN_RCVBUF;
  232. else
  233. sk->rcvbuf = (val * 2);
  234. break;
  235. case SO_KEEPALIVE:
  236. #ifdef CONFIG_INET
  237. if (sk->protocol == IPPROTO_TCP)
  238. {
  239. tcp_set_keepalive(sk, valbool);
  240. }
  241. #endif
  242. sk->keepopen = valbool;
  243. break;
  244.   case SO_OOBINLINE:
  245. sk->urginline = valbool;
  246. break;
  247.   case SO_NO_CHECK:
  248. sk->no_check = valbool;
  249. break;
  250. case SO_PRIORITY:
  251. if ((val >= 0 && val <= 6) || capable(CAP_NET_ADMIN)) 
  252. sk->priority = val;
  253. else
  254. ret = -EPERM;
  255. break;
  256. case SO_LINGER:
  257. if(optlen<sizeof(ling)) {
  258. ret = -EINVAL; /* 1003.1g */
  259. break;
  260. }
  261. if (copy_from_user(&ling,optval,sizeof(ling))) {
  262. ret = -EFAULT;
  263. break;
  264. }
  265. if(ling.l_onoff==0) {
  266. sk->linger=0;
  267. } else {
  268. #if (BITS_PER_LONG == 32)
  269. if (ling.l_linger >= MAX_SCHEDULE_TIMEOUT/HZ)
  270. sk->lingertime=MAX_SCHEDULE_TIMEOUT;
  271. else
  272. #endif
  273. sk->lingertime=ling.l_linger*HZ;
  274. sk->linger=1;
  275. }
  276. break;
  277. case SO_BSDCOMPAT:
  278. sk->bsdism = valbool;
  279. break;
  280. case SO_PASSCRED:
  281. sock->passcred = valbool;
  282. break;
  283. case SO_TIMESTAMP:
  284. sk->rcvtstamp = valbool;
  285. break;
  286. case SO_RCVLOWAT:
  287. if (val < 0)
  288. val = INT_MAX;
  289. sk->rcvlowat = val ? : 1;
  290. break;
  291. case SO_RCVTIMEO:
  292. ret = sock_set_timeout(&sk->rcvtimeo, optval, optlen);
  293. break;
  294. case SO_SNDTIMEO:
  295. ret = sock_set_timeout(&sk->sndtimeo, optval, optlen);
  296. break;
  297. #ifdef CONFIG_NETDEVICES
  298. case SO_BINDTODEVICE:
  299. {
  300. char devname[IFNAMSIZ]; 
  301. /* Sorry... */ 
  302. if (!capable(CAP_NET_RAW)) {
  303. ret = -EPERM;
  304. break;
  305. }
  306. /* Bind this socket to a particular device like "eth0",
  307.  * as specified in the passed interface name. If the
  308.  * name is "" or the option length is zero the socket 
  309.  * is not bound. 
  310.  */ 
  311. if (!valbool) {
  312. sk->bound_dev_if = 0;
  313. } else {
  314. if (optlen > IFNAMSIZ) 
  315. optlen = IFNAMSIZ; 
  316. if (copy_from_user(devname, optval, optlen)) {
  317. ret = -EFAULT;
  318. break;
  319. }
  320. /* Remove any cached route for this socket. */
  321. sk_dst_reset(sk);
  322. if (devname[0] == '') {
  323. sk->bound_dev_if = 0;
  324. } else {
  325. struct net_device *dev = dev_get_by_name(devname);
  326. if (!dev) {
  327. ret = -ENODEV;
  328. break;
  329. }
  330. sk->bound_dev_if = dev->ifindex;
  331. dev_put(dev);
  332. }
  333. }
  334. break;
  335. }
  336. #endif
  337. #ifdef CONFIG_FILTER
  338. case SO_ATTACH_FILTER:
  339. ret = -EINVAL;
  340. if (optlen == sizeof(struct sock_fprog)) {
  341. struct sock_fprog fprog;
  342. ret = -EFAULT;
  343. if (copy_from_user(&fprog, optval, sizeof(fprog)))
  344. break;
  345. ret = sk_attach_filter(&fprog, sk);
  346. }
  347. break;
  348. case SO_DETACH_FILTER:
  349. spin_lock_bh(&sk->lock.slock);
  350. filter = sk->filter;
  351.                         if (filter) {
  352. sk->filter = NULL;
  353. spin_unlock_bh(&sk->lock.slock);
  354. sk_filter_release(sk, filter);
  355. break;
  356. }
  357. spin_unlock_bh(&sk->lock.slock);
  358. ret = -ENONET;
  359. break;
  360. #endif
  361. /* We implement the SO_SNDLOWAT etc to
  362.    not be settable (1003.1g 5.3) */
  363. default:
  364.    ret = -ENOPROTOOPT;
  365. break;
  366.    }
  367. release_sock(sk);
  368. return ret;
  369. }
  370. int sock_getsockopt(struct socket *sock, int level, int optname,
  371.     char *optval, int *optlen)
  372. {
  373. struct sock *sk = sock->sk;
  374. union
  375. {
  376.    int val;
  377.    struct linger ling;
  378. struct timeval tm;
  379. } v;
  380. unsigned int lv=sizeof(int),len;
  381.   
  382.    if(get_user(len,optlen))
  383.    return -EFAULT;
  384. if(len < 0)
  385. return -EINVAL;
  386.    switch(optname) 
  387.    {
  388. case SO_DEBUG:
  389. v.val = sk->debug;
  390. break;
  391. case SO_DONTROUTE:
  392. v.val = sk->localroute;
  393. break;
  394. case SO_BROADCAST:
  395. v.val= sk->broadcast;
  396. break;
  397. case SO_SNDBUF:
  398. v.val=sk->sndbuf;
  399. break;
  400. case SO_RCVBUF:
  401. v.val =sk->rcvbuf;
  402. break;
  403. case SO_REUSEADDR:
  404. v.val = sk->reuse;
  405. break;
  406. case SO_KEEPALIVE:
  407. v.val = sk->keepopen;
  408. break;
  409. case SO_TYPE:
  410. v.val = sk->type;   
  411. break;
  412. case SO_ERROR:
  413. v.val = -sock_error(sk);
  414. if(v.val==0)
  415. v.val=xchg(&sk->err_soft,0);
  416. break;
  417. case SO_OOBINLINE:
  418. v.val = sk->urginline;
  419. break;
  420. case SO_NO_CHECK:
  421. v.val = sk->no_check;
  422. break;
  423. case SO_PRIORITY:
  424. v.val = sk->priority;
  425. break;
  426. case SO_LINGER:
  427. lv=sizeof(v.ling);
  428. v.ling.l_onoff=sk->linger;
  429.   v.ling.l_linger=sk->lingertime/HZ;
  430. break;
  431. case SO_BSDCOMPAT:
  432. v.val = sk->bsdism;
  433. break;
  434. case SO_TIMESTAMP:
  435. v.val = sk->rcvtstamp;
  436. break;
  437. case SO_RCVTIMEO:
  438. lv=sizeof(struct timeval);
  439. if (sk->rcvtimeo == MAX_SCHEDULE_TIMEOUT) {
  440. v.tm.tv_sec = 0;
  441. v.tm.tv_usec = 0;
  442. } else {
  443. v.tm.tv_sec = sk->rcvtimeo/HZ;
  444. v.tm.tv_usec = ((sk->rcvtimeo%HZ)*1000)/HZ;
  445. }
  446. break;
  447. case SO_SNDTIMEO:
  448. lv=sizeof(struct timeval);
  449. if (sk->sndtimeo == MAX_SCHEDULE_TIMEOUT) {
  450. v.tm.tv_sec = 0;
  451. v.tm.tv_usec = 0;
  452. } else {
  453. v.tm.tv_sec = sk->sndtimeo/HZ;
  454. v.tm.tv_usec = ((sk->sndtimeo%HZ)*1000)/HZ;
  455. }
  456. break;
  457. case SO_RCVLOWAT:
  458. v.val = sk->rcvlowat;
  459. break;
  460. case SO_SNDLOWAT:
  461. v.val=1;
  462. break; 
  463. case SO_PASSCRED:
  464. v.val = sock->passcred;
  465. break;
  466. case SO_PEERCRED:
  467. if (len > sizeof(sk->peercred))
  468. len = sizeof(sk->peercred);
  469. if (copy_to_user(optval, &sk->peercred, len))
  470. return -EFAULT;
  471. goto lenout;
  472. case SO_PEERNAME:
  473. {
  474. char address[128];
  475. if (sock->ops->getname(sock, (struct sockaddr *)address, &lv, 2))
  476. return -ENOTCONN;
  477. if (lv < len)
  478. return -EINVAL;
  479. if(copy_to_user((void*)optval, address, len))
  480. return -EFAULT;
  481. goto lenout;
  482. }
  483. /* Dubious BSD thing... Probably nobody even uses it, but
  484.  * the UNIX standard wants it for whatever reason... -DaveM
  485.  */
  486. case SO_ACCEPTCONN:
  487. v.val = (sk->state == TCP_LISTEN);
  488. break;
  489. default:
  490. return(-ENOPROTOOPT);
  491. }
  492. if (len > lv)
  493. len = lv;
  494. if (copy_to_user(optval, &v, len))
  495. return -EFAULT;
  496. lenout:
  497.    if (put_user(len, optlen))
  498.    return -EFAULT;
  499.    return 0;
  500. }
  501. static kmem_cache_t *sk_cachep;
  502. /*
  503.  * All socket objects are allocated here. This is for future
  504.  * usage.
  505.  */
  506.  
  507. struct sock *sk_alloc(int family, int priority, int zero_it)
  508. {
  509. struct sock *sk = kmem_cache_alloc(sk_cachep, priority);
  510. if(sk && zero_it) {
  511. memset(sk, 0, sizeof(struct sock));
  512. sk->family = family;
  513. sock_lock_init(sk);
  514. }
  515. return sk;
  516. }
  517. void sk_free(struct sock *sk)
  518. {
  519. #ifdef CONFIG_FILTER
  520. struct sk_filter *filter;
  521. #endif
  522. if (sk->destruct)
  523. sk->destruct(sk);
  524. #ifdef CONFIG_FILTER
  525. filter = sk->filter;
  526. if (filter) {
  527. sk_filter_release(sk, filter);
  528. sk->filter = NULL;
  529. }
  530. #endif
  531. if (atomic_read(&sk->omem_alloc))
  532. printk(KERN_DEBUG "sk_free: optmem leakage (%d bytes) detected.n", atomic_read(&sk->omem_alloc));
  533. kmem_cache_free(sk_cachep, sk);
  534. }
  535. void __init sk_init(void)
  536. {
  537. sk_cachep = kmem_cache_create("sock", sizeof(struct sock), 0,
  538.       SLAB_HWCACHE_ALIGN, 0, 0);
  539. if (!sk_cachep)
  540. printk(KERN_CRIT "sk_init: Cannot create sock SLAB cache!");
  541. if (num_physpages <= 4096) {
  542. sysctl_wmem_max = 32767;
  543. sysctl_rmem_max = 32767;
  544. sysctl_wmem_default = 32767;
  545. sysctl_wmem_default = 32767;
  546. } else if (num_physpages >= 131072) {
  547. sysctl_wmem_max = 131071;
  548. sysctl_rmem_max = 131071;
  549. }
  550. }
  551. /*
  552.  * Simple resource managers for sockets.
  553.  */
  554. /* 
  555.  * Write buffer destructor automatically called from kfree_skb. 
  556.  */
  557. void sock_wfree(struct sk_buff *skb)
  558. {
  559. struct sock *sk = skb->sk;
  560. /* In case it might be waiting for more memory. */
  561. atomic_sub(skb->truesize, &sk->wmem_alloc);
  562. if (!sk->use_write_queue)
  563. sk->write_space(sk);
  564. sock_put(sk);
  565. }
  566. /* 
  567.  * Read buffer destructor automatically called from kfree_skb. 
  568.  */
  569. void sock_rfree(struct sk_buff *skb)
  570. {
  571. struct sock *sk = skb->sk;
  572. atomic_sub(skb->truesize, &sk->rmem_alloc);
  573. }
  574. /*
  575.  * Allocate a skb from the socket's send buffer.
  576.  */
  577. struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force, int priority)
  578. {
  579. if (force || atomic_read(&sk->wmem_alloc) < sk->sndbuf) {
  580. struct sk_buff * skb = alloc_skb(size, priority);
  581. if (skb) {
  582. skb_set_owner_w(skb, sk);
  583. return skb;
  584. }
  585. }
  586. return NULL;
  587. }
  588. /*
  589.  * Allocate a skb from the socket's receive buffer.
  590.  */ 
  591. struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force, int priority)
  592. {
  593. if (force || atomic_read(&sk->rmem_alloc) < sk->rcvbuf) {
  594. struct sk_buff *skb = alloc_skb(size, priority);
  595. if (skb) {
  596. skb_set_owner_r(skb, sk);
  597. return skb;
  598. }
  599. }
  600. return NULL;
  601. }
  602. /* 
  603.  * Allocate a memory block from the socket's option memory buffer.
  604.  */ 
  605. void *sock_kmalloc(struct sock *sk, int size, int priority)
  606. {
  607. if ((unsigned)size <= sysctl_optmem_max &&
  608.     atomic_read(&sk->omem_alloc)+size < sysctl_optmem_max) {
  609. void *mem;
  610. /* First do the add, to avoid the race if kmalloc
  611.    * might sleep.
  612.  */
  613. atomic_add(size, &sk->omem_alloc);
  614. mem = kmalloc(size, priority);
  615. if (mem)
  616. return mem;
  617. atomic_sub(size, &sk->omem_alloc);
  618. }
  619. return NULL;
  620. }
  621. /*
  622.  * Free an option memory block.
  623.  */
  624. void sock_kfree_s(struct sock *sk, void *mem, int size)
  625. {
  626. kfree(mem);
  627. atomic_sub(size, &sk->omem_alloc);
  628. }
  629. /* It is almost wait_for_tcp_memory minus release_sock/lock_sock.
  630.    I think, these locks should be removed for datagram sockets.
  631.  */
  632. static long sock_wait_for_wmem(struct sock * sk, long timeo)
  633. {
  634. DECLARE_WAITQUEUE(wait, current);
  635. clear_bit(SOCK_ASYNC_NOSPACE, &sk->socket->flags);
  636. add_wait_queue(sk->sleep, &wait);
  637. for (;;) {
  638. if (!timeo)
  639. break;
  640. if (signal_pending(current))
  641. break;
  642. set_bit(SOCK_NOSPACE, &sk->socket->flags);
  643. set_current_state(TASK_INTERRUPTIBLE);
  644. if (atomic_read(&sk->wmem_alloc) < sk->sndbuf)
  645. break;
  646. if (sk->shutdown & SEND_SHUTDOWN)
  647. break;
  648. if (sk->err)
  649. break;
  650. timeo = schedule_timeout(timeo);
  651. }
  652. __set_current_state(TASK_RUNNING);
  653. remove_wait_queue(sk->sleep, &wait);
  654. return timeo;
  655. }
  656. /*
  657.  * Generic send/receive buffer handlers
  658.  */
  659. struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,
  660.      unsigned long data_len, int noblock, int *errcode)
  661. {
  662. struct sk_buff *skb;
  663. long timeo;
  664. int err;
  665. timeo = sock_sndtimeo(sk, noblock);
  666. while (1) {
  667. err = sock_error(sk);
  668. if (err != 0)
  669. goto failure;
  670. err = -EPIPE;
  671. if (sk->shutdown & SEND_SHUTDOWN)
  672. goto failure;
  673. if (atomic_read(&sk->wmem_alloc) < sk->sndbuf) {
  674. skb = alloc_skb(header_len, sk->allocation);
  675. if (skb) {
  676. int npages;
  677. int i;
  678. /* No pages, we're done... */
  679. if (!data_len)
  680. break;
  681. npages = (data_len + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
  682. skb->truesize += data_len;
  683. skb_shinfo(skb)->nr_frags = npages;
  684. for (i = 0; i < npages; i++) {
  685. struct page *page;
  686. skb_frag_t *frag;
  687. page = alloc_pages(sk->allocation, 0);
  688. if (!page) {
  689. err = -ENOBUFS;
  690. kfree_skb(skb);
  691. goto failure;
  692. }
  693. frag = &skb_shinfo(skb)->frags[i];
  694. frag->page = page;
  695. frag->page_offset = 0;
  696. frag->size = (data_len >= PAGE_SIZE ?
  697.       PAGE_SIZE :
  698.       data_len);
  699. data_len -= PAGE_SIZE;
  700. }
  701. /* Full success... */
  702. break;
  703. }
  704. err = -ENOBUFS;
  705. goto failure;
  706. }
  707. set_bit(SOCK_ASYNC_NOSPACE, &sk->socket->flags);
  708. set_bit(SOCK_NOSPACE, &sk->socket->flags);
  709. err = -EAGAIN;
  710. if (!timeo)
  711. goto failure;
  712. if (signal_pending(current))
  713. goto interrupted;
  714. timeo = sock_wait_for_wmem(sk, timeo);
  715. }
  716. skb_set_owner_w(skb, sk);
  717. return skb;
  718. interrupted:
  719. err = sock_intr_errno(timeo);
  720. failure:
  721. *errcode = err;
  722. return NULL;
  723. }
  724. struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size, 
  725.     int noblock, int *errcode)
  726. {
  727. return sock_alloc_send_pskb(sk, size, 0, noblock, errcode);
  728. }
  729. void __lock_sock(struct sock *sk)
  730. {
  731. DECLARE_WAITQUEUE(wait, current);
  732. add_wait_queue_exclusive(&sk->lock.wq, &wait);
  733. for(;;) {
  734. current->state = TASK_UNINTERRUPTIBLE;
  735. spin_unlock_bh(&sk->lock.slock);
  736. schedule();
  737. spin_lock_bh(&sk->lock.slock);
  738. if(!sk->lock.users)
  739. break;
  740. }
  741. current->state = TASK_RUNNING;
  742. remove_wait_queue(&sk->lock.wq, &wait);
  743. }
  744. void __release_sock(struct sock *sk)
  745. {
  746. struct sk_buff *skb = sk->backlog.head;
  747. do {
  748. sk->backlog.head = sk->backlog.tail = NULL;
  749. bh_unlock_sock(sk);
  750. do {
  751. struct sk_buff *next = skb->next;
  752. skb->next = NULL;
  753. sk->backlog_rcv(sk, skb);
  754. skb = next;
  755. } while (skb != NULL);
  756. bh_lock_sock(sk);
  757. } while((skb = sk->backlog.head) != NULL);
  758. }
  759. /*
  760.  * Generic socket manager library. Most simpler socket families
  761.  * use this to manage their socket lists. At some point we should
  762.  * hash these. By making this generic we get the lot hashed for free.
  763.  *
  764.  * It is broken by design. All the protocols using it must be fixed. --ANK
  765.  */
  766. rwlock_t net_big_sklist_lock = RW_LOCK_UNLOCKED;
  767.  
  768. void sklist_remove_socket(struct sock **list, struct sock *sk)
  769. {
  770. struct sock *s;
  771. write_lock_bh(&net_big_sklist_lock);
  772. while ((s = *list) != NULL) {
  773. if (s == sk) {
  774. *list = s->next;
  775. break;
  776. }
  777. list = &s->next;
  778. }
  779. write_unlock_bh(&net_big_sklist_lock);
  780. if (s)
  781. sock_put(s);
  782. }
  783. void sklist_insert_socket(struct sock **list, struct sock *sk)
  784. {
  785. write_lock_bh(&net_big_sklist_lock);
  786. sk->next= *list;
  787. *list=sk;
  788. sock_hold(sk);
  789. write_unlock_bh(&net_big_sklist_lock);
  790. }
  791. /*
  792.  * This is only called from user mode. Thus it protects itself against
  793.  * interrupt users but doesn't worry about being called during work.
  794.  * Once it is removed from the queue no interrupt or bottom half will
  795.  * touch it and we are (fairly 8-) ) safe.
  796.  */
  797. void sklist_destroy_socket(struct sock **list, struct sock *sk);
  798. /*
  799.  * Handler for deferred kills.
  800.  */
  801. static void sklist_destroy_timer(unsigned long data)
  802. {
  803. struct sock *sk=(struct sock *)data;
  804. sklist_destroy_socket(NULL,sk);
  805. }
  806. /*
  807.  * Destroy a socket. We pass NULL for a list if we know the
  808.  * socket is not on a list.
  809.  */
  810.  
  811. void sklist_destroy_socket(struct sock **list,struct sock *sk)
  812. {
  813. if(list)
  814. sklist_remove_socket(list, sk);
  815. skb_queue_purge(&sk->receive_queue);
  816. if(atomic_read(&sk->wmem_alloc) == 0 &&
  817.    atomic_read(&sk->rmem_alloc) == 0 &&
  818.    sk->dead)
  819. {
  820. sock_put(sk);
  821. }
  822. else
  823. {
  824. /*
  825.  * Someone is using our buffers still.. defer
  826.  */
  827. init_timer(&sk->timer);
  828. sk->timer.expires=jiffies+SOCK_DESTROY_TIME;
  829. sk->timer.function=sklist_destroy_timer;
  830. sk->timer.data = (unsigned long)sk;
  831. add_timer(&sk->timer);
  832. }
  833. }
  834. /*
  835.  * Set of default routines for initialising struct proto_ops when
  836.  * the protocol does not support a particular function. In certain
  837.  * cases where it makes no sense for a protocol to have a "do nothing"
  838.  * function, some default processing is provided.
  839.  */
  840. int sock_no_release(struct socket *sock)
  841. {
  842. return 0;
  843. }
  844. int sock_no_bind(struct socket *sock, struct sockaddr *saddr, int len)
  845. {
  846. return -EOPNOTSUPP;
  847. }
  848. int sock_no_connect(struct socket *sock, struct sockaddr *saddr, 
  849.     int len, int flags)
  850. {
  851. return -EOPNOTSUPP;
  852. }
  853. int sock_no_socketpair(struct socket *sock1, struct socket *sock2)
  854. {
  855. return -EOPNOTSUPP;
  856. }
  857. int sock_no_accept(struct socket *sock, struct socket *newsock, int flags)
  858. {
  859. return -EOPNOTSUPP;
  860. }
  861. int sock_no_getname(struct socket *sock, struct sockaddr *saddr, 
  862.     int *len, int peer)
  863. {
  864. return -EOPNOTSUPP;
  865. }
  866. unsigned int sock_no_poll(struct file * file, struct socket *sock, poll_table *pt)
  867. {
  868. return 0;
  869. }
  870. int sock_no_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
  871. {
  872. return -EOPNOTSUPP;
  873. }
  874. int sock_no_listen(struct socket *sock, int backlog)
  875. {
  876. return -EOPNOTSUPP;
  877. }
  878. int sock_no_shutdown(struct socket *sock, int how)
  879. {
  880. return -EOPNOTSUPP;
  881. }
  882. int sock_no_setsockopt(struct socket *sock, int level, int optname,
  883.     char *optval, int optlen)
  884. {
  885. return -EOPNOTSUPP;
  886. }
  887. int sock_no_getsockopt(struct socket *sock, int level, int optname,
  888.     char *optval, int *optlen)
  889. {
  890. return -EOPNOTSUPP;
  891. }
  892. /* 
  893.  * Note: if you add something that sleeps here then change sock_fcntl()
  894.  *       to do proper fd locking.
  895.  */
  896. int sock_no_fcntl(struct socket *sock, unsigned int cmd, unsigned long arg)
  897. {
  898. struct sock *sk = sock->sk;
  899. switch(cmd)
  900. {
  901. case F_SETOWN:
  902. /*
  903.  * This is a little restrictive, but it's the only
  904.  * way to make sure that you can't send a sigurg to
  905.  * another process.
  906.  */
  907. if (current->pgrp != -arg &&
  908. current->pid != arg &&
  909. !capable(CAP_KILL)) return(-EPERM);
  910. sk->proc = arg;
  911. return(0);
  912. case F_GETOWN:
  913. return(sk->proc);
  914. default:
  915. return(-EINVAL);
  916. }
  917. }
  918. int sock_no_sendmsg(struct socket *sock, struct msghdr *m, int flags,
  919.     struct scm_cookie *scm)
  920. {
  921. return -EOPNOTSUPP;
  922. }
  923. int sock_no_recvmsg(struct socket *sock, struct msghdr *m, int len, int flags,
  924.     struct scm_cookie *scm)
  925. {
  926. return -EOPNOTSUPP;
  927. }
  928. int sock_no_mmap(struct file *file, struct socket *sock, struct vm_area_struct *vma)
  929. {
  930. /* Mirror missing mmap method error code */
  931. return -ENODEV;
  932. }
  933. ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags)
  934. {
  935. ssize_t res;
  936. struct msghdr msg;
  937. struct iovec iov;
  938. mm_segment_t old_fs;
  939. char *kaddr;
  940. kaddr = kmap(page);
  941. msg.msg_name = NULL;
  942. msg.msg_namelen = 0;
  943. msg.msg_iov = &iov;
  944. msg.msg_iovlen = 1;
  945. msg.msg_control = NULL;
  946. msg.msg_controllen = 0;
  947. msg.msg_flags = flags;
  948. iov.iov_base = kaddr + offset;
  949. iov.iov_len = size;
  950. old_fs = get_fs();
  951. set_fs(KERNEL_DS);
  952. res = sock_sendmsg(sock, &msg, size);
  953. set_fs(old_fs);
  954. kunmap(page);
  955. return res;
  956. }
  957. /*
  958.  * Default Socket Callbacks
  959.  */
  960. void sock_def_wakeup(struct sock *sk)
  961. {
  962. read_lock(&sk->callback_lock);
  963. if (sk->sleep && waitqueue_active(sk->sleep))
  964. wake_up_interruptible_all(sk->sleep);
  965. read_unlock(&sk->callback_lock);
  966. }
  967. void sock_def_error_report(struct sock *sk)
  968. {
  969. read_lock(&sk->callback_lock);
  970. if (sk->sleep && waitqueue_active(sk->sleep))
  971. wake_up_interruptible(sk->sleep);
  972. sk_wake_async(sk,0,POLL_ERR); 
  973. read_unlock(&sk->callback_lock);
  974. }
  975. void sock_def_readable(struct sock *sk, int len)
  976. {
  977. read_lock(&sk->callback_lock);
  978. if (sk->sleep && waitqueue_active(sk->sleep))
  979. wake_up_interruptible(sk->sleep);
  980. sk_wake_async(sk,1,POLL_IN);
  981. read_unlock(&sk->callback_lock);
  982. }
  983. void sock_def_write_space(struct sock *sk)
  984. {
  985. read_lock(&sk->callback_lock);
  986. /* Do not wake up a writer until he can make "significant"
  987.  * progress.  --DaveM
  988.  */
  989. if((atomic_read(&sk->wmem_alloc) << 1) <= sk->sndbuf) {
  990. if (sk->sleep && waitqueue_active(sk->sleep))
  991. wake_up_interruptible(sk->sleep);
  992. /* Should agree with poll, otherwise some programs break */
  993. if (sock_writeable(sk))
  994. sk_wake_async(sk, 2, POLL_OUT);
  995. }
  996. read_unlock(&sk->callback_lock);
  997. }
  998. void sock_def_destruct(struct sock *sk)
  999. {
  1000. if (sk->protinfo.destruct_hook)
  1001. kfree(sk->protinfo.destruct_hook);
  1002. }
  1003. void sock_init_data(struct socket *sock, struct sock *sk)
  1004. {
  1005. skb_queue_head_init(&sk->receive_queue);
  1006. skb_queue_head_init(&sk->write_queue);
  1007. skb_queue_head_init(&sk->error_queue);
  1008. init_timer(&sk->timer);
  1009. sk->allocation = GFP_KERNEL;
  1010. sk->rcvbuf = sysctl_rmem_default;
  1011. sk->sndbuf = sysctl_wmem_default;
  1012. sk->state  =  TCP_CLOSE;
  1013. sk->zapped = 1;
  1014. sk->socket = sock;
  1015. if(sock)
  1016. {
  1017. sk->type = sock->type;
  1018. sk->sleep = &sock->wait;
  1019. sock->sk = sk;
  1020. } else
  1021. sk->sleep = NULL;
  1022. sk->dst_lock = RW_LOCK_UNLOCKED;
  1023. sk->callback_lock = RW_LOCK_UNLOCKED;
  1024. sk->state_change = sock_def_wakeup;
  1025. sk->data_ready = sock_def_readable;
  1026. sk->write_space = sock_def_write_space;
  1027. sk->error_report = sock_def_error_report;
  1028. sk->destruct            =       sock_def_destruct;
  1029. sk->peercred.pid  = 0;
  1030. sk->peercred.uid = -1;
  1031. sk->peercred.gid = -1;
  1032. sk->rcvlowat = 1;
  1033. sk->rcvtimeo = MAX_SCHEDULE_TIMEOUT;
  1034. sk->sndtimeo = MAX_SCHEDULE_TIMEOUT;
  1035. atomic_set(&sk->refcnt, 1);
  1036. }