diff -ru vpnclient.orig/interceptor.c vpnclient/interceptor.c --- vpnclient.orig/interceptor.c 2005-09-14 04:40:56.000000000 +0200 +++ vpnclient/interceptor.c 2007-06-21 01:02:05.000000000 +0200 @@ -80,6 +80,11 @@ static int vpn_is_up = FALSE; +// LAN ACCESS PATCH: Module parameter used to retrieve "gateway" address from user space +static int gateway[4] = { 0,0,0,0 }; +module_param_array(gateway, uint, NULL, 0644); +MODULE_PARM_DESC(gateway," Gateway's public address (separated by ',') to be passed from user space."); + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) #define interceptor_name LINUX_VPN_IFNAME #else @@ -354,7 +359,10 @@ goto error_exit; } vpn_is_up = TRUE; - return error; + // LAN ACCESS PATCH: Display current "gateway" information from user space + printk(KERN_INFO "LAN ACCESS: vpn_is_up: gateway from userspace: %d.%d.%d.%d\n", + gateway[0], gateway[1], gateway[2], gateway[3]); + return error; error_exit: do_cleanup(); @@ -550,6 +558,24 @@ goto exit_gracefully; } + // LAN ACCESS PATCH: re-route traffic to original ip handler, if not receiving from VPN gateway's public address + if ( vpn_is_up && strcmp(dev->name,LINUX_VPN_IFNAME) && + (gateway[0] || gateway[1] || gateway[2] || gateway[3]) && + ( + (((unsigned char *)&(skb->nh.iph->saddr))[0] != gateway[0]) || + (((unsigned char *)&(skb->nh.iph->saddr))[1] != gateway[1]) || + (((unsigned char *)&(skb->nh.iph->saddr))[2] != gateway[2]) || + (((unsigned char *)&(skb->nh.iph->saddr))[3] != gateway[3]) ) ) { + /* + printk(KERN_INFO "LAN ACCESS: recv_ip_packet_handler(%s): %u.%u.%u.%u --> %u.%u.%u.%u\n", + dev->name, + NIPQUAD(skb->nh.iph->saddr), + NIPQUAD(skb->nh.iph->daddr)); + */ + rc2 = original_ip_handler.orig_handler_func(skb, dev, type); + goto exit_gracefully; + } + if (skb->ip_summed == CHECKSUM_HW) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,7) @@ -807,6 +833,24 @@ goto exit_gracefully; } + // LAN ACCESS PATCH: re-route traffic to original ip handler, if not sending to VPN gateway's public address + if ( vpn_is_up && strcmp(dev->name,LINUX_VPN_IFNAME) && + (gateway[0] || gateway[1] || gateway[2] || gateway[3]) && + ( + (((unsigned char *)&(skb->nh.iph->daddr))[0] != gateway[0]) || + (((unsigned char *)&(skb->nh.iph->daddr))[1] != gateway[1]) || + (((unsigned char *)&(skb->nh.iph->daddr))[2] != gateway[2]) || + (((unsigned char *)&(skb->nh.iph->daddr))[3] != gateway[3]) ) ) { + /* + printk(KERN_INFO "LAN ACCESS: replacement_dev_xmit(%s): %u.%u.%u.%u --> %u.%u.%u.%u\n", + dev->name, + NIPQUAD(skb->nh.iph->saddr), + NIPQUAD(skb->nh.iph->daddr)); + */ + rc2 = pBinding->InjectSend(skb, dev); + goto exit_gracefully; + } + if (need_reorder_frag(skb)) { rc2 = handle_fragment(pBinding, skb, dev);