int proc_pppoe_write ( struct file *file , const char *buffer , unsigned long count , void *data ) { char *pt = NULL; struct net_device *dev = NULL; if ( 1 == pppoe_pt_enable ) { pppoe_pt_enable = 0; if ( ( dev = dev_get_by_name ( pppoe_pt_landev ) ) ) { dev_set_promiscuity ( dev , -1 ); } if ( ( dev = dev_get_by_name ( pppoe_pt_wandev ) ) ) { dev_set_promiscuity ( dev , -1 ); } } /* we expect that buffer contain format of "landev_name,wandev_name" */ memset ( pppoe_pt_landev , '\0' , sizeof ( pppoe_pt_landev ) ); memset ( pppoe_pt_wandev , '\0' , sizeof ( pppoe_pt_wandev ) ); for ( pt = pppoe_pt_landev ; ( *buffer && ( *buffer != ',' ) ) ; buffer++ ) { if ( ( *buffer != ' ' ) && isCHAR ( *buffer ) ) { *pt = *buffer; pt++; } } if ( !( *buffer ) ) { goto ppw_failed; } for ( pt = pppoe_pt_wandev , buffer++ ; *buffer ; buffer++ ) { if ( ( *buffer != ' ' ) && isCHAR ( *buffer ) ) { *pt = *buffer; pt++; } } if ( !( dev = dev_get_by_name ( pppoe_pt_landev ) ) ) { printk ( "PPPoE Passthru : no such landev ( %s )\n" , pppoe_pt_landev ); goto ppw_failed; } else { dev_set_promiscuity ( dev , 1 ); } if ( !( dev = dev_get_by_name ( pppoe_pt_wandev ) ) ) { printk ( "PPPoE Passthru : no such wandev ( %s )\n" , pppoe_pt_wandev ); goto ppw_failed; } else { dev_set_promiscuity ( dev , 1 ); } pppoe_pt_enable = 1; printk ( "GTK : starting up PPPoE_Passthru ( %s <-> %s ) ... successfully\n" , pppoe_pt_landev , pppoe_pt_wandev ); return count; ppw_failed: pppoe_pt_enable = 0; memset ( pppoe_pt_landev , '\0' , sizeof ( pppoe_pt_landev ) ); memset ( pppoe_pt_wandev , '\0' , sizeof ( pppoe_pt_wandev ) ); return count; }
int proc_ipv6_write(struct file *file, const char * buffer, unsigned long count, void *data) { char *pt; int cur_count=0; struct net_device *dev; if (ipv6_pt_enable) { ipv6_pt_enable = 0; if ((dev = dev_get_by_name(ipv6_pt_landev))) { dev_set_promiscuity(dev, -1); dev_put(dev); } if ((dev = dev_get_by_name(ipv6_pt_wandev))) { dev_set_promiscuity(dev, -1); dev_put(dev); } } /* we expect that buffer contain format of "landev_name,wandev_name" */ memset(ipv6_pt_landev, 0x0, sizeof (ipv6_pt_landev)); for (pt=ipv6_pt_landev; (*buffer && (*buffer != ',') && (*buffer != '\n')); buffer++) { if ((*buffer != ' ') && isCHAR(*buffer)) { *pt = *buffer; pt++; } cur_count++; if (cur_count >= count) break; } if (!(*buffer) || (cur_count >= count)) { printk("ipv6_pass: need <lan>,<wan>; device name format\n"); goto ppw_failed; } memset(ipv6_pt_wandev, 0x0, sizeof (ipv6_pt_wandev)); for (pt=ipv6_pt_wandev, buffer++; (*buffer && (*buffer != ';') && (*buffer != '\n')); buffer++) { if ((*buffer != ' ') && isCHAR(*buffer)) { *pt = *buffer; pt++; } cur_count++; if (cur_count >= count) break; } if (!(dev = dev_get_by_name(ipv6_pt_landev))) { #ifdef DEBUG printk("ipv6_pass: no lan device %s)\n",ipv6_pt_landev); #endif goto ppw_failed; } else { dev_set_promiscuity(dev, 1); dev_put(dev); } if (!(dev = dev_get_by_name(ipv6_pt_wandev))) { #ifdef DEBUG printk("ipv6_pass: no wan device %s)\n",ipv6_pt_wandev); #endif goto ppw_failed; } else { dev_set_promiscuity(dev, 1); dev_put(dev); } ipv6_pt_enable = 1; printk("ipv6 pass through (%s<->%s)\n",ipv6_pt_landev, ipv6_pt_wandev); return count; ppw_failed: ipv6_pt_enable = 0; memset(ipv6_pt_landev, 0x0, sizeof (ipv6_pt_landev)); memset(ipv6_pt_wandev, 0x0, sizeof (ipv6_pt_wandev)); printk("ipv6_pass: Disabled\n"); return count; }