/**************************************************************** * This file is just the front-end application for * configuring the driver. Nothing too special. * * *****************************************************************/ #include #include #include #include #include #include #include #ifdef CONFIG_NET_RADIO /* If wireless extension exist in the kernel */ /* #include don't include for now ... */ #endif /* CONFIG_NET_RADIO */ #include "lld.h" #include "proxcfg.h" #define SPACE printf(" ") #define TAB printf("\t") #define RETURN printf("\n") struct rl2_ioctl_info *ioc; struct ifreq ifr; unsigned char CardMode; void PrintUsage(char *); void atomac(unsigned_8 * string, unsigned_8 * mac); int main(int argc, char *argv[]) { int s,i,j,k; unsigned int resetLLD=CLEAR; unsigned char data_string[21]; unsigned int data_val; s=socket(AF_INET, SOCK_DGRAM, 0); ioc = (struct rl2_ioctl_info *) &ifr.ifr_data; /**************************************************************** Print usage if called for ****************************************************************/ if(argc == 1 || !strcmp(argv[1], "--help")) { PrintUsage(argv[0]); return 0; } /**************************************************************** Open a socket to the driver ****************************************************************/ if(s==-1) { perror("proxnet: socket"); exit(1); } /**************************************************************** Check for some default stuff. We take eth0 as a default or print out info if you didn't try to set a parameter. ****************************************************************/ if(!strcmp(argv[1],"dev")) { if(argc >= 3) { strcpy(ifr.ifr_name,argv[2]); if(argc == 3) PrintUsage(argv[0]); i=3; } else { strcpy(ifr.ifr_name, "eth0"); i=2; PrintUsage(argv[0]); } } else { strcpy(ifr.ifr_name, "eth0"); i=1; } /**************************************************************** This parses the arguments and makes the call to set the parameter via dev ioctl to lls.c. In general, LLDReset we try to call only once so we note if it's needed and call once at the end after parsing all the parameters. ****************************************************************/ for(;i= argc) { PrintUsage(argv[0]); exit(1); } ioc->cmd = SEND_PROX_PING; ioc->data = data_string; atomac(argv[i], data_string); if(ioctl(s,SIOCDEVPRIVATE,&ifr) == -1) { perror("proxnet: ioctl"); PrintUsage(argv[0]); exit(1); } printf("Check for responses: tail /var/log/messages\n"); } else if(!strcmp(argv[i],"masters")) { struct MastersList currlist; if (++i >= argc) { PrintUsage(argv[0]); exit(1); } ioc->cmd = START_AP_SEARCH; ioc->data = data_string; if(ioctl(s,SIOCDEVPRIVATE,&ifr) == -1) { perror("net: ioctl"); PrintUsage(argv[0]); exit(1); } for (k=0; kdata = (unsigned_8 *) &currlist; ioc->cmd = AP_LIST; ioctl(s,SIOCDEVPRIVATE,&ifr); printf("Time: %d\n", (k+1)*5); if (currlist.ChSubChannel) { printf("Name:%s MAC:", currlist.Name ); for(j=0;j<5;j++) printf("%2.2x:", currlist.Address[j]); printf("%2.2x", currlist.Address[j]); printf("%d, %d\n", currlist.ChSubChannel&0xf, currlist.ChSubChannel); } else printf("No masters found.\n"); } ioc->data = (unsigned_8 *) &currlist; ioc->cmd = STOP_AP_SEARCH; if(ioctl(s,SIOCDEVPRIVATE,&ifr) == -1) { perror("proxnet: ioctl"); PrintUsage(argv[0]); exit(1); } } else { PrintUsage(argv[0]); exit(1); } } } void PrintUsage(char *pname) { fprintf (stderr, "\nUsage:\n\n"); fprintf (stderr, "%s [dev {ifname}] [ping ] [masters ]\n", pname); fprintf (stderr, "\nExample:\n\n"); fprintf (stderr, "%s [dev {ifname}] ping ffffffffffff\n\n", pname); } void atomac(unsigned_8 * string, unsigned_8 * mac) { unsigned_8 index, j, k, digit; for (j=0; j<6; j++) { mac[j]=0; for(k=0;k<2;k++) { index=2*j+k; if ((digit = *(string+index)-'0') < 10); else if (((digit = *(string+index)-'a'+10) >=0xa) && (digit <= 0xf)); else if (((digit = *(string+index)-'A'+10) >=0xa) && (digit <= 0xf)); else digit=0; mac[j] += ( (digit&=0x0f) << ((1-k)*4)); } } }