/* * Copyright (c) 1997 * Granch ltd. * * Redistribution and use in source forms, with and without modification, * are permitted provided that this entire comment appear intact. * * THIS SOURCE CODE IS PROVIDED ``AS IS'' WITHOUT ANY WARRANTIES OF ANY KIND. * * sbniconfig.c,v 2.0.0 97/08/06 */ /* * SBNI adapter configuration utility * * Revision 2.0.0 97/08/06 * Initial revision * * Revision 2.0.1 97/08/11 * Additional internal statistics support (tx statistics) * * Revisuion 2.1 Jul 7 2000 * Added feature to specify baud rate and rxl instead of flags * * */ #include #include #include #include #include #include #include #include #include #include #include "if_sbnivar.h" char* rate_tab[] = { "0", "1", "2", "3" }; int main(argc, argv) int argc; char *argv[]; { char *if_name; int s; struct ifreq ifr; struct sbni_in_stats in_stats; struct sbni_flags flags; int rxl=-1,baud=-1; int rxlfix=1<<6; if(argc < 2 || argc > 4){ fprintf(stderr, "usage:\tsbniconfig if_name [flags]\n"); fprintf(stderr, "\tsbniconfig if_name baud rxl\n"); fprintf(stderr, "e.g.: \tsbniconfig sbni0 0xdeadbeef or \n\tsbniconfig sbni0 2 15\n\tsbniconfig sbni0 0 auto\n"); exit(1); } if_name = argv[1]; if(argc == 3 || argc == 4){ char* endptr; if(argc == 3){ *(u_int32_t*)&flags = strtoul(argv[2], &endptr, 0); if(*endptr){ fprintf(stderr, "sbniconfig: invalid flags specified\n"); exit(1); } }else{ baud=atoi(argv[2]); if(strcasecmp(argv[3],"auto")){ /* NON auto */ rxl=atoi(argv[3]); rxlfix=1<<6; }else{ rxl=0; rxlfix=0; } if((baud < 0) || (baud > 3) || (rxl < 0) || (rxl > 15)){ printf("incorrect params.\n"); exit(1); } printf("baud rate = %d\n",baud); if(!rxlfix) printf("rxl = auto\n"); else{ printf("rxl = %d\n",rxl); } srandom(time(NULL)); *(u_int32_t*)&flags = random(); *((u_char*) &flags + 3) = rxl | rxlfix | (baud<<4) | (1<<7); printf("new flags = 0x%x\n",flags); } flags.mac_addr = htonl(flags.mac_addr) >> 8; } s = socket(AF_INET, SOCK_DGRAM, 0); if(s < 0){ perror("sbniconfig: socket"); exit (1); } strncpy(ifr.ifr_name, if_name, sizeof (ifr.ifr_name)); ifr.ifr_addr.sa_family = AF_INET; if(argc == 2){ if(ioctl(s, SIOCGHWFLAGS, (caddr_t)&ifr) < 0){ perror("sbniconfig: SIOCGHWFLAGS"); exit(1); } flags = *(struct sbni_flags*)&ifr.ifr_data; ifr.ifr_data = (caddr_t)&in_stats; if(ioctl(s, SIOCGINSTATS, (caddr_t)&ifr) < 0){ perror("sbniconfig: SIOCGINSTATS"); exit(1); } printf("%s:\tMAC addr: 00:ff:01:%02x:%02x:%02x\n" "\treceive level: 0x%x (%s)\n" "\tbaud rate: %s (%s)\n" "\tTotal rx=%u\tBad rx=%u\tGood rx=%u\tTimeouts=%u\n" "\tError frame ratio %6.2f%%\n" "\tTotal tx=%u\tResend tx=%u\tImmediate tx=%u\n", if_name, *(u_char*) &flags, *(((u_char*) &flags)+1), *(((u_char*) &flags)+2), (unsigned) flags.rxl, flags.fixed_rxl ? "fixed" : "autodetected", rate_tab[flags.rate], flags.fixed_rate ? "fixed" : "autodetected", in_stats.all_rx_number, in_stats.bad_rx_number, in_stats.all_rx_number - in_stats.bad_rx_number, in_stats.timeout_number, (float)(in_stats.bad_rx_number*100./(in_stats.all_rx_number+0.01)), in_stats.all_tx_number, in_stats.resend_tx_number, in_stats.all_tx_number - in_stats.resend_tx_number); } else if((argc == 3) || (argc ==4 )){ if(*(caddr_t*)&flags != 0){ ifr.ifr_data = *(caddr_t*)&flags; if(ioctl(s, SIOCSHWFLAGS, (caddr_t)&ifr) < 0){ perror("sbniconfig: SIOCSHWFLAGS"); exit(1); } } if(ioctl(s, SIOCRINSTATS, (caddr_t)&ifr) < 0){ perror("sbniconfig: SIOCRINSTATS"); exit(1); } } close (s); return 0; }