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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Routines having to do with the 'struct sk_buff' memory handlers.
  3.  *
  4.  * Authors: Alan Cox <iiitac@pyr.swan.ac.uk>
  5.  * Florian La Roche <rzsfl@rz.uni-sb.de>
  6.  *
  7.  * Version: $Id: skbuff.c,v 1.90 2001/11/07 05:56:19 davem Exp $
  8.  *
  9.  * Fixes:
  10.  * Alan Cox : Fixed the worst of the load balancer bugs.
  11.  * Dave Platt : Interrupt stacking fix.
  12.  * Richard Kooijman : Timestamp fixes.
  13.  * Alan Cox : Changed buffer format.
  14.  * Alan Cox : destructor hook for AF_UNIX etc.
  15.  * Linus Torvalds : Better skb_clone.
  16.  * Alan Cox : Added skb_copy.
  17.  * Alan Cox : Added all the changed routines Linus
  18.  * only put in the headers
  19.  * Ray VanTassle : Fixed --skb->lock in free
  20.  * Alan Cox : skb_copy copy arp field
  21.  * Andi Kleen : slabified it.
  22.  *
  23.  * NOTE:
  24.  * The __skb_ routines should be called with interrupts 
  25.  * disabled, or you better be *real* sure that the operation is atomic 
  26.  * with respect to whatever list is being frobbed (e.g. via lock_sock()
  27.  * or via disabling bottom half handlers, etc).
  28.  *
  29.  * This program is free software; you can redistribute it and/or
  30.  * modify it under the terms of the GNU General Public License
  31.  * as published by the Free Software Foundation; either version
  32.  * 2 of the License, or (at your option) any later version.
  33.  */
  34. /*
  35.  * The functions in this file will not compile correctly with gcc 2.4.x
  36.  */
  37. #include <linux/config.h>
  38. #include <linux/types.h>
  39. #include <linux/kernel.h>
  40. #include <linux/sched.h>
  41. #include <linux/mm.h>
  42. #include <linux/interrupt.h>
  43. #include <linux/in.h>
  44. #include <linux/inet.h>
  45. #include <linux/slab.h>
  46. #include <linux/netdevice.h>
  47. #include <linux/string.h>
  48. #include <linux/skbuff.h>
  49. #include <linux/cache.h>
  50. #include <linux/rtnetlink.h>
  51. #include <linux/init.h>
  52. #include <linux/highmem.h>
  53. #include <net/protocol.h>
  54. #include <net/dst.h>
  55. #include <net/sock.h>
  56. #include <net/checksum.h>
  57. #include <asm/uaccess.h>
  58. #include <asm/system.h>
  59. int sysctl_hot_list_len = 128;
  60. static kmem_cache_t *skbuff_head_cache;
  61. static union {
  62. struct sk_buff_head list;
  63. char pad[SMP_CACHE_BYTES];
  64. } skb_head_pool[NR_CPUS];
  65. /*
  66.  * Keep out-of-line to prevent kernel bloat.
  67.  * __builtin_return_address is not used because it is not always
  68.  * reliable. 
  69.  */
  70. /**
  71.  * skb_over_panic -  private function
  72.  * @skb: buffer
  73.  * @sz: size
  74.  * @here: address
  75.  *
  76.  * Out of line support code for skb_put(). Not user callable.
  77.  */
  78.  
  79. void skb_over_panic(struct sk_buff *skb, int sz, void *here)
  80. {
  81. printk("skput:over: %p:%d put:%d dev:%s", 
  82. here, skb->len, sz, skb->dev ? skb->dev->name : "<NULL>");
  83. BUG();
  84. }
  85. /**
  86.  * skb_under_panic -  private function
  87.  * @skb: buffer
  88.  * @sz: size
  89.  * @here: address
  90.  *
  91.  * Out of line support code for skb_push(). Not user callable.
  92.  */
  93.  
  94. void skb_under_panic(struct sk_buff *skb, int sz, void *here)
  95. {
  96.         printk("skput:under: %p:%d put:%d dev:%s",
  97.                 here, skb->len, sz, skb->dev ? skb->dev->name : "<NULL>");
  98. BUG();
  99. }
  100. static __inline__ struct sk_buff *skb_head_from_pool(void)
  101. {
  102. struct sk_buff_head *list = &skb_head_pool[smp_processor_id()].list;
  103. if (skb_queue_len(list)) {
  104. struct sk_buff *skb;
  105. unsigned long flags;
  106. local_irq_save(flags);
  107. skb = __skb_dequeue(list);
  108. local_irq_restore(flags);
  109. return skb;
  110. }
  111. return NULL;
  112. }
  113. static __inline__ void skb_head_to_pool(struct sk_buff *skb)
  114. {
  115. struct sk_buff_head *list = &skb_head_pool[smp_processor_id()].list;
  116. if (skb_queue_len(list) < sysctl_hot_list_len) {
  117. unsigned long flags;
  118. local_irq_save(flags);
  119. __skb_queue_head(list, skb);
  120. local_irq_restore(flags);
  121. return;
  122. }
  123. kmem_cache_free(skbuff_head_cache, skb);
  124. }
  125. /*  Allocate a new skbuff. We do this ourselves so we can fill in a few
  126.  * 'private' fields and also do memory statistics to find all the
  127.  * [BEEP] leaks.
  128.  * 
  129.  */
  130. /**
  131.  * alloc_skb - allocate a network buffer
  132.  * @size: size to allocate
  133.  * @gfp_mask: allocation mask
  134.  *
  135.  * Allocate a new &sk_buff. The returned buffer has no headroom and a
  136.  * tail room of size bytes. The object has a reference count of one.
  137.  * The return is the buffer. On a failure the return is %NULL.
  138.  *
  139.  * Buffers may only be allocated from interrupts using a @gfp_mask of
  140.  * %GFP_ATOMIC.
  141.  */
  142.  
  143. struct sk_buff *alloc_skb(unsigned int size,int gfp_mask)
  144. {
  145. struct sk_buff *skb;
  146. u8 *data;
  147. if (in_interrupt() && (gfp_mask & __GFP_WAIT)) {
  148. static int count = 0;
  149. if (++count < 5) {
  150. printk(KERN_ERR "alloc_skb called nonatomically "
  151.        "from interrupt %pn", NET_CALLER(size));
  152.   BUG();
  153. }
  154. gfp_mask &= ~__GFP_WAIT;
  155. }
  156. /* Get the HEAD */
  157. skb = skb_head_from_pool();
  158. if (skb == NULL) {
  159. skb = kmem_cache_alloc(skbuff_head_cache, gfp_mask & ~__GFP_DMA);
  160. if (skb == NULL)
  161. goto nohead;
  162. }
  163. /* Get the DATA. Size must match skb_add_mtu(). */
  164. size = SKB_DATA_ALIGN(size);
  165. data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
  166. if (data == NULL)
  167. goto nodata;
  168. /* XXX: does not include slab overhead */ 
  169. skb->truesize = size + sizeof(struct sk_buff);
  170. /* Load the data pointers. */
  171. skb->head = data;
  172. skb->data = data;
  173. skb->tail = data;
  174. skb->end = data + size;
  175. /* Set up other state */
  176. skb->len = 0;
  177. skb->cloned = 0;
  178. skb->data_len = 0;
  179. atomic_set(&skb->users, 1); 
  180. atomic_set(&(skb_shinfo(skb)->dataref), 1);
  181. skb_shinfo(skb)->nr_frags = 0;
  182. skb_shinfo(skb)->frag_list = NULL;
  183. return skb;
  184. nodata:
  185. skb_head_to_pool(skb);
  186. nohead:
  187. return NULL;
  188. }
  189. /*
  190.  * Slab constructor for a skb head. 
  191.  */ 
  192. static inline void skb_headerinit(void *p, kmem_cache_t *cache, 
  193.   unsigned long flags)
  194. {
  195. struct sk_buff *skb = p;
  196. skb->next = NULL;
  197. skb->prev = NULL;
  198. skb->list = NULL;
  199. skb->sk = NULL;
  200. skb->stamp.tv_sec=0; /* No idea about time */
  201. skb->dev = NULL;
  202. skb->dst = NULL;
  203. memset(skb->cb, 0, sizeof(skb->cb));
  204. skb->pkt_type = PACKET_HOST; /* Default type */
  205. skb->ip_summed = 0;
  206. skb->priority = 0;
  207. skb->security = 0; /* By default packets are insecure */
  208. skb->destructor = NULL;
  209. #ifdef CONFIG_NETFILTER
  210. skb->nfmark = skb->nfcache = 0;
  211. skb->nfct = NULL;
  212. #ifdef CONFIG_NETFILTER_DEBUG
  213. skb->nf_debug = 0;
  214. #endif
  215. #endif
  216. #ifdef CONFIG_NET_SCHED
  217. skb->tc_index = 0;
  218. #endif
  219. }
  220. static void skb_drop_fraglist(struct sk_buff *skb)
  221. {
  222. struct sk_buff *list = skb_shinfo(skb)->frag_list;
  223. skb_shinfo(skb)->frag_list = NULL;
  224. do {
  225. struct sk_buff *this = list;
  226. list = list->next;
  227. kfree_skb(this);
  228. } while (list);
  229. }
  230. static void skb_clone_fraglist(struct sk_buff *skb)
  231. {
  232. struct sk_buff *list;
  233. for (list = skb_shinfo(skb)->frag_list; list; list=list->next)
  234. skb_get(list);
  235. }
  236. static void skb_release_data(struct sk_buff *skb)
  237. {
  238. if (!skb->cloned ||
  239.     atomic_dec_and_test(&(skb_shinfo(skb)->dataref))) {
  240. if (skb_shinfo(skb)->nr_frags) {
  241. int i;
  242. for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
  243. put_page(skb_shinfo(skb)->frags[i].page);
  244. }
  245. if (skb_shinfo(skb)->frag_list)
  246. skb_drop_fraglist(skb);
  247. kfree(skb->head);
  248. }
  249. }
  250. /*
  251.  * Free an skbuff by memory without cleaning the state. 
  252.  */
  253. void kfree_skbmem(struct sk_buff *skb)
  254. {
  255. skb_release_data(skb);
  256. skb_head_to_pool(skb);
  257. }
  258. /**
  259.  * __kfree_skb - private function 
  260.  * @skb: buffer
  261.  *
  262.  * Free an sk_buff. Release anything attached to the buffer. 
  263.  * Clean the state. This is an internal helper function. Users should
  264.  * always call kfree_skb
  265.  */
  266. void __kfree_skb(struct sk_buff *skb)
  267. {
  268. if (skb->list) {
  269.   printk(KERN_WARNING "Warning: kfree_skb passed an skb still "
  270.        "on a list (from %p).n", NET_CALLER(skb));
  271. BUG();
  272. }
  273. dst_release(skb->dst);
  274. if(skb->destructor) {
  275. if (in_irq()) {
  276. printk(KERN_WARNING "Warning: kfree_skb on hard IRQ %pn",
  277. NET_CALLER(skb));
  278. }
  279. skb->destructor(skb);
  280. }
  281. #ifdef CONFIG_NETFILTER
  282. nf_conntrack_put(skb->nfct);
  283. #endif
  284. skb_headerinit(skb, NULL, 0);  /* clean state */
  285. kfree_skbmem(skb);
  286. }
  287. /**
  288.  * skb_clone - duplicate an sk_buff
  289.  * @skb: buffer to clone
  290.  * @gfp_mask: allocation priority
  291.  *
  292.  * Duplicate an &sk_buff. The new one is not owned by a socket. Both
  293.  * copies share the same packet data but not structure. The new
  294.  * buffer has a reference count of 1. If the allocation fails the 
  295.  * function returns %NULL otherwise the new buffer is returned.
  296.  *
  297.  * If this function is called from an interrupt gfp_mask() must be
  298.  * %GFP_ATOMIC.
  299.  */
  300. struct sk_buff *skb_clone(struct sk_buff *skb, int gfp_mask)
  301. {
  302. struct sk_buff *n;
  303. n = skb_head_from_pool();
  304. if (!n) {
  305. n = kmem_cache_alloc(skbuff_head_cache, gfp_mask);
  306. if (!n)
  307. return NULL;
  308. }
  309. #define C(x) n->x = skb->x
  310. n->next = n->prev = NULL;
  311. n->list = NULL;
  312. n->sk = NULL;
  313. C(stamp);
  314. C(dev);
  315. C(h);
  316. C(nh);
  317. C(mac);
  318. C(dst);
  319. dst_clone(n->dst);
  320. memcpy(n->cb, skb->cb, sizeof(skb->cb));
  321. C(len);
  322. C(data_len);
  323. C(csum);
  324. n->cloned = 1;
  325. C(pkt_type);
  326. C(ip_summed);
  327. C(priority);
  328. atomic_set(&n->users, 1);
  329. C(protocol);
  330. C(security);
  331. C(truesize);
  332. C(head);
  333. C(data);
  334. C(tail);
  335. C(end);
  336. n->destructor = NULL;
  337. #ifdef CONFIG_NETFILTER
  338. C(nfmark);
  339. C(nfcache);
  340. C(nfct);
  341. #ifdef CONFIG_NETFILTER_DEBUG
  342. C(nf_debug);
  343. #endif
  344. #endif /*CONFIG_NETFILTER*/
  345. #if defined(CONFIG_HIPPI)
  346. C(private);
  347. #endif
  348. #ifdef CONFIG_NET_SCHED
  349. C(tc_index);
  350. #endif
  351. atomic_inc(&(skb_shinfo(skb)->dataref));
  352. skb->cloned = 1;
  353. #ifdef CONFIG_NETFILTER
  354. nf_conntrack_get(skb->nfct);
  355. #endif
  356. return n;
  357. }
  358. static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
  359. {
  360. /*
  361.  * Shift between the two data areas in bytes
  362.  */
  363. unsigned long offset = new->data - old->data;
  364. new->list=NULL;
  365. new->sk=NULL;
  366. new->dev=old->dev;
  367. new->priority=old->priority;
  368. new->protocol=old->protocol;
  369. new->dst=dst_clone(old->dst);
  370. new->h.raw=old->h.raw+offset;
  371. new->nh.raw=old->nh.raw+offset;
  372. new->mac.raw=old->mac.raw+offset;
  373. memcpy(new->cb, old->cb, sizeof(old->cb));
  374. atomic_set(&new->users, 1);
  375. new->pkt_type=old->pkt_type;
  376. new->stamp=old->stamp;
  377. new->destructor = NULL;
  378. new->security=old->security;
  379. #ifdef CONFIG_NETFILTER
  380. new->nfmark=old->nfmark;
  381. new->nfcache=old->nfcache;
  382. new->nfct=old->nfct;
  383. nf_conntrack_get(new->nfct);
  384. #ifdef CONFIG_NETFILTER_DEBUG
  385. new->nf_debug=old->nf_debug;
  386. #endif
  387. #endif
  388. #ifdef CONFIG_NET_SCHED
  389. new->tc_index = old->tc_index;
  390. #endif
  391. }
  392. /**
  393.  * skb_copy - create private copy of an sk_buff
  394.  * @skb: buffer to copy
  395.  * @gfp_mask: allocation priority
  396.  *
  397.  * Make a copy of both an &sk_buff and its data. This is used when the
  398.  * caller wishes to modify the data and needs a private copy of the 
  399.  * data to alter. Returns %NULL on failure or the pointer to the buffer
  400.  * on success. The returned buffer has a reference count of 1.
  401.  *
  402.  * As by-product this function converts non-linear &sk_buff to linear
  403.  * one, so that &sk_buff becomes completely private and caller is allowed
  404.  * to modify all the data of returned buffer. This means that this
  405.  * function is not recommended for use in circumstances when only
  406.  * header is going to be modified. Use pskb_copy() instead.
  407.  */
  408.  
  409. struct sk_buff *skb_copy(const struct sk_buff *skb, int gfp_mask)
  410. {
  411. struct sk_buff *n;
  412. int headerlen = skb->data-skb->head;
  413. /*
  414.  * Allocate the copy buffer
  415.  */
  416. n=alloc_skb(skb->end - skb->head + skb->data_len, gfp_mask);
  417. if(n==NULL)
  418. return NULL;
  419. /* Set the data pointer */
  420. skb_reserve(n,headerlen);
  421. /* Set the tail pointer and length */
  422. skb_put(n,skb->len);
  423. n->csum = skb->csum;
  424. n->ip_summed = skb->ip_summed;
  425. if (skb_copy_bits(skb, -headerlen, n->head, headerlen+skb->len))
  426. BUG();
  427. copy_skb_header(n, skb);
  428. return n;
  429. }
  430. /* Keep head the same: replace data */
  431. int skb_linearize(struct sk_buff *skb, int gfp_mask)
  432. {
  433. unsigned int size;
  434. u8 *data;
  435. long offset;
  436. int headerlen = skb->data - skb->head;
  437. int expand = (skb->tail+skb->data_len) - skb->end;
  438. if (skb_shared(skb))
  439. BUG();
  440. if (expand <= 0)
  441. expand = 0;
  442. size = (skb->end - skb->head + expand);
  443. size = SKB_DATA_ALIGN(size);
  444. data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
  445. if (data == NULL)
  446. return -ENOMEM;
  447. /* Copy entire thing */
  448. if (skb_copy_bits(skb, -headerlen, data, headerlen+skb->len))
  449. BUG();
  450. /* Offset between the two in bytes */
  451. offset = data - skb->head;
  452. /* Free old data. */
  453. skb_release_data(skb);
  454. skb->head = data;
  455. skb->end  = data + size;
  456. /* Set up new pointers */
  457. skb->h.raw += offset;
  458. skb->nh.raw += offset;
  459. skb->mac.raw += offset;
  460. skb->tail += offset;
  461. skb->data += offset;
  462. /* Set up shinfo */
  463. atomic_set(&(skb_shinfo(skb)->dataref), 1);
  464. skb_shinfo(skb)->nr_frags = 0;
  465. skb_shinfo(skb)->frag_list = NULL;
  466. /* We are no longer a clone, even if we were. */
  467. skb->cloned = 0;
  468. skb->tail += skb->data_len;
  469. skb->data_len = 0;
  470. return 0;
  471. }
  472. /**
  473.  * pskb_copy - create copy of an sk_buff with private head.
  474.  * @skb: buffer to copy
  475.  * @gfp_mask: allocation priority
  476.  *
  477.  * Make a copy of both an &sk_buff and part of its data, located
  478.  * in header. Fragmented data remain shared. This is used when
  479.  * the caller wishes to modify only header of &sk_buff and needs
  480.  * private copy of the header to alter. Returns %NULL on failure
  481.  * or the pointer to the buffer on success.
  482.  * The returned buffer has a reference count of 1.
  483.  */
  484. struct sk_buff *pskb_copy(struct sk_buff *skb, int gfp_mask)
  485. {
  486. struct sk_buff *n;
  487. /*
  488.  * Allocate the copy buffer
  489.  */
  490. n=alloc_skb(skb->end - skb->head, gfp_mask);
  491. if(n==NULL)
  492. return NULL;
  493. /* Set the data pointer */
  494. skb_reserve(n,skb->data-skb->head);
  495. /* Set the tail pointer and length */
  496. skb_put(n,skb_headlen(skb));
  497. /* Copy the bytes */
  498. memcpy(n->data, skb->data, n->len);
  499. n->csum = skb->csum;
  500. n->ip_summed = skb->ip_summed;
  501. n->data_len = skb->data_len;
  502. n->len = skb->len;
  503. if (skb_shinfo(skb)->nr_frags) {
  504. int i;
  505. for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
  506. skb_shinfo(n)->frags[i] = skb_shinfo(skb)->frags[i];
  507. get_page(skb_shinfo(n)->frags[i].page);
  508. }
  509. skb_shinfo(n)->nr_frags = i;
  510. }
  511. if (skb_shinfo(skb)->frag_list) {
  512. skb_shinfo(n)->frag_list = skb_shinfo(skb)->frag_list;
  513. skb_clone_fraglist(n);
  514. }
  515. copy_skb_header(n, skb);
  516. return n;
  517. }
  518. /**
  519.  * pskb_expand_head - reallocate header of &sk_buff
  520.  * @skb: buffer to reallocate
  521.  * @nhead: room to add at head
  522.  * @ntail: room to add at tail
  523.  * @gfp_mask: allocation priority
  524.  *
  525.  * Expands (or creates identical copy, if &nhead and &ntail are zero)
  526.  * header of skb. &sk_buff itself is not changed. &sk_buff MUST have
  527.  * reference count of 1. Returns zero in the case of success or error,
  528.  * if expansion failed. In the last case, &sk_buff is not changed.
  529.  *
  530.  * All the pointers pointing into skb header may change and must be
  531.  * reloaded after call to this function.
  532.  */
  533. int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, int gfp_mask)
  534. {
  535. int i;
  536. u8 *data;
  537. int size = nhead + (skb->end - skb->head) + ntail;
  538. long off;
  539. if (skb_shared(skb))
  540. BUG();
  541. size = SKB_DATA_ALIGN(size);
  542. data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask);
  543. if (data == NULL)
  544. goto nodata;
  545. /* Copy only real data... and, alas, header. This should be
  546.  * optimized for the cases when header is void. */
  547. memcpy(data+nhead, skb->head, skb->tail-skb->head);
  548. memcpy(data+size, skb->end, sizeof(struct skb_shared_info));
  549. for (i=0; i<skb_shinfo(skb)->nr_frags; i++)
  550. get_page(skb_shinfo(skb)->frags[i].page);
  551. if (skb_shinfo(skb)->frag_list)
  552. skb_clone_fraglist(skb);
  553. skb_release_data(skb);
  554. off = (data+nhead) - skb->head;
  555. skb->head = data;
  556. skb->end  = data+size;
  557. skb->data += off;
  558. skb->tail += off;
  559. skb->mac.raw += off;
  560. skb->h.raw += off;
  561. skb->nh.raw += off;
  562. skb->cloned = 0;
  563. atomic_set(&skb_shinfo(skb)->dataref, 1);
  564. return 0;
  565. nodata:
  566. return -ENOMEM;
  567. }
  568. /* Make private copy of skb with writable head and some headroom */
  569. struct sk_buff *
  570. skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom)
  571. {
  572. struct sk_buff *skb2;
  573. int delta = headroom - skb_headroom(skb);
  574. if (delta <= 0)
  575. return pskb_copy(skb, GFP_ATOMIC);
  576. skb2 = skb_clone(skb, GFP_ATOMIC);
  577. if (skb2 == NULL ||
  578.     !pskb_expand_head(skb2, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC))
  579. return skb2;
  580. kfree_skb(skb2);
  581. return NULL;
  582. }
  583. /**
  584.  * skb_copy_expand - copy and expand sk_buff
  585.  * @skb: buffer to copy
  586.  * @newheadroom: new free bytes at head
  587.  * @newtailroom: new free bytes at tail
  588.  * @gfp_mask: allocation priority
  589.  *
  590.  * Make a copy of both an &sk_buff and its data and while doing so 
  591.  * allocate additional space.
  592.  *
  593.  * This is used when the caller wishes to modify the data and needs a 
  594.  * private copy of the data to alter as well as more space for new fields.
  595.  * Returns %NULL on failure or the pointer to the buffer
  596.  * on success. The returned buffer has a reference count of 1.
  597.  *
  598.  * You must pass %GFP_ATOMIC as the allocation priority if this function
  599.  * is called from an interrupt.
  600.  */
  601.  
  602. struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
  603. int newheadroom,
  604. int newtailroom,
  605. int gfp_mask)
  606. {
  607. struct sk_buff *n;
  608. /*
  609.  * Allocate the copy buffer
  610.  */
  611.    
  612. n=alloc_skb(newheadroom + skb->len + newtailroom,
  613.     gfp_mask);
  614. if(n==NULL)
  615. return NULL;
  616. skb_reserve(n,newheadroom);
  617. /* Set the tail pointer and length */
  618. skb_put(n,skb->len);
  619. /* Copy the data only. */
  620. if (skb_copy_bits(skb, 0, n->data, skb->len))
  621. BUG();
  622. copy_skb_header(n, skb);
  623. return n;
  624. }
  625. /* Trims skb to length len. It can change skb pointers, if "realloc" is 1.
  626.  * If realloc==0 and trimming is impossible without change of data,
  627.  * it is BUG().
  628.  */
  629. int ___pskb_trim(struct sk_buff *skb, unsigned int len, int realloc)
  630. {
  631. int offset = skb_headlen(skb);
  632. int nfrags = skb_shinfo(skb)->nr_frags;
  633. int i;
  634. for (i=0; i<nfrags; i++) {
  635. int end = offset + skb_shinfo(skb)->frags[i].size;
  636. if (end > len) {
  637. if (skb_cloned(skb)) {
  638. if (!realloc)
  639. BUG();
  640. if (!pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
  641. return -ENOMEM;
  642. }
  643. if (len <= offset) {
  644. put_page(skb_shinfo(skb)->frags[i].page);
  645. skb_shinfo(skb)->nr_frags--;
  646. } else {
  647. skb_shinfo(skb)->frags[i].size = len-offset;
  648. }
  649. }
  650. offset = end;
  651. }
  652. if (offset < len) {
  653. skb->data_len -= skb->len - len;
  654. skb->len = len;
  655. } else {
  656. if (len <= skb_headlen(skb)) {
  657. skb->len = len;
  658. skb->data_len = 0;
  659. skb->tail = skb->data + len;
  660. if (skb_shinfo(skb)->frag_list && !skb_cloned(skb))
  661. skb_drop_fraglist(skb);
  662. } else {
  663. skb->data_len -= skb->len - len;
  664. skb->len = len;
  665. }
  666. }
  667. return 0;
  668. }
  669. /**
  670.  * __pskb_pull_tail - advance tail of skb header 
  671.  * @skb: buffer to reallocate
  672.  * @delta: number of bytes to advance tail
  673.  *
  674.  * The function makes a sense only on a fragmented &sk_buff,
  675.  * it expands header moving its tail forward and copying necessary
  676.  * data from fragmented part.
  677.  *
  678.  * &sk_buff MUST have reference count of 1.
  679.  *
  680.  * Returns %NULL (and &sk_buff does not change) if pull failed
  681.  * or value of new tail of skb in the case of success.
  682.  *
  683.  * All the pointers pointing into skb header may change and must be
  684.  * reloaded after call to this function.
  685.  */
  686. /* Moves tail of skb head forward, copying data from fragmented part,
  687.  * when it is necessary.
  688.  * 1. It may fail due to malloc failure.
  689.  * 2. It may change skb pointers.
  690.  *
  691.  * It is pretty complicated. Luckily, it is called only in exceptional cases.
  692.  */
  693. unsigned char * __pskb_pull_tail(struct sk_buff *skb, int delta)
  694. {
  695. int i, k, eat;
  696. /* If skb has not enough free space at tail, get new one
  697.  * plus 128 bytes for future expansions. If we have enough
  698.  * room at tail, reallocate without expansion only if skb is cloned.
  699.  */
  700. eat = (skb->tail+delta) - skb->end;
  701. if (eat > 0 || skb_cloned(skb)) {
  702. if (pskb_expand_head(skb, 0, eat>0 ? eat+128 : 0, GFP_ATOMIC))
  703. return NULL;
  704. }
  705. if (skb_copy_bits(skb, skb_headlen(skb), skb->tail, delta))
  706. BUG();
  707. /* Optimization: no fragments, no reasons to preestimate
  708.  * size of pulled pages. Superb.
  709.  */
  710. if (skb_shinfo(skb)->frag_list == NULL)
  711. goto pull_pages;
  712. /* Estimate size of pulled pages. */
  713. eat = delta;
  714. for (i=0; i<skb_shinfo(skb)->nr_frags; i++) {
  715. if (skb_shinfo(skb)->frags[i].size >= eat)
  716. goto pull_pages;
  717. eat -= skb_shinfo(skb)->frags[i].size;
  718. }
  719. /* If we need update frag list, we are in troubles.
  720.  * Certainly, it possible to add an offset to skb data,
  721.  * but taking into account that pulling is expected to
  722.  * be very rare operation, it is worth to fight against
  723.  * further bloating skb head and crucify ourselves here instead.
  724.  * Pure masohism, indeed. 8)8)
  725.  */
  726. if (eat) {
  727. struct sk_buff *list = skb_shinfo(skb)->frag_list;
  728. struct sk_buff *clone = NULL;
  729. struct sk_buff *insp = NULL;
  730. do {
  731. if (list == NULL)
  732. BUG();
  733. if (list->len <= eat) {
  734. /* Eaten as whole. */
  735. eat -= list->len;
  736. list = list->next;
  737. insp = list;
  738. } else {
  739. /* Eaten partially. */
  740. if (skb_shared(list)) {
  741. /* Sucks! We need to fork list. :-( */
  742. clone = skb_clone(list, GFP_ATOMIC);
  743. if (clone == NULL)
  744. return NULL;
  745. insp = list->next;
  746. list = clone;
  747. } else {
  748. /* This may be pulled without
  749.  * problems. */
  750. insp = list;
  751. }
  752. if (pskb_pull(list, eat) == NULL) {
  753. if (clone)
  754. kfree_skb(clone);
  755. return NULL;
  756. }
  757. break;
  758. }
  759. } while (eat);
  760. /* Free pulled out fragments. */
  761. while ((list = skb_shinfo(skb)->frag_list) != insp) {
  762. skb_shinfo(skb)->frag_list = list->next;
  763. kfree_skb(list);
  764. }
  765. /* And insert new clone at head. */
  766. if (clone) {
  767. clone->next = list;
  768. skb_shinfo(skb)->frag_list = clone;
  769. }
  770. }
  771. /* Success! Now we may commit changes to skb data. */
  772. pull_pages:
  773. eat = delta;
  774. k = 0;
  775. for (i=0; i<skb_shinfo(skb)->nr_frags; i++) {
  776. if (skb_shinfo(skb)->frags[i].size <= eat) {
  777. put_page(skb_shinfo(skb)->frags[i].page);
  778. eat -= skb_shinfo(skb)->frags[i].size;
  779. } else {
  780. skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i];
  781. if (eat) {
  782. skb_shinfo(skb)->frags[k].page_offset += eat;
  783. skb_shinfo(skb)->frags[k].size -= eat;
  784. eat = 0;
  785. }
  786. k++;
  787. }
  788. }
  789. skb_shinfo(skb)->nr_frags = k;
  790. skb->tail += delta;
  791. skb->data_len -= delta;
  792. return skb->tail;
  793. }
  794. /* Copy some data bits from skb to kernel buffer. */
  795. int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
  796. {
  797. int i, copy;
  798. int start = skb->len - skb->data_len;
  799. if (offset > (int)skb->len-len)
  800. goto fault;
  801. /* Copy header. */
  802. if ((copy = start-offset) > 0) {
  803. if (copy > len)
  804. copy = len;
  805. memcpy(to, skb->data + offset, copy);
  806. if ((len -= copy) == 0)
  807. return 0;
  808. offset += copy;
  809. to += copy;
  810. }
  811. for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
  812. int end;
  813. BUG_TRAP(start <= offset+len);
  814. end = start + skb_shinfo(skb)->frags[i].size;
  815. if ((copy = end-offset) > 0) {
  816. u8 *vaddr;
  817. if (copy > len)
  818. copy = len;
  819. vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]);
  820. memcpy(to, vaddr+skb_shinfo(skb)->frags[i].page_offset+
  821.        offset-start, copy);
  822. kunmap_skb_frag(vaddr);
  823. if ((len -= copy) == 0)
  824. return 0;
  825. offset += copy;
  826. to += copy;
  827. }
  828. start = end;
  829. }
  830. if (skb_shinfo(skb)->frag_list) {
  831. struct sk_buff *list;
  832. for (list = skb_shinfo(skb)->frag_list; list; list=list->next) {
  833. int end;
  834. BUG_TRAP(start <= offset+len);
  835. end = start + list->len;
  836. if ((copy = end-offset) > 0) {
  837. if (copy > len)
  838. copy = len;
  839. if (skb_copy_bits(list, offset-start, to, copy))
  840. goto fault;
  841. if ((len -= copy) == 0)
  842. return 0;
  843. offset += copy;
  844. to += copy;
  845. }
  846. start = end;
  847. }
  848. }
  849. if (len == 0)
  850. return 0;
  851. fault:
  852. return -EFAULT;
  853. }
  854. /* Checksum skb data. */
  855. unsigned int skb_checksum(const struct sk_buff *skb, int offset, int len, unsigned int csum)
  856. {
  857. int i, copy;
  858. int start = skb->len - skb->data_len;
  859. int pos = 0;
  860. /* Checksum header. */
  861. if ((copy = start-offset) > 0) {
  862. if (copy > len)
  863. copy = len;
  864. csum = csum_partial(skb->data+offset, copy, csum);
  865. if ((len -= copy) == 0)
  866. return csum;
  867. offset += copy;
  868. pos = copy;
  869. }
  870. for (i=0; i<skb_shinfo(skb)->nr_frags; i++) {
  871. int end;
  872. BUG_TRAP(start <= offset+len);
  873. end = start + skb_shinfo(skb)->frags[i].size;
  874. if ((copy = end-offset) > 0) {
  875. unsigned int csum2;
  876. u8 *vaddr;
  877. skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
  878. if (copy > len)
  879. copy = len;
  880. vaddr = kmap_skb_frag(frag);
  881. csum2 = csum_partial(vaddr + frag->page_offset +
  882.      offset-start, copy, 0);
  883. kunmap_skb_frag(vaddr);
  884. csum = csum_block_add(csum, csum2, pos);
  885. if (!(len -= copy))
  886. return csum;
  887. offset += copy;
  888. pos += copy;
  889. }
  890. start = end;
  891. }
  892. if (skb_shinfo(skb)->frag_list) {
  893. struct sk_buff *list;
  894. for (list = skb_shinfo(skb)->frag_list; list; list=list->next) {
  895. int end;
  896. BUG_TRAP(start <= offset+len);
  897. end = start + list->len;
  898. if ((copy = end-offset) > 0) {
  899. unsigned int csum2;
  900. if (copy > len)
  901. copy = len;
  902. csum2 = skb_checksum(list, offset-start, copy, 0);
  903. csum = csum_block_add(csum, csum2, pos);
  904. if ((len -= copy) == 0)
  905. return csum;
  906. offset += copy;
  907. pos += copy;
  908. }
  909. start = end;
  910. }
  911. }
  912. if (len == 0)
  913. return csum;
  914. BUG();
  915. return csum;
  916. }
  917. /* Both of above in one bottle. */
  918. unsigned int skb_copy_and_csum_bits(const struct sk_buff *skb, int offset, u8 *to, int len, unsigned int csum)
  919. {
  920. int i, copy;
  921. int start = skb->len - skb->data_len;
  922. int pos = 0;
  923. /* Copy header. */
  924. if ((copy = start-offset) > 0) {
  925. if (copy > len)
  926. copy = len;
  927. csum = csum_partial_copy_nocheck(skb->data+offset, to, copy, csum);
  928. if ((len -= copy) == 0)
  929. return csum;
  930. offset += copy;
  931. to += copy;
  932. pos = copy;
  933. }
  934. for (i=0; i<skb_shinfo(skb)->nr_frags; i++) {
  935. int end;
  936. BUG_TRAP(start <= offset+len);
  937. end = start + skb_shinfo(skb)->frags[i].size;
  938. if ((copy = end-offset) > 0) {
  939. unsigned int csum2;
  940. u8 *vaddr;
  941. skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
  942. if (copy > len)
  943. copy = len;
  944. vaddr = kmap_skb_frag(frag);
  945. csum2 = csum_partial_copy_nocheck(vaddr + frag->page_offset +
  946.       offset-start, to, copy, 0);
  947. kunmap_skb_frag(vaddr);
  948. csum = csum_block_add(csum, csum2, pos);
  949. if (!(len -= copy))
  950. return csum;
  951. offset += copy;
  952. to += copy;
  953. pos += copy;
  954. }
  955. start = end;
  956. }
  957. if (skb_shinfo(skb)->frag_list) {
  958. struct sk_buff *list;
  959. for (list = skb_shinfo(skb)->frag_list; list; list=list->next) {
  960. unsigned int csum2;
  961. int end;
  962. BUG_TRAP(start <= offset+len);
  963. end = start + list->len;
  964. if ((copy = end-offset) > 0) {
  965. if (copy > len)
  966. copy = len;
  967. csum2 = skb_copy_and_csum_bits(list, offset-start, to, copy, 0);
  968. csum = csum_block_add(csum, csum2, pos);
  969. if ((len -= copy) == 0)
  970. return csum;
  971. offset += copy;
  972. to += copy;
  973. pos += copy;
  974. }
  975. start = end;
  976. }
  977. }
  978. if (len == 0)
  979. return csum;
  980. BUG();
  981. return csum;
  982. }
  983. void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to)
  984. {
  985. unsigned int csum;
  986. long csstart;
  987. if (skb->ip_summed == CHECKSUM_HW)
  988. csstart = skb->h.raw - skb->data;
  989. else
  990. csstart = skb->len - skb->data_len;
  991. if (csstart > skb->len - skb->data_len)
  992. BUG();
  993. memcpy(to, skb->data, csstart);
  994. csum = 0;
  995. if (csstart != skb->len)
  996. csum = skb_copy_and_csum_bits(skb, csstart, to+csstart,
  997. skb->len-csstart, 0);
  998. if (skb->ip_summed == CHECKSUM_HW) {
  999. long csstuff = csstart + skb->csum;
  1000. *((unsigned short *)(to + csstuff)) = csum_fold(csum);
  1001. }
  1002. }
  1003. #if 0
  1004. /* 
  1005.  *  Tune the memory allocator for a new MTU size.
  1006.  */
  1007. void skb_add_mtu(int mtu)
  1008. {
  1009. /* Must match allocation in alloc_skb */
  1010. mtu = SKB_DATA_ALIGN(mtu) + sizeof(struct skb_shared_info);
  1011. kmem_add_cache_size(mtu);
  1012. }
  1013. #endif
  1014. void __init skb_init(void)
  1015. {
  1016. int i;
  1017. skbuff_head_cache = kmem_cache_create("skbuff_head_cache",
  1018.       sizeof(struct sk_buff),
  1019.       0,
  1020.       SLAB_HWCACHE_ALIGN,
  1021.       skb_headerinit, NULL);
  1022. if (!skbuff_head_cache)
  1023. panic("cannot create skbuff cache");
  1024. for (i=0; i<NR_CPUS; i++)
  1025. skb_queue_head_init(&skb_head_pool[i].list);
  1026. }