/********************************************************************** * %FUNCTION: PPPoEDevnameHook * %ARGUMENTS: * cmd -- the command (actually, the device name * argv -- argument vector * doit -- if non-zero, set device name. Otherwise, just check if possible * %RETURNS: * 1 if we will handle this device; 0 otherwise. * %DESCRIPTION: * Checks if name is a valid interface name; if so, returns 1. Also * sets up devnam (string representation of device). ***********************************************************************/ static int PPPoEDevnameHook(char *cmd, char **argv, int doit) { int r = 1; int fd; struct ifreq ifr; /* Only do it if name is "ethXXX" or "brXXX" or what was specified by rp_pppoe_dev option (ugh). */ /* Can also specify nic-XXXX in which case the nic- is stripped off. */ if (!strncmp(cmd, "nic-", 4)) { cmd += 4; } else { if (strncmp(cmd, "eth", 3) && strncmp(cmd, "br", 2)) { if (OldDevnameHook) return OldDevnameHook(cmd, argv, doit); return 0; } } /* Open a socket */ if ((fd = socket(PF_PACKET, SOCK_RAW, 0)) < 0) { r = 0; } /* Try getting interface index */ if (r) { strncpy(ifr.ifr_name, cmd, IFNAMSIZ); if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0) { r = 0; } else { if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { r = 0; } else { if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) { error("Interface %s not Ethernet", cmd); r=0; } } } } /* Close socket */ close(fd); if (r) { strncpy(devnam, cmd, sizeof(devnam)); if (the_channel != &pppoe_channel) { the_channel = &pppoe_channel; 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; ipcp_allowoptions[0].neg_vj=0; ipcp_wantoptions[0].neg_vj=0; ccp_allowoptions[0].deflate = 0 ; ccp_wantoptions[0].deflate = 0 ; ccp_allowoptions[0].bsd_compress = 0; ccp_wantoptions[0].bsd_compress = 0; PPPOEInitDevice(); } return 1; } if (OldDevnameHook) r = OldDevnameHook(cmd, argv, doit); return r; }
/********************************************************************** * %FUNCTION: PPPoEDevnameHook * %ARGUMENTS: * cmd -- the command (actually, the device name * argv -- argument vector * doit -- if non-zero, set device name. Otherwise, just check if possible * %RETURNS: * 1 if we will handle this device; 0 otherwise. * %DESCRIPTION: * Checks if name is a valid interface name; if so, returns 1. Also * sets up devnam (string representation of device). ***********************************************************************/ static int PPPoEDevnameHook(char *cmd, char **argv, int doit) { int r = 1; int fd; struct ifreq ifr; int seen_idx = doit ? 1 : 0; /* If "devnam" has already been set, ignore. This prevents kernel from doing modprobes against random pppd arguments that happen to begin with "nic-", "eth" or "br" Ideally, "nix-ethXXX" should be supplied immediately after "plugin rp-pppoe.so" Patch based on suggestion from Mike Ireton. */ if (seen_devnam[seen_idx]) { if (OldDevnameHook) return OldDevnameHook(cmd, argv, doit); return 0; } /* Only do it if name is "ethXXX" or "brXXX" or what was specified by rp_pppoe_dev option (ugh). */ /* Can also specify nic-XXXX in which case the nic- is stripped off. */ if (!strncmp(cmd, "nic-", 4)) { cmd += 4; } else { if (strncmp(cmd, "eth", 3) && strncmp(cmd, "br", 2)) { if (OldDevnameHook) return OldDevnameHook(cmd, argv, doit); return 0; } } /* Open a socket */ if ((fd = socket(PF_PACKET, SOCK_RAW, 0)) < 0) { r = 0; } /* Try getting interface index */ if (r) { strncpy(ifr.ifr_name, cmd, IFNAMSIZ); if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0) { r = 0; } else { if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { r = 0; } else { if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) { error("Interface %s not Ethernet", cmd); r=0; } } } } /* Close socket */ close(fd); if (r) { seen_devnam[seen_idx] = 1; if (doit) { strncpy(devnam, cmd, sizeof(devnam)); if (the_channel != &pppoe_channel) { the_channel = &pppoe_channel; 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; ipcp_allowoptions[0].neg_vj=0; ipcp_wantoptions[0].neg_vj=0; ccp_allowoptions[0].deflate = 0 ; ccp_wantoptions[0].deflate = 0 ; ccp_allowoptions[0].bsd_compress = 0; ccp_wantoptions[0].bsd_compress = 0; PPPOEInitDevice(); } } return 1; } if (OldDevnameHook) r = OldDevnameHook(cmd, argv, doit); return r; }
/********************************************************************** * %FUNCTION: PPPoEDevnameHook * %ARGUMENTS: * cmd -- the command (actually, the device name * argv -- argument vector * doit -- if non-zero, set device name. Otherwise, just check if possible * %RETURNS: * 1 if we will handle this device; 0 otherwise. * %DESCRIPTION: * Checks if name is a valid interface name; if so, returns 1. Also * sets up devnam (string representation of device). ***********************************************************************/ static int PPPoEDevnameHook(char *cmd, char **argv, int doit) { int r = 1; int fd; struct ifreq ifr; /* Only do it if name is "ethXXX" */ /* Thanks to Russ Couturier for this fix */ if (strlen(cmd) < 4 || strncmp(cmd, "eth", 3)) { if (OldDevnameHook) return OldDevnameHook(cmd, argv, doit); return 0; } /* Open a socket */ if ((fd = socket(PF_PACKET, SOCK_RAW, 0)) < 0) { r = 0; } /* Try getting interface index */ if (r) { strncpy(ifr.ifr_name, cmd, sizeof(ifr.ifr_name)); if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0) { r = 0; } else { if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { r = 0; } else { if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) { error("Interface %s not Ethernet", cmd); r=0; } } } } /* Close socket */ close(fd); if (r) { strncpy(devnam, cmd, sizeof(devnam)); if (the_channel != &pppoe_channel) { the_channel = &pppoe_channel; 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; PPPOEInitDevice(); } return 1; } if (OldDevnameHook) r = OldDevnameHook(cmd, argv, doit); return r; }