2009-12-07 80 views
9

我發現我需要在內核模塊中創建一個新的sk_buff結構並將其傳遞給我的網絡設備,但是我無法弄清楚的是如何設置一個簡單的原始以太網數據包的結構變量。從內核模塊發送一個原始以太網數據包

這很容易,但我真的很感激它,如果有人可以給我一個如何把sk_buff放在一起的示例代碼。

回答

10

看看功能packet_sendmsg_spktnet/packet/af_packet.c的靈感。難的是得到一個struct sock,如果你沒有一個插座...

編輯:增加了一個基本的代碼殼:

int sendpacket(struct socket *sock, struct net_device *dev, __be16 proto, void *data, size_t len) 
{ 
    struct sock *sk = sock->sk; 
    struct sk_buff *skb; 

    if (!(dev->flags & IFF_UP)) 
     return -ENETDOWN; 

    if (len > dev->mtu + dev->hard_header_len) 
     return -EMSGSIZE; 

    skb = sock_wmalloc(sk, len + LL_RESERVED_SPACE(dev), 0, GFP_KERNEL); 

    if (skb == NULL) 
     return -ENOBUFS; 

    /* FIXME: Save some space for broken drivers that write a 
    * hard header at transmission time by themselves. PPP is the 
    * notable one here. This should really be fixed at the driver level. 
    */ 
    skb_reserve(skb, LL_RESERVED_SPACE(dev)); 
    skb_reset_network_header(skb); 

    /* Try to align data part correctly */ 
    if (dev->header_ops) { 
     skb->data -= dev->hard_header_len; 
     skb->tail -= dev->hard_header_len; 
     if (len < dev->hard_header_len) 
      skb_reset_network_header(skb); 
    } 

    memcpy(skb_put(skb, len), data, len); 
    skb->protocol = proto; 
    skb->dev = dev; 
    skb->priority = sk->sk_priority; 

    dev_queue_xmit(skb); 

    return len; 
} 
相關問題