Example #1
0
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;
}
Example #2
0
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;
}