Kernel Module Chaning destination mac address

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello there!
I am working on a project to create a kernel module which directs all
outgoing traffic from my machine to different computer in my LAN. So I
am starting with just trying to send the traffic to just one computer.
I am using the NF_BR_LOCAL_OUT hook. Along with the NFPROTO_IPV4
family. But every time i run the module, my machine hangs. And I need
to reboot.  Please see what is the problem.

Here is the code:

#include <generated/autoconf.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/skbuff.h>
#include <linux/types.h>
#include <linux/netfilter_ipv4.h>
#include <linux/netfilter_bridge.h>
#include <linux/socket.h>
#include <linux/netfilter.h>

struct nf_hook_ops hook_ex;

unsigned int function_hook( unsigned int hook, struct sk_buff **pskb, const
struct net_device *in,
    const struct net_device *out, int (*okfn)(struct sk_buff *))
{

char a[] = { 0x00, 0x24, 0x21, 0x03, 0xd4, 0x31};
printk("changing IP dst address in %s\n", __FUNCTION__);
if (skb_shared(*pskb) || skb_cloned(*pskb)) {
struct sk_buff *nskb;
 printk("in if if (skb_shared(*pskb) || skb_cloned(*pskb)) \n");

nskb = skb_copy(*pskb, GFP_ATOMIC);
if (!nskb)
return NF_DROP;
if ((*pskb)->sk)
skb_set_owner_w(nskb, (*pskb)->sk);
kfree_skb(*pskb);
*pskb = nskb;
}
memcpy(eth_hdr(*pskb)->h_dest, a, ETH_ALEN);

return NF_ACCEPT;
}

static int __init init(void)
{
   // hook
   hook_ex.list.next = NULL;
   hook_ex.list.prev = NULL;
   hook_ex.hook = function_hook;
   //  hook_ex.list.flush = NULL;
   hook_ex.pf = NFPROTO_IPV4;
   hook_ex.hooknum = NF_BR_LOCAL_OUT;
printk(KERN_INFO "[CCD] Successfully inserted module into kernel.\n");
   return nf_register_hook(&hook_ex);
}

static void __exit fini(void)
{
   nf_unregister_hook(&hook_ex);
printk(KERN_INFO "[CCD] Successfully unloaded module.\n");
}

module_init(init);
module_exit(fini);


Regards,
Digvijay

PS: I am noob at kernel programming
--
To unsubscribe from this list: send the line "unsubscribe netfilter" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux