int send_can_frame(char *sframe) { int s; /* can raw socket */ struct ifreq ifr; struct sockaddr_can addr; struct canfd_frame frame; int enable_canfd = 1; int required_mtu; if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) { Log("Couldn't create a socket to send frame to node ..."); return 0; } required_mtu = parse_canframe(&sframe, &frame); /** * Copy CAN interface name to ifr_name m/nb */ strncpy(ifr.ifr_name, VIRTUALCAR, IFNAMSIZ - 1); ifr.ifr_name[IFNAMSIZ - 1] = '\0'; ifr.ifr_ifindex = if_nametoindex(ifr.ifr_name); if (!ifr.ifr_ifindex) { Log("Couldn't convert ifr_name to if_index ..."); return 0; } addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; /* Frame size = CAN netdevice space */ if (ioctl(s, SIOCGIFMTU, &ifr) < 0) { Log("Couldn't fit can_frame in netdevice ..."); return 0; } /** Frame is MTU but interface does not support it */ if (can_gateway_check_mtu(&ifr) != 1) { return 0; } if (setsockopt(s, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &enable_canfd, sizeof(enable_canfd))){ Log("Couldn't enable CAN FD support ..."); return 0; } if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { Log("Couldn't bind to the interface address ..."); } if (write(s, &frame, required_mtu) != required_mtu) { Log("Couldn't write through socket ..."); return 0; } close(s); return 1; }
int main(int argc, char **argv) { int s; /* can raw socket */ int nbytes; struct sockaddr_can addr; struct can_frame frame; struct ifreq ifr; /* check command line options */ if (argc != 3) { fprintf(stderr, "Usage: %s <device> <can_frame>.\n", argv[0]); return 1; } /* parse CAN frame */ if (parse_canframe(argv[2], &frame)) { fprintf(stderr, "\nWrong CAN-frame format!\n\n"); fprintf(stderr, "Try: <can_id>#{R|data}\n"); fprintf(stderr, "can_id can have 3 (SFF) or 8 (EFF) hex chars\n"); fprintf(stderr, "data has 0 to 8 hex-values that can (optionally)"); fprintf(stderr, " be seperated by '.'\n\n"); fprintf(stderr, "e.g. 5A1#11.2233.44556677.88 / 123#DEADBEEF / "); fprintf(stderr, "5AA# /\n 1F334455#1122334455667788 / 123#R "); fprintf(stderr, "for remote transmission request.\n\n"); return 1; } /* open socket */ if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) { perror("socket"); return 1; } strcpy(ifr.ifr_name, argv[1]); ioctl(s, SIOCGIFINDEX, &ifr); addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); return 1; } /* send frame */ if ((nbytes = write(s, &frame, sizeof(frame))) != sizeof(frame)) { perror("write"); return 1; } //fprint_long_canframe(stdout, &frame, "\n", 0); close(s); return 0; }
int main(int argc, char **argv) { char buf[100], timestamp[100], device[100], ascframe[100]; struct can_frame cf; while (fgets(buf, 99, stdin)) { if (sscanf(buf, "%s %s %s", timestamp, device, ascframe) != 3) return 1; if (parse_canframe(ascframe, &cf)) return 1; sprint_long_canframe(ascframe, &cf, 1); /* with ASCII output */ printf("%s %s %s\n", timestamp, device, ascframe); } return 0; }
int main(int argc, char **argv) { int s; /* can raw socket */ int nbytes; struct sockaddr_can addr; struct can_frame frame; struct ifreq ifr; /* check command line options */ if (argc != 3) { fprintf(stderr, "Usage: %s <device> <can_frame>.\n", argv[0]); return 1; } /* parse CAN frame */ if (parse_canframe(argv[2], &frame)){ fprintf(stderr, "\nWrong CAN-frame format!\n\n"); fprintf(stderr, "Try: <can_id>#{R|data}\n"); fprintf(stderr, "can_id can have 3 (SFF) or 8 (EFF) hex chars\n"); fprintf(stderr, "data has 0 to 8 hex-values that can (optionally)"); fprintf(stderr, " be seperated by '.'\n\n"); fprintf(stderr, "e.g. 5A1#11.2233.44556677.88 / 123#DEADBEEF / "); fprintf(stderr, "5AA# /\n 1F334455#1122334455667788 / 123#R "); fprintf(stderr, "for remote transmission request.\n\n"); return 1; } /* open socket */ if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) { perror("socket"); return 1; } addr.can_family = AF_CAN; strcpy(ifr.ifr_name, argv[1]); if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) { perror("SIOCGIFINDEX"); return 1; } addr.can_ifindex = ifr.ifr_ifindex; /* disable default receive filter on this RAW socket */ /* This is obsolete as we do not read from the socket at all, but for */ /* this reason we can remove the receive list in the Kernel to save a */ /* little (really a very little!) CPU usage. */ setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0); if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); return 1; } /* send frame */ if ((nbytes = write(s, &frame, sizeof(frame))) != sizeof(frame)) { perror("write"); return 1; } //fprint_long_canframe(stdout, &frame, "\n", 0); close(s); return 0; }
int main(int argc, char **argv) { char buf[100], device[100], ascframe[100], id[10]; struct can_frame cf; static struct timeval tv, start_tv; FILE *infile = stdin; FILE *outfile = stdout; static int maxdev, devno, i, crlf, d4, opt; while ((opt = getopt(argc, argv, "I:O:4n")) != -1) { switch (opt) { case 'I': infile = fopen(optarg, "r"); if (!infile) { perror("infile"); return 1; } break; case 'O': outfile = fopen(optarg, "w"); if (!outfile) { perror("outfile"); return 1; } break; case 'n': crlf = 1; break; case '4': d4 = 1; break; default: fprintf(stderr, "Unknown option %c\n", opt); print_usage(basename(argv[0])); return 1; break; } } maxdev = argc - optind; /* find real number of CAN devices */ if (!maxdev) { fprintf(stderr, "no CAN interfaces defined!\n"); print_usage(basename(argv[0])); return 1; } //printf("Found %d CAN devices!\n", maxdev); while (fgets(buf, 99, infile)) { if (sscanf(buf, "(%ld.%ld) %s %s", &tv.tv_sec, &tv.tv_usec, device, ascframe) != 4) return 1; if (!start_tv.tv_sec) { /* print banner */ start_tv = tv; fprintf(outfile, "date %s", ctime(&start_tv.tv_sec)); fprintf(outfile, "base hex timestamps absolute%s", (crlf)?"\r\n":"\n"); fprintf(outfile, "no internal events logged%s", (crlf)?"\r\n":"\n"); } for (i=0, devno=0; i<maxdev; i++) { if (!strcmp(device, argv[optind+i])) { devno = i+1; /* start with channel '1' */ break; } } if (devno) { /* only convert for selected CAN devices */ if (parse_canframe(ascframe, &cf)) return 1; tv.tv_sec = tv.tv_sec - start_tv.tv_sec; tv.tv_usec = tv.tv_usec - start_tv.tv_usec; if (tv.tv_usec < 0) tv.tv_sec--, tv.tv_usec += 1000000; if (tv.tv_sec < 0) tv.tv_sec = tv.tv_usec = 0; if (d4) fprintf(outfile, "%4ld.%04ld ", tv.tv_sec, tv.tv_usec/100); else fprintf(outfile, "%4ld.%06ld ", tv.tv_sec, tv.tv_usec); fprintf(outfile, "%-2d ", devno); /* channel number left aligned */ if (cf.can_id & CAN_ERR_FLAG) fprintf(outfile, "ErrorFrame"); else { sprintf(id, "%X%c", cf.can_id & CAN_EFF_MASK, (cf.can_id & CAN_EFF_FLAG)?'x':' '); fprintf(outfile, "%-15s Rx ", id); if (cf.can_id & CAN_RTR_FLAG) fprintf(outfile, "r"); /* RTR frame */ else { fprintf(outfile, "d %d", cf.can_dlc); /* data frame */ for (i = 0; i < cf.can_dlc; i++) { fprintf(outfile, " %02X", cf.data[i]); } } } if (crlf) fprintf(outfile, "\r"); fprintf(outfile, "\n"); } } fflush(outfile); return 0; }
int main(int argc, char **argv) { int s; /* can raw socket */ int nbytes; struct sockaddr_can addr; struct can_frame frame; struct ifreq ifr; int i; /* CAN message to be sent out */ unsigned char buff[] = "7DF#0201050000000000"; fprintf(stderr,"CAN testing\n"); /* parse CAN frame */ if (parse_canframe(buff, &frame)){ fprintf(stderr, "\nWrong CAN-frame format!\n\n"); fprintf(stderr, "Try: <can_id>#{R|data}\n"); fprintf(stderr, "can_id can have 3 (SFF) or 8 (EFF) hex chars\n"); fprintf(stderr, "data has 0 to 8 hex-values that can (optionally)"); fprintf(stderr, " be seperated by '.'\n\n"); fprintf(stderr, "e.g. 5A1#11.2233.44556677.88 / 123#DEADBEEF / "); fprintf(stderr, "5AA# /\n 1F334455#1122334455667788 / 123#R "); fprintf(stderr, "for remote transmission request.\n\n"); return 1; } /* open socket */ if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) { perror("socket"); return 1; } addr.can_family = AF_CAN; strcpy(ifr.ifr_name, "can0"); if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) { perror("SIOCGIFINDEX"); return 1; } addr.can_ifindex = ifr.ifr_ifindex; /* disable default receive filter on this RAW socket */ /* This is obsolete as we do not read from the socket at all, but for */ /* this reason we can remove the receive list in the Kernel to save a */ /* little (really a very little!) CPU usage. */ setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0); if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); return 1; } /* send frame */ for(i=0;i<100;i++) { if ((nbytes = write(s, &frame, sizeof(frame))) != sizeof(frame)) { perror("write"); return 1; } fprintf(stderr, "%d \n", i); usleep(10000); /* Delay before next loop */ } close(s); return 0; }
int main(int argc, char **argv) { unsigned long gap = DEFAULT_GAP; unsigned char extended = 0; unsigned char fix_id = 0; unsigned char fix_data = 0; unsigned char fix_dlc = 0; unsigned char default_frame = 1; unsigned char verbose = 0; int opt; int s; /* socket */ struct sockaddr_can addr; static struct can_frame frame; int nbytes; struct ifreq ifr; struct timespec ts; signal(SIGTERM, sigterm); signal(SIGHUP, sigterm); signal(SIGINT, sigterm); while ((opt = getopt(argc, argv, "g:eIDLf:v")) != -1) { switch (opt) { case 'g': gap = strtoul(optarg, NULL, 10); break; case 'e': extended = 1; break; case 'I': fix_id = 1; break; case 'D': fix_data = 1; break; case 'L': fix_dlc = 1; break; case 'f': default_frame = 0; if (parse_canframe(optarg, &frame)) { fprintf(stderr, "'%s' is a wrong CAN frame format.\n", optarg); exit(1); } break; case 'v': verbose = 1; break; default: print_usage(basename(argv[0])); exit(1); break; } } if (optind == argc) { print_usage(basename(argv[0])); exit(0); } ts.tv_sec = gap / 1000; ts.tv_nsec = (gap % 1000) * 1000000; if (default_frame) { if (extended) frame.can_id = 0x12345678 | CAN_EFF_FLAG; else frame.can_id = 0x123; frame.can_dlc = 8; frame.data[0] = 0x01; frame.data[1] = 0x23; frame.data[2] = 0x45; frame.data[3] = 0x67; frame.data[4] = 0x89; frame.data[5] = 0xAB; frame.data[6] = 0xCD; frame.data[7] = 0xEF; } if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) { perror("socket"); return 1; } addr.can_family = AF_CAN; strcpy(ifr.ifr_name, argv[optind]); if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) perror("SIOCGIFINDEX"); addr.can_ifindex = ifr.ifr_ifindex; /* disable default receive filter on this RAW socket */ /* This is obsolete as we do not read from the socket at all, but for */ /* this reason we can remove the receive list in the Kernel to save a */ /* little (really a very little!) CPU usage. */ setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0); if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); return 1; } while (running) { if (!fix_id) { frame.can_id = random(); if (extended) { frame.can_id &= CAN_EFF_MASK; frame.can_id |= CAN_EFF_FLAG; } else frame.can_id &= CAN_SFF_MASK; } if (!fix_dlc) { frame.can_dlc = random() & 0xF; if (frame.can_dlc & 8) frame.can_dlc = 8; /* for about 50% of the frames */ } if (!fix_data) { /* that's what the 64 bit alignment of data[] is for ... :) */ *(unsigned long*)(&frame.data[0]) = random(); *(unsigned long*)(&frame.data[4]) = random(); } if ((nbytes = write(s, &frame, sizeof(struct can_frame))) < 0) { perror("write"); return 1; } else if (nbytes < sizeof(struct can_frame)) { fprintf(stderr, "write: incomplete CAN frame\n"); return 1; } if (gap) /* gap == 0 => performance test :-] */ if (nanosleep(&ts, NULL)) return 1; if (verbose) #if 0 fprint_long_canframe(stdout, &frame, "\n", 1); #else fprint_canframe(stdout, &frame, "\n", 1); #endif } close(s); return 0; }
int main(int argc, char **argv) { static char buf[BUFSZ], device[BUFSZ], ascframe[BUFSZ]; struct sockaddr_can addr; static struct canfd_frame frame; static struct timeval today_tv, log_tv, last_log_tv, diff_tv; struct timespec sleep_ts; int s; /* CAN_RAW socket */ FILE *infile = stdin; unsigned long gap = DEFAULT_GAP; int use_timestamps = 1; static int verbose, opt, delay_loops; static unsigned long skipgap; static int loopback_disable = 0; static int infinite_loops = 0; static int loops = DEFAULT_LOOPS; int assignments; /* assignments defined on the commandline */ int txidx; /* sendto() interface index */ int eof, txmtu, i, j; char *fret; while ((opt = getopt(argc, argv, "I:l:tg:s:xv?")) != -1) { switch (opt) { case 'I': infile = fopen(optarg, "r"); if (!infile) { perror("infile"); return 1; } break; case 'l': if (optarg[0] == 'i') infinite_loops = 1; else if (!(loops = atoi(optarg))) { fprintf(stderr, "Invalid argument for option -l !\n"); return 1; } break; case 't': use_timestamps = 0; break; case 'g': gap = strtoul(optarg, NULL, 10); break; case 's': skipgap = strtoul(optarg, NULL, 10); if (skipgap < 1) { fprintf(stderr, "Invalid argument for option -s !\n"); return 1; } break; case 'x': loopback_disable = 1; break; case 'v': verbose++; break; case '?': default: print_usage(basename(argv[0])); return 1; break; } } assignments = argc - optind; /* find real number of user assignments */ if (infile == stdin) { /* no jokes with stdin */ infinite_loops = 0; loops = 1; } if (verbose > 1) { /* use -v -v to see this */ if (infinite_loops) printf("infinite_loops\n"); else printf("%d loops\n", loops); } sleep_ts.tv_sec = gap / 1000; sleep_ts.tv_nsec = (gap % 1000) * 1000000; /* open socket */ if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) { perror("socket"); return 1; } addr.can_family = AF_CAN; addr.can_ifindex = 0; /* disable unneeded default receive filter on this RAW socket */ setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0); /* try to switch the socket into CAN FD mode */ setsockopt(s, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_on, sizeof(canfd_on)); if (loopback_disable) { int loopback = 0; setsockopt(s, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &loopback, sizeof(loopback)); } if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); return 1; } if (assignments) { /* add & check user assginments from commandline */ for (i=0; i<assignments; i++) { if (strlen(argv[optind+i]) >= BUFSZ) { fprintf(stderr, "Assignment too long!\n"); print_usage(basename(argv[0])); return 1; } strcpy(buf, argv[optind+i]); for (j=0; j<BUFSZ; j++) { /* find '=' in assignment */ if (buf[j] == '=') break; } if ((j == BUFSZ) || (buf[j] != '=')) { fprintf(stderr, "'=' missing in assignment!\n"); print_usage(basename(argv[0])); return 1; } buf[j] = 0; /* cut string in two pieces */ if (add_assignment("user", s, &buf[0], &buf[j+1], verbose)) return 1; } } while (infinite_loops || loops--) { if (infile != stdin) rewind(infile); /* for each loop */ if (verbose > 1) /* use -v -v to see this */ printf (">>>>>>>>> start reading file. remaining loops = %d\n", loops); /* read first non-comment frame from logfile */ while ((fret = fgets(buf, BUFSZ-1, infile)) != NULL && buf[0] != '(') { if (strlen(buf) >= BUFSZ-2) { fprintf(stderr, "comment line too long for input buffer\n"); return 1; } } if (!fret) goto out; /* nothing to read */ eof = 0; if (sscanf(buf, "(%ld.%ld) %s %s", &log_tv.tv_sec, &log_tv.tv_usec, device, ascframe) != 4) { fprintf(stderr, "incorrect line format in logfile\n"); return 1; } if (use_timestamps) { /* throttle sending due to logfile timestamps */ gettimeofday(&today_tv, NULL); create_diff_tv(&today_tv, &diff_tv, &log_tv); last_log_tv = log_tv; } while (!eof) { while ((!use_timestamps) || (frames_to_send(&today_tv, &diff_tv, &log_tv) < 0)) { /* log_tv/device/ascframe are valid here */ if (strlen(device) >= IFNAMSIZ) { fprintf(stderr, "log interface name '%s' too long!", device); return 1; } txidx = get_txidx(device); /* get ifindex for sending the frame */ if ((!txidx) && (!assignments)) { /* ifindex not found and no user assignments */ /* => assign this device automatically */ if (add_assignment("auto", s, device, device, verbose)) return 1; txidx = get_txidx(device); } if (txidx == STDOUTIDX) { /* hook to print logfile lines on stdout */ printf("%s", buf); /* print the line AS-IS without extra \n */ fflush(stdout); } else if (txidx > 0) { /* only send to valid CAN devices */ txmtu = parse_canframe(ascframe, &frame); if (!txmtu) { fprintf(stderr, "wrong CAN frame format: '%s'!", ascframe); return 1; } addr.can_family = AF_CAN; addr.can_ifindex = txidx; /* send via this interface */ if (sendto(s, &frame, txmtu, 0, (struct sockaddr*)&addr, sizeof(addr)) != txmtu) { perror("sendto"); return 1; } if (verbose) { printf("%s (%s) ", get_txname(device), device); if (txmtu == CAN_MTU) fprint_long_canframe(stdout, &frame, "\n", CANLIB_VIEW_INDENT_SFF, CAN_MAX_DLEN); else fprint_long_canframe(stdout, &frame, "\n", CANLIB_VIEW_INDENT_SFF, CANFD_MAX_DLEN); } } /* read next non-comment frame from logfile */ while ((fret = fgets(buf, BUFSZ-1, infile)) != NULL && buf[0] != '(') { if (strlen(buf) >= BUFSZ-2) { fprintf(stderr, "comment line too long for input buffer\n"); return 1; } } if (!fret) { eof = 1; /* this file is completely processed */ break; } if (sscanf(buf, "(%ld.%ld) %s %s", &log_tv.tv_sec, &log_tv.tv_usec, device, ascframe) != 4) { fprintf(stderr, "incorrect line format in logfile\n"); return 1; } if (use_timestamps) { gettimeofday(&today_tv, NULL); /* test for logfile timestamps jumping backwards OR */ /* if the user likes to skip long gaps in the timestamps */ if ((last_log_tv.tv_sec > log_tv.tv_sec) || (skipgap && labs(last_log_tv.tv_sec - log_tv.tv_sec) > skipgap)) create_diff_tv(&today_tv, &diff_tv, &log_tv); last_log_tv = log_tv; } } /* while frames_to_send ... */ if (nanosleep(&sleep_ts, NULL)) return 1; delay_loops++; /* private statistics */ gettimeofday(&today_tv, NULL); } /* while (!eof) */ } /* while (infinite_loops || loops--) */ out: close(s); fclose(infile); if (verbose > 1) /* use -v -v to see this */ printf("%d delay_loops\n", delay_loops); return 0; }
int main(int argc, char **argv) { int s; /* can raw socket */ int nbytes, ret; struct sockaddr_can addr; struct can_frame frame, rframe; struct ifreq ifr; int i; /* check command line options */ if ((argc != 2) && (argc != 3)) { fprintf(stderr, "Usage: send frame: %s <device>.\n", argv[0]); fprintf(stderr, "Usage: receive frame: %s <device> <can_frame>.\n", argv[0]); return 1; } /* open socket */ if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) { perror("socket"); return 1; } strcpy(ifr.ifr_name, argv[1]); ioctl(s, SIOCGIFINDEX, &ifr); addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; #ifdef TOLTO_GEA ifr.ifr_ifru.ifru_ivalue = 1000000/2; ret = ioctl(s, SIOCSCANBAUDRATE, &ifr); if (ret) { printf("Err: cantest failed to set up baud rate for can port %s\n", argv[1]); printf(" Please check the settings of system clock.\n"); exit(1); } #endif if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); return 1; } if (argc ==3) { printf("writing to CAN\n"); /* parse CAN frame */ if (parse_canframe(argv[2], &frame)){ fprintf(stderr, "\nWrong CAN-frame format!\n\n"); fprintf(stderr, "Try: <can_id>#{R|data}\n"); fprintf(stderr, "can_id can have 3 (SFF) or 8 (EFF) hex chars\n"); fprintf(stderr, "data has 0 to 8 hex-values that can (optionally)"); fprintf(stderr, " be seperated by '.'\n\n"); fprintf(stderr, "e.g. 5A1#11.2233.44556677.88 / 123#DEADBEEF / "); fprintf(stderr, "5AA# /\n 1F334455#1122334455667788 / 123#R "); fprintf(stderr, "for remote transmission request.\n\n"); return 1; } if ((nbytes = write(s, &frame, sizeof(frame))) != sizeof(frame)) { perror("write"); return 1; } } else if (argc == 2) { printf("reading from CAN\n"); if ((nbytes = read(s, &rframe, sizeof(rframe))) < 0) { perror("rx frame read"); return 0; } printf("\nread %d bytes\n", nbytes); fprint_long_canframe(stdout, &rframe, "\n", 0); } close(s); return 0; }