[lkml]   [2001]   [Jan]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
SubjectCreate and Send Packet from Scratch
Hi all,

In my schoool project (kernel 2.2.X), I would like to pass some data attached
immediately above IP. (i.e. w/o UDP and TCP) I have assigned an arbitrary
protocol # in the IP header field so that the received data is passed on to my
protocol stack.

There is no problem on reception but I got stuck at all the transmission and
forwarding operations:
1, How can I transmit data by using a sk_buff that is created from scratch?
2, How can I forward data from the sk_buff of a received packet.

I have run some trial codes (attached below) but the kernel crashes.

Is my description clear? I surely have missed out something but I have no
clue. Could anyone point out what is missing from my code?

Thanks in advance. :)

Transmit Data from Scratch (version 1)
/* this is how I try the thing out */

struct sk_buff *skb=alloc_skb(sizeof(struct iphdr)+15,GFP_ATOMIC)


ip_route_output(&rt, [some dst addr in __u32] , 0, RT_TOS(0), 0);

iph = (struct iphdr*) skb->nh.iph;
iph->version = 4;
iph->ihl = sizeof(struct iphdr) >> 2;
iph->tos = 0;
iph->tot_len = htons(skb->len);
iph->id = htons(ip_id_count++);
iph->frag_off = 0;
iph->ttl = 64;
iph->protocol = [some self-defined #];
iph->saddr = rt->rt_src;
iph->daddr = rt->rt_dst;

skb->dst = &rt->u.dst;

Transmit Data from Scratch (version 2)
/* code that I find somewhere else */

/* my comment */
[original comment]

skb->dev = [put device here]; /* = ip_dev_find(daddr); ? */

skb->nh.iph->saddr = [alter the saddress to this m/c]

/* Is there a "raddr" in "include/linux/ip.h"? */
skb->nh.iph->raddr = [alter the router address]

[allocate dst_entry stucture] /* how can I do this? :p */

rt = (struct rtable *) skb->dst;
ip_route_output(&rt, skb->nh.iph->raddr, skb->nh.iph->saddr, 1, 0 )
hdr = (struct ethhdr *)skb_push( skb, ETH_HLEN);
memcpy(hdr->h_source, skb->dev->dev_addr, skb->dev->addr_len);
hdr->h_proto = __constant_htons(ETH_P_IP);
arp_find(skb->dev->h_dest, skb);

Forward Data of Received Packet
/* just alter the destination IP address */
/* or may add some data as well */
/* and then send it out */

/* outgoing device may be different from incoming device */
/* skb is the received skb */

struct rtable *rt;
struct iphdr *iph;
struct sk_buff *skb2;

skb2 = skb_copy(skb, GFP_KERNEL);
iph = (struct iphdr*) skb2->nh.iph;
ip_route_output(&rt, [some dst addr in __u32] , 0, RT_TOS(0), 0);
iph->daddr = [some dst addr in __u32];

/* // if I add 4 bytes of data as well
iph->tot_len = htons(ntohs(iph->tot_len) + 4);
skb->tail += 4;
skb->len += 4;

skb2->dst = &rt->u.dst;

Get your own FREE, personal Netscape WebMail account today at
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to
Please read the FAQ at

 \ /
  Last update: 2005-03-22 12:52    [W:0.040 / U:0.032 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site