Hi,

   I wrote a kernel module for copy  nfs packetsto new packet and send the new 
packet to network. It works in small packet. But it failed in sending of bigger 
packets. the program is shown below. I don't know the problem..







/* generic module headers here */

#include <linux/config.h>

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/init.h>

#include <linux/slab.h>

#include <linux/delay.h>

#include <linux/string.h>

#include <linux/vmalloc.h>

#include <linux/nfs.h>



/* scatterlist and page mask required for encrypt */

#include <asm/scatterlist.h>

#include <asm/page.h>



#include <linux/crypto.h>



#include <linux/version.h>

#include <linux/proc_fs.h>

#include <linux/errno.h>



/* network headers here */

#include <linux/byteorder/generic.h>

#include <linux/netdevice.h>



#include <linux/netfilter.h>

#include <linux/netfilter_ipv4.h>



#include <linux/ip.h>

#include <linux/in.h>

#include <net/checksum.h>

#include <linux/tcp.h>

#include <linux/udp.h>

#include <linux/skbuff.h>



#define IP_PROTO_NFS 105 





static

unsigned int

send_hook (unsigned int nfhook, struct sk_buff **skb,

        const struct net_device *in, const struct net_device *out,

        int (*okfn) (struct sk_buff *))



{

        struct sk_buff *skbuff = *skb;

        struct sk_buff *skcopy;

        struct udphdr *udp_hdr;

        int  proto, err=0;

        int hlen,totlen, troom;

        hlen = skbuff ->nh.iph->ihl * 4;

        udp_hdr = (struct udphdr *)(skbuff->nh.raw + hlen);



        if (udp_hdr -> dest == htons(NFS_PORT) || 

                        udp_hdr->source == htons(NFS_PORT) &&

                        skbuff->nh.iph->protocol == IPPROTO_UDP)

        {

                

                

                printk(KERN_ALERT"\n\n Send Hook\n" );

                

                

                skcopy = skb_copy(skbuff, GFP_ATOMIC);

                        

                                                /*changes in skcopy*/   

                

                printk(KERN_INFO"\nsize of packet skbuff%d"

                                "\nsize of packet skcopy%d",

                                (skbuff->end - skbuff->head ),

                                (skcopy->end - skcopy->head ));

                

                skcopy->nh.iph->protocol = IP_PROTO_NFS;

                                                /*sending packet*/              

                skcopy->nh.iph->check =0;

                ip_send_check(skcopy->nh.iph);

                ip_finish_output(skcopy);

                kfree_skb(skbuff);                              

                return NF_STOLEN;

        }                               

        return NF_ACCEPT;

}



;

static

unsigned int

recv_hook (unsigned int nfhook, struct sk_buff **skb,

        const struct net_device *in, const struct net_device *out,

        int (*okfn) (struct sk_buff *))



{

        struct sk_buff *skbuff = *skb;

        int  proto, err=0;

        int hlen,totlen, len;

        totlen = ntohs(skbuff->nh.iph->tot_len);

        proto = skbuff->nh.iph->protocol;

        if(proto == IP_PROTO_NFS) {



                printk(KERN_ALERT "\n\nIN RECV_HOOK FUNCTION");



                printk(KERN_ALERT"\nproto %d\ntotlen %d",

                                skbuff->nh.iph->protocol,

                                ntohs(skbuff->nh.iph->tot_len));

                skbuff->nh.iph->protocol = IPPROTO_UDP;



        }

        return NF_ACCEPT;

}       







static struct nf_hook_ops hook_send;

static struct nf_hook_ops hook_recv;



static 

int init_module (void)

{



/*encryption hook*/

        hook_send.hook = send_hook;

        hook_send.hooknum = NF_IP_LOCAL_OUT;

        hook_send.pf = PF_INET;

        hook_send.priority = NF_IP_PRI_FIRST;



        nf_register_hook (&hook_send);



        

        hook_recv.hook = recv_hook;

        hook_recv.hooknum = NF_IP_LOCAL_IN;

        hook_recv.pf = PF_INET;

        hook_recv.priority = NF_IP_PRI_FIRST;



        nf_register_hook (&hook_recv);

        

        printk (KERN_INFO "Module successfully loaded.\n");

        return 0;

}



static 

void cleanup_module(void)

{

        nf_unregister_hook(&hook_send);

        nf_unregister_hook(&hook_recv);



        printk (KERN_ALERT"Module successfully unloaded");



}





MODULE_LICENSE("GPL");




-- 
This message has been scanned for viruses and
dangerous content by Techfocuz Communicator 2.6  
(http://www.focuzinfotech.com), and is
believed to be clean.

-
To unsubscribe from this list: send the line "unsubscribe linux-net" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to