Exemple #1
0
//int (*old_setdevname_hook)(char* cp) = NULL;
int setdevname_pppoe(char *cp)
{
    int ret;
    char dev[IFNAMSIZ+1];
    int addr[ETH_ALEN];
    int sid;

    char **a;
    ret =sscanf(cp, FMTSTRING(IFNAMSIZ),addr, addr+1, addr+2,
		addr+3, addr+4, addr+5,&sid,dev);
    if( ret != 8 ){

	ret = get_sockaddr_ll(cp,NULL,0);
        if (ret < 0)
	    fatal("PPPoE: Cannot create PF_PACKET socket for PPPoE discovery\n");
	/* not a device name */
	if (ret == 0)
	    return 0;
	if (ret == 1)
	    strncpy(devnam, cp, sizeof(devnam));
    }else{
	/* long form parsed */
	ret = get_sockaddr_ll(dev,NULL,0);
        if (ret < 0)
	    fatal("PPPoE: Cannot create PF_PACKET socket for PPPoE discovery\n");

	strncpy(devnam, cp, sizeof(devnam));
	ret = 1;
    }



    for (a = bad_options; *a != NULL; a++)
		remove_option(*a);
    deprecate_options(deprecated_options);
	modem = 0;

	lcp_allowoptions[0].neg_accompression = 0;
	lcp_wantoptions[0].neg_accompression = 0;

	lcp_allowoptions[0].neg_asyncmap = 0;
	lcp_wantoptions[0].neg_asyncmap = 0;

	lcp_allowoptions[0].neg_pcompression = 0;
	lcp_wantoptions[0].neg_pcompression = 0;

	ccp_allowoptions[0].deflate = 0 ;
	ccp_wantoptions[0].deflate = 0 ;

	ipcp_allowoptions[0].neg_vj=0;
	ipcp_wantoptions[0].neg_vj=0;

	ccp_allowoptions[0].bsd_compress = 0;
	ccp_wantoptions[0].bsd_compress = 0;

	init_device_pppoe();

    return ret;
}
Exemple #2
0
int setdevname_pppoe(const char *cp)
{
    int ret;
    char dev[IFNAMSIZ+1];
    int addr[ETH_ALEN];
    int sid;

//    char **a;
    ret =sscanf(cp, FMTSTRING(IFNAMSIZ),addr, addr+1, addr+2,
		addr+3, addr+4, addr+5,&sid,dev);
    if( ret != 8 ){

	ret = get_sockaddr_ll(cp,NULL);
        if (ret < 0)
	    fatal("PPPoE: Cannot create PF_PACKET socket for PPPoE discovery\n");
	if (ret == 1)
	    strncpy(devnam, cp, sizeof(devnam));
    }else{
	/* long form parsed */
	ret = get_sockaddr_ll(dev,NULL);
        if (ret < 0)
	    fatal("PPPoE: Cannot create PF_PACKET socket for PPPoE discovery\n");

	strncpy(devnam, cp, sizeof(devnam));
	ret = 1;
    }


    if( ret == 1 && the_channel != &pppoe_channel ){

	the_channel = &pppoe_channel;

	{
	    char **a;
	    for (a = bad_options; *a != NULL; a++)
		remove_option(*a);
	}

// cwu
	ipcp_allowoptions[0].default_route = 0 ;
	ipcp_wantoptions[0].default_route = 0 ;

// cwu
#if 0
	modem = 0;
#endif

	lcp_allowoptions[0].neg_accompression = 0;
	lcp_wantoptions[0].neg_accompression = 0;

	lcp_allowoptions[0].neg_asyncmap = 0;
	lcp_wantoptions[0].neg_asyncmap = 0;

	lcp_allowoptions[0].neg_pcompression = 0;
	lcp_wantoptions[0].neg_pcompression = 0;
// cwu
#if 0
	ccp_allowoptions[0].deflate = 0 ;
	ccp_wantoptions[0].deflate = 0 ;
#endif

	ipcp_allowoptions[0].neg_vj=0;
	ipcp_wantoptions[0].neg_vj=0;
// cwu
#if 0
	ccp_allowoptions[0].bsd_compress = 0;
	ccp_wantoptions[0].bsd_compress = 0;
#endif

	init_device_pppoe();
    }
    return ret;
}
int client_init_ses (struct session *ses, char* devnam)
{
    int i=0;
    int retval;
    char dev[IFNAMSIZ+1];
    int addr[ETH_ALEN];
    int sid;
    
    /* do error checks here; session name etc are valid */
//    poe_info (ses,"init_ses: creating socket");
    
    /* Make socket if necessary */
    if( disc_sock < 0 ){
        
        disc_sock = socket(PF_PACKET, SOCK_DGRAM, 0);
        if( disc_sock < 0 ){
            poe_fatal(ses,
                      "Cannot create PF_PACKET socket for PPPoE discovery\n");
        }
        
    }
    
    /* Check for long format */
    retval =sscanf(devnam, FMTSTRING(IFNAMSIZ),addr, addr+1, addr+2,
                   addr+3, addr+4, addr+5,&sid,dev);
    if( retval != 8 ){
        /* Verify the device name , construct ses->local */
        retval = get_sockaddr_ll(devnam,&ses->local);
        if (retval < 0)
            poe_fatal(ses, "client_init_ses: "
                      "Cannot create PF_PACKET socket for PPPoE discovery\n");
        
        ses->state = PADO_CODE;

        create_msg(BCM_PPPOE_CLIENT_STATE_PADO);

        memcpy(&ses->remote, &ses->local, sizeof(struct sockaddr_ll) );
        
        memset( ses->remote.sll_addr, 0xff, ETH_ALEN);
    }else{
        /* long form parsed */

        /* Verify the device name , construct ses->local */
        retval = get_sockaddr_ll(dev,&ses->local);
        if (retval < 0)
            poe_fatal(ses,"client_init_ses(2): "
                      "Cannot create PF_PACKET socket for PPPoE discovery\n");
        ses->state = PADS_CODE;

        create_msg(BCM_PPPOE_CLIENT_STATE_PADS);

        ses->sp.sa_family = AF_PPPOX;
        ses->sp.sa_protocol = PX_PROTO_OE;
        ses->sp.sa_addr.pppoe.sid = sid;
        
        memcpy(&ses->remote, &ses->local, sizeof(struct sockaddr_ll) );
        
        for(; i < ETH_ALEN ; ++i ){
            ses->sp.sa_addr.pppoe.remote[i] = addr[i];
            ses->remote.sll_addr[i]=addr[i];
        }
        memcpy(ses->sp.sa_addr.pppoe.dev, dev, IFNAMSIZ);
        
        
        
    }
    if( retval < 0 )
        error("bad device name: %s",devnam);
    
    
    retval = bind( disc_sock ,
                   (struct sockaddr*)&ses->local,
                   sizeof(struct sockaddr_ll));
    
    
    if( retval < 0 ){
        error("bind to PF_PACKET socket failed: %m");
    }
    
    ses->fd = socket(AF_PPPOX,SOCK_STREAM,PX_PROTO_OE);
    if(ses->fd < 0)
    {
        poe_fatal(ses,"Failed to create PPPoE socket: %m");
    }
    
    
    ses->init_disc = std_init_disc;
    ses->rcv_pado  = std_rcv_pado;
    ses->rcv_pads  = std_rcv_pads;
    ses->rcv_padt  = std_rcv_padt;
    
    /* this should be filter overridable */
    ses->retries = 10;
    
    return ses->fd;
}
int setdevname_pppoe(const char *cp)
{
    int ret;
    char dev[IFNAMSIZ+1];
    int addr[ETH_ALEN];
    int sid;
    option_t *opt;
    //info("setdevname_pppoe  //cd===");//add by HQS
    ret =sscanf(cp, FMTSTRING(IFNAMSIZ),addr, addr+1, addr+2,
		addr+3, addr+4, addr+5,&sid,dev);
    if( ret != 8 ){

	ret = get_sockaddr_ll(cp,NULL);
        if (ret < 0)
	    fatal("PPPoE: Cannot create PF_PACKET socket for PPPoE discovery\n");
	if (ret == 1)
	    strncpy(devnam, cp, sizeof(devnam));
    }else{
	/* long form parsed */
	ret = get_sockaddr_ll(dev,NULL);
        if (ret < 0)
	    fatal("PPPoE: Cannot create PF_PACKET socket for PPPoE discovery\n");

	strncpy(devnam, cp, sizeof(devnam));
	ret = 1;
    }

    info("PPPoE: Use %s for PPPoE discovery\n", devnam);

    if( ret == 1 && the_channel != &pppoe_channel ){

	the_channel = &pppoe_channel;

	lcp_allowoptions[0].neg_accompression = 0;
	lcp_wantoptions[0].neg_accompression = 0;

	lcp_allowoptions[0].neg_asyncmap = 0;
	lcp_wantoptions[0].neg_asyncmap = 0;

	lcp_allowoptions[0].neg_pcompression = 0;
	lcp_wantoptions[0].neg_pcompression = 0;

	ipcp_allowoptions[0].neg_vj=0;
	ipcp_wantoptions[0].neg_vj=0;

	ipcp_allowoptions[0].default_route=1;
	
	/* remove for add -R parameter set default route. by tallest.*/
	//ipcp_wantoptions[0].default_route=0;
	
	for (opt = ipcp_protent.options; opt->name != NULL; ++opt) {
		if (!strncmp(opt->name, "usepeerdns", 10)) {
			*(bool *)(opt->addr) = 1;
			break;
		}
	}
    //info("PPPoE: Use %s for PPPoE discovery 001\n", devnam);

#ifdef CCP_SUPPORT
	ccp_allowoptions[0].deflate = 0 ;
	ccp_wantoptions[0].deflate = 0 ;

	ccp_allowoptions[0].bsd_compress = 0;
	ccp_wantoptions[0].bsd_compress = 0;
#endif
    //info("PPPoE: Use %s for PPPoE discovery 002\n", devnam);
	init_device_pppoe();
    }
    return ret;
}