int skb_check(struct sk_buff *skb, int head, int line, char *file) { if (head) { if (skb->magic_debug_cookie != SK_HEAD_SKB) { printk("File: %s Line %d, found a bad skb-head\n", file,line); return -1; } if (!skb->next || !skb->prev) { printk("skb_check: head without next or prev\n"); return -1; } if (skb->next->magic_debug_cookie != SK_HEAD_SKB && skb->next->magic_debug_cookie != SK_GOOD_SKB) { printk("File: %s Line %d, bad next head-skb member\n", file,line); return -1; } if (skb->prev->magic_debug_cookie != SK_HEAD_SKB && skb->prev->magic_debug_cookie != SK_GOOD_SKB) { printk("File: %s Line %d, bad prev head-skb member\n", file,line); return -1; } #if 0 { struct sk_buff *skb2 = skb->next; int i = 0; while (skb2 != skb && i < 5) { if (skb_check(skb2, 0, line, file) < 0) { printk("bad queue element in whole queue\n"); return -1; } i++; skb2 = skb2->next; } } #endif return 0; } if (skb->next != NULL && skb->next->magic_debug_cookie != SK_HEAD_SKB && skb->next->magic_debug_cookie != SK_GOOD_SKB) { printk("File: %s Line %d, bad next skb member\n", file,line); return -1; } if (skb->prev != NULL && skb->prev->magic_debug_cookie != SK_HEAD_SKB && skb->prev->magic_debug_cookie != SK_GOOD_SKB) { printk("File: %s Line %d, bad prev skb member\n", file,line); return -1; } if(skb->magic_debug_cookie==SK_FREED_SKB) { printk("File: %s Line %d, found a freed skb lurking in the undergrowth!\n", file,line); printk("skb=%p, real size=%d, free=%d\n", skb,skb->truesize,skb->free); return -1; } if(skb->magic_debug_cookie!=SK_GOOD_SKB) { printk("File: %s Line %d, passed a non skb!\n", file,line); printk("skb=%p, real size=%d, free=%d\n", skb,skb->truesize,skb->free); return -1; } if(skb->head>skb->data) { printk("File: %s Line %d, head > data !\n", file,line); printk("skb=%p, head=%p, data=%p\n", skb,skb->head,skb->data); return -1; } if(skb->tail>skb->end) { printk("File: %s Line %d, tail > end!\n", file,line); printk("skb=%p, tail=%p, end=%p\n", skb,skb->tail,skb->end); return -1; } if(skb->data>skb->tail) { printk("File: %s Line %d, data > tail!\n", file,line); printk("skb=%p, data=%p, tail=%p\n", skb,skb->data,skb->tail); return -1; } if(skb->tail-skb->data!=skb->len) { printk("File: %s Line %d, wrong length\n", file,line); printk("skb=%p, data=%p, end=%p len=%ld\n", skb,skb->data,skb->end,skb->len); return -1; } if((unsigned long) skb->end > (unsigned long) skb) { printk("File: %s Line %d, control overrun\n", file,line); printk("skb=%p, end=%p\n", skb,skb->end); return -1; } /* Guess it might be acceptable then */ return 0; }
int skb_check(struct sk_buff *skb, int head, int line, char *file) { if (head) { if (skb->magic_debug_cookie != SK_HEAD_SKB) { printk("File: %s Line %d, found a bad skb-head\n", file,line); return -1; } if (!skb->next || !skb->prev) { printk("skb_check: head without next or prev\n"); return -1; } if (skb->next->magic_debug_cookie != SK_HEAD_SKB && skb->next->magic_debug_cookie != SK_GOOD_SKB) { printk("File: %s Line %d, bad next head-skb member\n", file,line); return -1; } if (skb->prev->magic_debug_cookie != SK_HEAD_SKB && skb->prev->magic_debug_cookie != SK_GOOD_SKB) { printk("File: %s Line %d, bad prev head-skb member\n", file,line); return -1; } #if 0 { struct sk_buff *skb2 = skb->next; int i = 0; while (skb2 != skb && i < 5) { if (skb_check(skb2, 0, line, file) < 0) { printk("bad queue element in whole queue\n"); return -1; } i++; skb2 = skb2->next; } } #endif return 0; } if (skb->next != NULL && skb->next->magic_debug_cookie != SK_HEAD_SKB && skb->next->magic_debug_cookie != SK_GOOD_SKB) { printk("File: %s Line %d, bad next skb member\n", file,line); return -1; } if (skb->prev != NULL && skb->prev->magic_debug_cookie != SK_HEAD_SKB && skb->prev->magic_debug_cookie != SK_GOOD_SKB) { printk("File: %s Line %d, bad prev skb member\n", file,line); return -1; } if(skb->magic_debug_cookie==SK_FREED_SKB) { printk("File: %s Line %d, found a freed skb lurking in the undergrowth!\n", file,line); printk("skb=%p, real size=%ld, claimed size=%ld, free=%d\n", skb,skb->truesize,skb->mem_len,skb->free); return -1; } if(skb->magic_debug_cookie!=SK_GOOD_SKB) { printk("File: %s Line %d, passed a non skb!\n", file,line); printk("skb=%p, real size=%ld, claimed size=%ld, free=%d\n", skb,skb->truesize,skb->mem_len,skb->free); return -1; } if(skb->mem_len!=skb->truesize) { printk("File: %s Line %d, Dubious size setting!\n",file,line); printk("skb=%p, real size=%ld, claimed size=%ld\n", skb,skb->truesize,skb->mem_len); return -1; } /* Guess it might be acceptable then */ return 0; }