diff -r 469eaa76099e GenDefs.h --- a/GenDefs.h Mon Apr 28 10:40:53 2008 +0200 +++ b/GenDefs.h Mon Apr 28 10:47:51 2008 +0200 @@ -105,6 +105,12 @@ typedef int32 intptr_t; #define _INTPTR_T_DEFINED #endif +/* uintptr_t has been defined in include/linux/types.h in 2.6.24. + * No need to define it here again (will only lead to compile errors) + * + * by Alexander Griesser , 2008-01-11 + */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) #ifndef _UINTPTR_T_DEFINED #if defined(_LP64) #warning 64 bit @@ -113,6 +119,7 @@ typedef uint32 uintptr_t; typedef uint32 uintptr_t; #endif #define _UINTPTR_T_DEFINED +#endif #endif diff -r 469eaa76099e Makefile --- a/Makefile Mon Apr 28 10:40:53 2008 +0200 +++ b/Makefile Mon Apr 28 10:47:51 2008 +0200 @@ -12,7 +12,7 @@ SOURCE_OBJS := linuxcniapi.o frag.o IPSe SOURCE_OBJS := linuxcniapi.o frag.o IPSecDrvOS_linux.o interceptor.o linuxkernelapi.o ifeq ($(SUBARCH),x86_64) -CFLAGS += -mcmodel=kernel -mno-red-zone +EXTRA_CFLAGS += -mcmodel=kernel -mno-red-zone NO_SOURCE_OBJS := libdriver64.so else NO_SOURCE_OBJS := libdriver.so diff -r 469eaa76099e interceptor.c --- a/interceptor.c Mon Apr 28 10:40:53 2008 +0200 +++ b/interceptor.c Mon Apr 28 10:47:51 2008 +0200 @@ -28,6 +28,10 @@ #include #include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) +#include +#endif + #include "linux_os.h" #include "vpn_ioctl_linux.h" @@ -39,7 +43,7 @@ static uint8_t interceptor_eth_addr[] = { 0x00, 0x0b, 0xfc, 0xf8, 0x01, 0x8f }; -// packet statistics +// packet statistics static unsigned long tx_packets; static unsigned long tx_dropped; static unsigned long tx_bytes; @@ -48,7 +52,13 @@ unsigned long rx_bytes; unsigned long rx_bytes; /*methods of the cipsec network device*/ -static int interceptor_init(struct net_device *); +static +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) +void +#else +int +#endif +interceptor_init(struct net_device *); static struct net_device_stats *interceptor_stats(struct net_device *dev); static int interceptor_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); @@ -82,12 +92,12 @@ struct packet_type_funcs { struct packet_type *pt; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14) - int (*orig_handler_func) (struct sk_buff *, + int (*orig_handler_func) (struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *); #else - int (*orig_handler_func) (struct sk_buff *, + int (*orig_handler_func) (struct sk_buff *, struct net_device *, struct packet_type *); #endif @@ -107,16 +117,30 @@ static char interceptor_name[] = LINUX_V BINDING Bindings[MAX_INTERFACES]; +/* 2.6.24 handles net_devices a little bit different + * + * by Alexander Griesser , 2008-01-11 + */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) +static struct net_device* interceptor_dev; +#else static struct net_device interceptor_dev = { .name = interceptor_name, .init = interceptor_init }; +#endif + static struct notifier_block interceptor_notifier = { .notifier_call = handle_netdev_event, }; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) -static int +static +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) +void +#else +int +#endif #else static int __init #endif @@ -133,8 +157,9 @@ interceptor_init(struct net_device *dev) dev->flags |= IFF_NOARP; dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST); kernel_memset(dev->broadcast, 0xFF, ETH_ALEN); - - return 0; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) + return 0; +#endif } static struct net_device_stats * @@ -270,7 +295,7 @@ add_netdev(struct net_device *dev) Bindings[i].InjectReceive = original_ip_handler.orig_handler_func; Bindings[i].pPT = original_ip_handler.pt; - rc = 0; + rc = 0; exit_gracefully: return rc; @@ -284,7 +309,7 @@ remove_netdev(struct net_device *dev) b = getbindingbydev(dev); if (b) - { + { rc = 0; dev->hard_start_xmit = b->InjectSend; kernel_memset(b, 0, sizeof(BINDING)); @@ -326,7 +351,7 @@ handle_vpnup(void) } /* find the handler for inbound IP packets by adding a dummy handler * for that packet type into the kernel. Because the packet handlers - * are stored in a hash table, we'll be able to pull the original + * are stored in a hash table, we'll be able to pull the original * ip packet handler out of the list that dummy_pt was inserted into.*/ kernel_memset(&dummy_pt, 0, sizeof(dummy_pt)); dummy_pt.type = htons(ETH_P_IP); @@ -363,7 +388,11 @@ handle_vpnup(void) dp = NULL; num_target_devices = 0; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) - for_each_netdev(dp) + for_each_netdev( +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) + &init_net, +#endif + dp) #else for (dp = dev_base; dp != NULL; dp = dp->next) #endif @@ -494,7 +523,7 @@ getbindingbydev(struct net_device *dev) getbindingbydev(struct net_device *dev) { int i; - + for (i=0; i <= MAX_INTERFACES; i++) { BINDING *b = &Bindings[i]; @@ -522,13 +551,13 @@ build_ppp_fake_mac_frag(struct ethhdr *d #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14) static int recv_ip_packet_handler(struct sk_buff *skb, - struct net_device *dev, + struct net_device *dev, struct packet_type *type, struct net_device *orig_dev) #else static int recv_ip_packet_handler(struct sk_buff *skb, - struct net_device *dev, + struct net_device *dev, struct packet_type *type) #endif { @@ -932,15 +961,29 @@ interceptor_mod_init(void) rc = CniPluginLoad(&pcDeviceName, &PCNICallbackTable); +/* 2.6.24 needs to allocate each netdevice before registering it, otherwise + * the kernel BUG()s. + * + * by Alexander Griesser , 2008-01-11 + */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) + if(! (interceptor_dev = alloc_netdev(sizeof(struct net_device), interceptor_name, interceptor_init))) + return 0; +#endif + if (CNI_IS_SUCCESS(rc)) { CNICallbackTable = *PCNICallbackTable; CniPluginDeviceCreated(); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) + if ((status = register_netdev(interceptor_dev)) != 0) +#else if ((status = register_netdev(&interceptor_dev)) != 0) +#endif { printk(KERN_INFO "%s: error %d registering device \"%s\".\n", - LINUX_VPN_IFNAME, status, interceptor_dev.name); + LINUX_VPN_IFNAME, status, interceptor_name); CniPluginUnload(); } @@ -960,7 +1003,11 @@ interceptor_mod_cleanup(void) cleanup_frag_queue(); CniPluginUnload(); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) + unregister_netdev(interceptor_dev); +#else unregister_netdev(&interceptor_dev); +#endif unregister_netdevice_notifier(&interceptor_notifier); return;