diff options
| author | Roman Yeryomin <roman@advem.lv> | 2012-09-13 00:40:35 +0300 | 
|---|---|---|
| committer | Roman Yeryomin <roman@advem.lv> | 2013-05-26 00:44:46 +0300 | 
| commit | a27354c9021a8423ef8c7d2bffad49cbf639eec1 (patch) | |
| tree | 2355929a4b8cf1888cd0797cfabdb42e0077c524 /target/linux/realtek/files/drivers/net/rtl819x/igmpsnooping/igmp_delete.c | |
| parent | 24a776baeb5d3cd903b144c89ceb11c5bc36a49e (diff) | |
Add realtek target files
Signed-off-by: Roman Yeryomin <roman@advem.lv>
Diffstat (limited to 'target/linux/realtek/files/drivers/net/rtl819x/igmpsnooping/igmp_delete.c')
| -rw-r--r-- | target/linux/realtek/files/drivers/net/rtl819x/igmpsnooping/igmp_delete.c | 119 | 
1 files changed, 119 insertions, 0 deletions
diff --git a/target/linux/realtek/files/drivers/net/rtl819x/igmpsnooping/igmp_delete.c b/target/linux/realtek/files/drivers/net/rtl819x/igmpsnooping/igmp_delete.c new file mode 100644 index 000000000..2b3ec0057 --- /dev/null +++ b/target/linux/realtek/files/drivers/net/rtl819x/igmpsnooping/igmp_delete.c @@ -0,0 +1,119 @@ +
 +#include <linux/module.h>	
 +#include <linux/proc_fs.h>
 +#include <linux/types.h>
 +#include <linux/errno.h>
 +#include <linux/sched.h>
 +#include <linux/kernel.h>
 +#include <linux/kernel_stat.h>
 +#include <linux/init.h>
 +#include <linux/module.h>
 +#include <linux/slab.h>
 +#include <asm/uaccess.h>
 +#include <linux/net.h>
 +#include <linux/socket.h>
 +
 +#include <linux/netdevice.h>
 +#include <linux/etherdevice.h>
 +#include <linux/string.h>
 +#include <net/ip.h>
 +#include <net/protocol.h>
 +#include <net/route.h>
 +#include <net/sock.h>
 +#include <net/arp.h>
 +#include <net/raw.h>
 +#include <net/checksum.h>
 +#include <linux/netfilter.h>
 +#include <linux/netfilter_ipv4.h>
 +#include <linux/netlink.h>
 +#include <linux/inetdevice.h>
 +#include <linux/icmp.h>
 +#include <net/udp.h>
 +#include <net/tcp.h>
 +
 +#include <net/rtl/rtl_types.h>
 +#ifdef CONFIG_NETFILTER
 +#include <net/netfilter/nf_conntrack.h>
 +#include <net/rtl/fastpath/fastpath_core.h>
 +#endif
 +#include <net/rtl/rtl865x_netif.h>
 +#include <net/rtl/rtl_nic.h>
 +
 +
 +struct sock *igmp_delete_sk = NULL;
 +struct test_struct
 +{
 +	char data[30];
 +};
 +static int try_mac(const char *data, char array[],
 +		      int array_size, char sep)
 +{
 +	uint32 i;
 +
 +	memset(array, 0, sizeof(array[0])*array_size);
 +
 +	/* Keep data pointing at next char. */
 +	for (i = 0;  i < array_size; data++) {
 +		if (*data >= '0' && *data <= '9') {
 +			array[i] = array[i]*16 + *data - '0';
 +		}
 +		else if(*data >='a' && *data <='f') {
 +			array[i] = array[i]*16 + *data - 'a'+10;
 +		}
 +		else if(*data >='A' && *data <='F') {
 +			array[i] = array[i]*16 + *data - 'A'+10;
 +		}
 +		else if (*data == sep)
 +			i++;
 +		else {
 +			/* Unexpected character; true if it's the
 +			   terminator and we're finished. */
 +			if (i == array_size - 1)
 +				return 1;
 +
 +			printk("Char %u  '%c' unexpected\n",\
 +				 i, *data);
 +			return 0;
 +		}
 +	}
 +	return 0;
 +}
 +
 +extern int32 rtl_delIgmpRecordByMacAddr(uint8 *macAddr);
 +void igmp_delete (struct sk_buff *__skb)
 +{
 +  	int pid;
 +	struct test_struct send_data,recv_data;
 +	uint8 mac[6];
 +	char *ptr;
 +	pid=rtk_nlrecvmsg(__skb,sizeof(struct test_struct),&recv_data);	
 + 	//printk("igmp_delete data:%s\n", recv_data.data);
 +	memset(mac, 0, 6);
 +	ptr = recv_data.data;
 +	if(try_mac(recv_data.data, mac, 6, ':'))
 +	{
 +		rtl_delIgmpRecordByMacAddr(mac);
 +		//printk("filter mac: %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
 +    		sprintf(send_data.data,"clear igmp cache ok\n");
 +	}
 +	else
 +	{
 +		printk("clear igmp cache of bad format mac:%s\n", recv_data.data);
 +    		sprintf(send_data.data,"please input like 00:23:e8:79:99:32\n");
 +	}
 +      	rtk_nlsendmsg(pid, igmp_delete_sk, sizeof(struct test_struct), &send_data);
 +  	return;
 +}
 +
 +int igmp_delete_init_netlink(void) 
 +{
 +  	igmp_delete_sk = netlink_kernel_create(&init_net, NETLINK_MULTICAST_DELETE, 0, igmp_delete, NULL, THIS_MODULE);
 +
 +  	if (!igmp_delete_sk) {
 +    		printk(KERN_ERR "Netlink[Kernel] Cannot create netlink socket for igmp delete.\n");
 +    		return -EIO;
 +  	}	
 +  	printk("Netlink[Kernel] create socket for igmp ok.\n");
 +  	return 0;
 +}
 +
  | 
