c - Send a raw ethernet packet from inside a kernel module -
I found that I need to create a new sc_buff strait in the kernel module and pass it on my network device, but I do not understand how to set the straight variable for a simple raw ethernet packet.
It should be easy, but I appreciate it, if someone can give me a sample code to put together a skybuffer.
Take a look at the function packet_sendmsg_spkt
for the inspiration net / Packet / af_packet.c
Edit: An original code has been added:
P> Int sendpacket (straight socket * sock, structure net_device * dev, __be16 proto, zero * data, size_t lane) {struct sock * sk = sock-> gt; Struct sk_buff * skb; If return (! (Dev-> Flags and IFF_UP)) --ENETDOWN; If (lenan> dev-> mtu + dev-> hard_header_len) returns- EMSGSIZE; Skb = sock_wmalloc (sk, len + LL_RESERVED_SPACE (dev), 0, GFP_KERNEL); If return (skb == NULL) --ENOBUFS; / * FIXME: Save some space for broken drivers which automatically type * hard headers at transmission time. PPP * is a remarkable one, it should really be fixed at the driver level. * / Skb_reserve (skb, LL_RESERVED_SPACE (dev)); Skb_reset_network_header (SKB); / * Try to align the data correctly * / if (dev-> header_ops) {skb-> Data - = dev- & gt; Hard_header_len; Skb- & gt; Tail - = dev- & gt; Hard_header_len; If (Lennon & lt; dev- & gt; hard_header_len) skb_reset_network_header (skb); } Memcpy (skb_put (skb, len), data, lane); Skb- & gt; Protocol = prototype; Skb- & gt; Dev = dev; Skb- & gt; Priority = sk-> Sk_priority; Dev_queue_xmit (SKB); Return lan; }
Comments
Post a Comment