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;
}
Exemplo n.º 2
0
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;
}