static int handler(struct pnet_pack *pack) { struct sk_buff *skb; skb = (struct sk_buff *) pack->data; print_skb(skb); return NET_HND_FORWARD_DEFAULT; }
void release_sock (volatile struct sock *sk) { if (sk->blog) return; /* see if we have any packets built up. */ cli(); sk->inuse = 1; while (sk->back_log != NULL) { struct sk_buff *skb; sk->blog = 1; skb = sk->back_log; PRINTK ("release_sock: skb = %X:\n",skb); print_skb(skb); if (skb->next != skb) { sk->back_log = skb->next; skb->prev->next = skb->next; skb->next->prev = skb->prev; } else { sk->back_log = NULL; } sti(); PRINTK ("sk->back_log = %X\n",sk->back_log); if (sk->prot->rcv) sk->prot->rcv(skb, skb->dev, sk->opt, skb->saddr, skb->len, skb->daddr, 1, /* only used for/by raw sockets. */ (struct ip_protocol *)sk->pair); cli(); } sk->blog = 0; sk->inuse = 0; sti(); if (sk->dead && sk->state == TCP_CLOSE) { /* should be about 2 rtt's */ sk->time_wait.len = min (sk->rtt * 2, TCP_DONE_TIME); sk->timeout = TIME_DONE; reset_timer ((struct timer *)&sk->time_wait); } }
static int vnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev){ int err = 0; Vnet *vnet = dev->priv; int len = 0; if(!skb){ wprintf("> skb NULL!\n"); return -EINVAL; } if(!vnet){ return -ENOTCONN; } if(vnet->recursion++) { extern void print_skb(const char *msg, int count, struct sk_buff *skb); char vnetbuf[VNET_ID_BUF]; vnet->stats.collisions++; vnet->stats.tx_errors++; wprintf("> recursion! vnet=%s\n", VnetId_ntoa(&vnet->vnet, vnetbuf)); print_skb("RECURSION", 0, skb); varp_print(iostdout); kfree_skb(skb); goto exit; } if(!skb->mac.raw){ skb->mac.raw = skb->data; } len = skb->len; // Must not use skb pointer after vnet_skb_send(). err = vnet_skb_send(skb, &vnet->vnet); if(err < 0){ vnet->stats.tx_errors++; } else { vnet->stats.tx_packets++; vnet->stats.tx_bytes += len; } exit: vnet->recursion--; return 0; }