2009-12-07 17 views
9

Dowiedziałem się, że muszę zbudować nową strukturę sk_buff w module jądra i przekazać ją do mojego urządzenia sieciowego, ale nie mogę się domyślić, jak ustawić zmienne strukturalne dla prostego, surowego pakietu ethernetowego.Wysyłanie surowego pakietu ethernetowego z modułu jądra

To musi być łatwe, ale byłbym bardzo wdzięczny, gdyby ktoś mógł dać mi przykładowy kod, jak umieścić sk_buff razem.

Odpowiedz

10

Zapoznaj się z funkcją packet_sendmsg_spkt w net/packet/af_packet.c, aby uzyskać inspirację. Najtrudniejsze jest uzyskanie struct sock jeśli nie posiada gniazdo ...

Edit: Dodany podstawowy shell code:

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; 
} 
Powiązane problemy