2009-12-07 3 views
9

Ich habe herausgefunden, dass ich eine neue sk_buff - Struktur im Kernel - Modul erstellen und an mein Netzwerkgerät weitergeben muss, aber was ich nicht herausfinden kann, ist, wie man die Strukturvariablen für ein einfaches rohes Ethernet-Paket.Ein rohen Ethernet - Paket aus einem Kernel - Modul senden

Das muss einfach sein, aber ich würde es wirklich schätzen, wenn jemand mir einen Beispielcode geben könnte, wie man den sk_buff zusammenstellt.

Antwort

10

Werfen Sie einen Blick auf die Funktion packet_sendmsg_spkt in net/packet/af_packet.c für Inspiration. Der schwierige Teil ist immer ein struct sock wenn Sie nicht über eine Steckdose haben ...

Edit: Added eine Basiscode-Shell:

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; 
}