[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

Regarding building of frame header in 2.2.x,

Hello friends,
  I have a program which used to get a IP packet from the kernel and check
the kind [ICMP..] of packet. If it was a ICMP or IGMP packet, I used to
call a function called SEND_PACK(). This program works fine for kernel
2.0.x but when I am porting it to 2.2.X kernel I am facing some problems.
I have explained my problem below. I request you to please help me to
solve it.
In kernel 2.0.x. In the SEND_PACK() function I used to call the
Device->HARD_HEADER(---) function with both the destination and source
hardware address as NULL. For this I used to get the source hardware
address filled in the same function, but the destination hardware address
used to be left unfilled. Then I used to set the SK_BUFF->ARP to 0, and
call DEV_QUEUE_XMIT(), which in turn used to call the 
Device.REBUILD_HEADER() and get the destination hardware address filed.
This used to work fine.

But as in Kernel 2.2.x the flow and the structures are changed. Hence I 
have altered the flow as,
I still call the Device.HARD_HEADER(---) with same input and get the
source hardware address filed. But as the function DEV_QUEUE_XMIT()  is no
more calling the Device.REBUILD_HEADER() hence I have called the 
Device.REBUILD_HEADER() function in my program itself. But I am doing very
big mistake here. Hence my kernel gets matashed and the system craches.

Can you please help in solving this. I have attached [the cut short]
code below. I request you to please help me.

int Send_pack(----------- ) 
        uint16 len; /* packet length and frame length */
        struct sk_buff *skb;

        struct rtable *rt;      
        struct ethhdr *hdr;
        unsigned char *t3;
        char *t2;
                 rt = (struct rtable *) skb->dst; 

                if (rt)
            ip_route_output(&rt,route_addr,source_addr, 1, 0);

                skb->protocol = __constant_htons(ETH_P_IP);

                len = skb->len; 

                if ( skb->dev->hard_header) {
                   if ( skb->dev->hard_header(skb,skb->dev,ETH_P_IP,NULL,NULL,len) 
                         < 0 )
                  hdr = (struct ethhdr *)skb->data;

                  hdr->h_proto = __constant_htons(ETH_P_IP);



Syed Khaleelulla,
Software Engineer,
Wipro Global R&D,
26, Hosur Main Road, Bommanhalli, 
Bangalore - 560068, India.
Tel: 91-80-5722293/6 Extn- 2151.
Fax: 91-80-5722696.
The World's First SEI CMM Level 5 Software Services Company.