2009-12-07 23 views
9

Çekirdek modülünde yeni bir sk_buff yapısı oluşturmam ve ağ aygıtıma aktarmam gerektiğini öğrendim, ancak ne anlayamadığım Basit bir ham ethernet paketi için yapı değişkenleri.Çekirdek modülünün içinden bir ham ethernet paketi gönderin

Bu kolay olmak zorundadır, ancak birisi bana sk_buff'ı nasıl bir araya getireceğine dair örnek bir kod verebilirse gerçekten çok memnun olurum.

cevap

10

İlham almak için net/packet/af_packet.c numaralı telefondan packet_sendmsg_spkt işlevine bir göz atın. Eğer bir soket yoksa zor kısmı ... Bir struct sock oluyor

Düzenleme: Eklendi temel kod kabuk:

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; 
} 
İlgili konular