* src/cansequence.c, src/cansend.c:

cleanups

git-svn-id: https://iocaste.extern.pengutronix.de/svn/canutils/trunks/canutils-3.0-trunk@90 5fd5a299-6ef2-0310-aa18-8b01d7c39d8c
pull/254/head^2
Marc Kleine-Budde 2008-09-09 15:18:51 +00:00
parent d8be4d8a4f
commit bd3ea25fe1
1 changed files with 81 additions and 76 deletions

View File

@ -21,34 +21,34 @@
extern int optind, opterr, optopt; extern int optind, opterr, optopt;
static int s = -1; static int s = -1;
static int running = 1; static int running = 1;
enum enum {
{
VERSION_OPTION = CHAR_MAX + 1, VERSION_OPTION = CHAR_MAX + 1,
}; };
void print_usage(char *prg) void print_usage(char *prg)
{ {
fprintf(stderr, "Usage: %s <can-interface> [Options]\n" fprintf(stderr, "Usage: %s <can-interface> [Options]\n"
"\n" "\n"
"cansequence sends CAN messages with a rising sequence number as payload.\n" "cansequence sends CAN messages with a rising sequence number as payload.\n"
"When the -r option is given, cansequence expects to receive these messages\n" "When the -r option is given, cansequence expects to receive these messages\n"
"and prints an error message if a wrong sequence number is encountered.\n" "and prints an error message if a wrong sequence number is encountered.\n"
"The main purpose of this program is to test the reliability of CAN links.\n" "The main purpose of this program is to test the reliability of CAN links.\n"
"\n" "\n"
"Options:\n" "Options:\n"
" -f, --family=FAMILY Protocol family (default PF_CAN = %d)\n" " -f, --family=FAMILY Protocol family (default PF_CAN = %d)\n"
" -t, --type=TYPE Socket type, see man 2 socket (default SOCK_RAW = %d)\n" " -t, --type=TYPE Socket type, see man 2 socket (default SOCK_RAW = %d)\n"
" -p, --protocol=PROTO CAN protocol (default CAN_RAW = %d)\n" " -p, --protocol=PROTO CAN protocol (default CAN_RAW = %d)\n"
" -r, --receive work as receiver\n" " -r, --receive work as receiver\n"
" -l --loop=COUNT send COUNT messages\n" " -l COUNT send COUNT messages, infinite if omitted\n"
" -q --quit quit if a wrong sequence is encountered\n" " --loop=COUNT \n"
" -v, --verbose be verbose (twice to be even more verbose\n" " -q --quit quit if a wrong sequence is encountered\n"
" -h --help this help\n" " -v, --verbose be verbose (twice to be even more verbose\n"
" --version print version information and exit\n", " -h --help this help\n"
prg, PF_CAN, SOCK_RAW, CAN_RAW); " --version print version information and exit\n",
prg, PF_CAN, SOCK_RAW, CAN_RAW);
} }
void sigterm(int signo) void sigterm(int signo)
@ -65,7 +65,7 @@ int main(int argc, char **argv)
int nbytes; int nbytes;
struct ifreq ifr; struct ifreq ifr;
int receive = 0; int receive = 0;
int loopcount = 1, infinite = 1; int loopcount = 1, infinite;
unsigned char sequence = 0; unsigned char sequence = 0;
int sequence_init = 1; int sequence_init = 1;
int verbose = 0, quit = 0; int verbose = 0, quit = 0;
@ -73,61 +73,63 @@ int main(int argc, char **argv)
signal(SIGTERM, sigterm); signal(SIGTERM, sigterm);
signal(SIGHUP, sigterm); signal(SIGHUP, sigterm);
struct option long_options[] = { struct option long_options[] = {
{ "help", no_argument, 0, 'h' }, { "help", no_argument, 0, 'h' },
{ "family", required_argument, 0, 'f' }, { "family", required_argument, 0, 'f' },
{ "protocol", required_argument, 0, 'p' }, { "protocol", required_argument, 0, 'p' },
{ "type", required_argument, 0, 't' }, { "type", required_argument, 0, 't' },
{ "version", no_argument, 0, VERSION_OPTION}, { "version", no_argument, 0, VERSION_OPTION},
{ "receive", no_argument, 0, 'r'}, { "receive", no_argument, 0, 'r'},
{ "quit", no_argument, 0, 'q'}, { "quit", no_argument, 0, 'q'},
{ "loop", required_argument, 0, 'l'}, { "loop", optional_argument, 0, 'l'},
{ "verbose", no_argument, 0, 'v'}, { "verbose", no_argument, 0, 'v'},
{ 0, 0, 0, 0}, { 0, 0, 0, 0},
}; };
while ((opt = getopt_long(argc, argv, "f:t:p:vrl:hq", long_options, NULL)) != -1) { while ((opt = getopt_long(argc, argv, "f:t:p:vrl::hq", long_options, NULL)) != -1) {
switch (opt) { switch (opt) {
case 'h': case 'h':
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
case 'f': case 'f':
family = strtoul(optarg, NULL, 0); family = strtoul(optarg, NULL, 0);
break; break;
case 't': case 't':
type = strtoul(optarg, NULL, 0); type = strtoul(optarg, NULL, 0);
break; break;
case 'p': case 'p':
proto = strtoul(optarg, NULL, 0); proto = strtoul(optarg, NULL, 0);
break; break;
case 'l': case 'l':
if (optarg)
loopcount = strtoul(optarg, NULL, 0); loopcount = strtoul(optarg, NULL, 0);
infinite = 0; else
break; infinite = 1;
break;
case 'r': case 'r':
receive = 1; receive = 1;
break; break;
case 'q': case 'q':
quit = 1; quit = 1;
break; break;
case 'v': case 'v':
verbose++; verbose++;
break; break;
case VERSION_OPTION: case VERSION_OPTION:
printf("cansequence %s\n",VERSION); printf("cansequence %s\n", VERSION);
exit(0); exit(0);
default: default:
fprintf(stderr, "Unknown option %c\n", opt); fprintf(stderr, "Unknown option %c\n", opt);
break; break;
} }
} }
@ -137,8 +139,10 @@ int main(int argc, char **argv)
} }
printf("interface = %s, family = %d, type = %d, proto = %d\n", printf("interface = %s, family = %d, type = %d, proto = %d\n",
argv[optind], family, type, proto); argv[optind], family, type, proto);
if ((s = socket(family, type, proto)) < 0) {
s = socket(family, type, proto);
if (s < 0) {
perror("socket"); perror("socket");
return 1; return 1;
} }
@ -153,9 +157,10 @@ int main(int argc, char **argv)
return 1; return 1;
} }
if(receive) { if (receive) {
while ((infinite || loopcount--) && running) { while ((infinite || loopcount--) && running) {
if ((nbytes = read(s, &frame, sizeof(struct can_frame))) < 0) { nbytes = read(s, &frame, sizeof(struct can_frame);
if (nbytes < 0) {
perror("read"); perror("read");
return 1; return 1;
} else { } else {
@ -163,16 +168,16 @@ int main(int argc, char **argv)
sequence_init = 0; sequence_init = 0;
sequence = frame.data[0]; sequence = frame.data[0];
} }
if (verbose>1) if (verbose > 1)
printf("received frame. sequence number: %d\n", frame.data[0]); printf("received frame. sequence number: %d\n", frame.data[0]);
if (frame.data[0] != sequence) { if (frame.data[0] != sequence) {
printf("received wrong sequence count. expected: %d, got: %d\n", printf("received wrong sequence count. expected: %d, got: %d\n",
sequence, frame.data[0]); sequence, frame.data[0]);
if(quit) if (quit)
exit(1); exit(1);
sequence = frame.data[0]; sequence = frame.data[0];
} }
if(verbose && !sequence) if (verbose && !sequence)
printf("sequence wrap around\n"); printf("sequence wrap around\n");
sequence++; sequence++;
} }
@ -182,8 +187,8 @@ int main(int argc, char **argv)
frame.can_id = 2; frame.can_id = 2;
frame.data[0] = 0; frame.data[0] = 0;
while ((infinite || loopcount--) && running) { while ((infinite || loopcount--) && running) {
if (verbose>1) if (verbose > 1)
printf("sending frame. sequence number: %d\n",sequence); printf("sending frame. sequence number: %d\n", sequence);
if (verbose && !sequence) if (verbose && !sequence)
printf("sequence wrap around\n"); printf("sequence wrap around\n");
if (write(s, &frame, sizeof(frame)) < 0) { if (write(s, &frame, sizeof(frame)) < 0) {