can-utils: unify indention

Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
master
Oliver Hartkopp 2025-12-13 10:38:15 +01:00
parent 88a0417a6b
commit 7939678070
14 changed files with 685 additions and 684 deletions

View File

@ -584,7 +584,7 @@ static void eval_canxl_fd(char* buf, struct timeval *date_tvp, char timestamps,
return; return;
if (!(flags & ASC_F_FDF)) if (!(flags & ASC_F_FDF))
return; return;
cf.flags = CANFD_FDF; cf.flags = CANFD_FDF;

View File

@ -715,12 +715,12 @@ int main(int argc, char **argv)
localtime_r(&currtime, &now); localtime_r(&currtime, &now);
snprintf(fname, sizeof(fname), "candump-%04d-%02d-%02d_%02d%02d%02d.log", snprintf(fname, sizeof(fname), "candump-%04d-%02d-%02d_%02d%02d%02d.log",
now.tm_year + 1900, now.tm_year + 1900,
now.tm_mon + 1, now.tm_mon + 1,
now.tm_mday, now.tm_mday,
now.tm_hour, now.tm_hour,
now.tm_min, now.tm_min,
now.tm_sec); now.tm_sec);
logname = fname; logname = fname;
} }
@ -891,8 +891,8 @@ int main(int argc, char **argv)
alen = sprintf(afrbuf, " %s", (color > 2) ? col_on[idx % MAXCOL] : ""); alen = sprintf(afrbuf, " %s", (color > 2) ? col_on[idx % MAXCOL] : "");
alen += sprint_timestamp(afrbuf + alen, timestamp, use_ns, &ts, &last_ts); alen += sprint_timestamp(afrbuf + alen, timestamp, use_ns, &ts, &last_ts);
alen += sprintf(afrbuf + alen, " %s%*s", alen += sprintf(afrbuf + alen, " %s%*s",
(color && (color < 3)) ? col_on[idx % MAXCOL] : "", (color && (color < 3)) ? col_on[idx % MAXCOL] : "",
max_devname_len, devname[idx]); max_devname_len, devname[idx]);
if (extra_msg_info) { if (extra_msg_info) {
if (msg.msg_flags & MSG_DONTROUTE) if (msg.msg_flags & MSG_DONTROUTE)

View File

@ -317,8 +317,8 @@ int main(int argc, char **argv)
for (i=0; i<currmax; i++) { for (i=0; i<currmax; i++) {
pr_debug("open %d '%s' m%08X v%08X i%d e%d.\n", pr_debug("open %d '%s' m%08X v%08X i%d e%d.\n",
i, argv[optind+i], mask[i], value[i], i, argv[optind+i], mask[i], value[i],
inv_filter[i], err_mask[i]); inv_filter[i], err_mask[i]);
if ((s[i] = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) { if ((s[i] = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
perror("socket"); perror("socket");

View File

@ -161,15 +161,15 @@ void switchvdl(char *delim)
int comp(const void *elem1, const void *elem2) int comp(const void *elem1, const void *elem2)
{ {
unsigned long f = ((struct snif*)elem1)->current.can_id; unsigned long f = ((struct snif*)elem1)->current.can_id;
unsigned long s = ((struct snif*)elem2)->current.can_id; unsigned long s = ((struct snif*)elem2)->current.can_id;
if (f > s) if (f > s)
return 1; return 1;
if (f < s) if (f < s)
return -1; return -1;
return 0; return 0;
} }
void print_usage(char *prg) void print_usage(char *prg)
@ -741,10 +741,10 @@ int handle_timeo(long currcms)
do_clr(i, UPDATE); do_clr(i, UPDATE);
} }
else if ((sniftab[i].hold) && (sniftab[i].hold < currcms)) { else if ((sniftab[i].hold) && (sniftab[i].hold < currcms)) {
memset(&sniftab[i].marker.data, 0, max_dlen); memset(&sniftab[i].marker.data, 0, max_dlen);
print_snifline(i); print_snifline(i);
sniftab[i].hold = 0; /* disable update by hold */ sniftab[i].hold = 0; /* disable update by hold */
} }
else else
printf("%s", CSR_DOWN); /* skip my line */ printf("%s", CSR_DOWN); /* skip my line */

View File

@ -426,112 +426,112 @@ int main(int argc, char **argv)
} }
} }
if (frame.can_id & CAN_EFF_FLAG) if (frame.can_id & CAN_EFF_FLAG)
printf(" %s %8X", argv[optind], frame.can_id & CAN_EFF_MASK); printf(" %s %8X", argv[optind], frame.can_id & CAN_EFF_MASK);
else else
printf(" %s %3X", argv[optind], frame.can_id & CAN_SFF_MASK); printf(" %s %3X", argv[optind], frame.can_id & CAN_SFF_MASK);
if (ext) if (ext)
printf("{%02X}", frame.data[0]); printf("{%02X}", frame.data[0]);
if (nbytes == CAN_MTU) if (nbytes == CAN_MTU)
printf(" [%d] ", frame.len); printf(" [%d] ", frame.len);
else else
printf(" [%02d] ", frame.len); printf(" [%02d] ", frame.len);
datidx = 0; datidx = 0;
n_pci = frame.data[ext]; n_pci = frame.data[ext];
switch (n_pci & 0xF0) { switch (n_pci & 0xF0) {
case 0x00: case 0x00:
is_ff = 1; is_ff = 1;
if (n_pci & 0xF) { if (n_pci & 0xF) {
printf("[SF] ln: %-4d data:", n_pci & 0xF); printf("[SF] ln: %-4d data:", n_pci & 0xF);
datidx = ext+1;
} else {
printf("[SF] ln: %-4d data:", frame.data[ext + 1]);
datidx = ext+2;
}
break;
case 0x10:
is_ff = 1;
fflen = ((n_pci & 0x0F)<<8) + frame.data[ext+1];
if (fflen)
datidx = ext+2;
else {
fflen = (frame.data[ext+2]<<24) +
(frame.data[ext+3]<<16) +
(frame.data[ext+4]<<8) +
frame.data[ext+5];
datidx = ext+6;
}
printf("[FF] ln: %-4lu data:", fflen);
break;
case 0x20:
printf("[CF] sn: %X data:", n_pci & 0x0F);
datidx = ext+1; datidx = ext+1;
break; } else {
printf("[SF] ln: %-4d data:", frame.data[ext + 1]);
datidx = ext+2;
}
break;
case 0x30: case 0x10:
n_pci &= 0x0F; is_ff = 1;
printf("[FC] FC: %d ", n_pci); fflen = ((n_pci & 0x0F)<<8) + frame.data[ext+1];
if (fflen)
datidx = ext+2;
else {
fflen = (frame.data[ext+2]<<24) +
(frame.data[ext+3]<<16) +
(frame.data[ext+4]<<8) +
frame.data[ext+5];
datidx = ext+6;
}
printf("[FF] ln: %-4lu data:", fflen);
break;
if (n_pci > 3) case 0x20:
n_pci = 3; printf("[CF] sn: %X data:", n_pci & 0x0F);
datidx = ext+1;
break;
printf("= %s # ", fc_info[n_pci]); case 0x30:
n_pci &= 0x0F;
printf("[FC] FC: %d ", n_pci);
printf("BS: %d %s# ", frame.data[ext+1], if (n_pci > 3)
(frame.data[ext+1])? "":"= off "); n_pci = 3;
i = frame.data[ext+2]; printf("= %s # ", fc_info[n_pci]);
printf("STmin: 0x%02X = ", i);
if (i < 0x80) printf("BS: %d %s# ", frame.data[ext+1],
printf("%d ms", i); (frame.data[ext+1])? "":"= off ");
else if (i > 0xF0 && i < 0xFA)
printf("%d us", (i & 0x0F) * 100);
else
printf("reserved");
break;
default: i = frame.data[ext+2];
printf("[??]"); printf("STmin: 0x%02X = ", i);
if (i < 0x80)
printf("%d ms", i);
else if (i > 0xF0 && i < 0xFA)
printf("%d us", (i & 0x0F) * 100);
else
printf("reserved");
break;
default:
printf("[??]");
}
if (datidx && frame.len > datidx) {
printf(" ");
for (i = datidx; i < frame.len; i++) {
printf("%02X ", frame.data[i]);
} }
if (datidx && frame.len > datidx) { if (asc) {
printf(" "); printf("%*s", ((7-ext) - (frame.len-datidx))*3 + 5 ,
"- '");
for (i = datidx; i < frame.len; i++) { for (i = datidx; i < frame.len; i++) {
printf("%02X ", frame.data[i]); printf("%c",((frame.data[i] > 0x1F) &&
} (frame.data[i] < 0x7F))?
frame.data[i] : '.');
if (asc) {
printf("%*s", ((7-ext) - (frame.len-datidx))*3 + 5 ,
"- '");
for (i = datidx; i < frame.len; i++) {
printf("%c",((frame.data[i] > 0x1F) &&
(frame.data[i] < 0x7F))?
frame.data[i] : '.');
}
printf("'");
}
if (uds_output && is_ff) {
int offset = 3;
if (asc)
offset = 1;
printf("%*s", ((7-ext) - (frame.len-datidx))*offset + 3,
" - ");
print_uds_message(frame.data[datidx], frame.data[datidx+2]);
is_ff = 0;
} }
printf("'");
} }
if (uds_output && is_ff) {
int offset = 3;
if (asc)
offset = 1;
printf("%*s", ((7-ext) - (frame.len-datidx))*offset + 3,
" - ");
print_uds_message(frame.data[datidx], frame.data[datidx+2]);
is_ff = 0;
}
}
if (color) if (color)
printf("%s", ATTRESET); printf("%s", ATTRESET);
printf("\n"); printf("\n");
fflush(stdout); fflush(stdout);
} }
close(s); close(s);

View File

@ -243,177 +243,177 @@ int main(int argc, char **argv)
continue; continue;
} }
/* check extended address if provided */
if (ext && extaddr != frame.data[0])
continue;
/* only get flow control information from dst CAN ID */
if (frame.can_id == dst) {
/* check extended address if provided */ /* check extended address if provided */
if (ext && extaddr != frame.data[0]) if (rx_ext && frame.data[0] != rx_extaddr)
continue; continue;
/* only get flow control information from dst CAN ID */ n_pci = frame.data[rx_ext];
if (frame.can_id == dst) { /* check flow control PCI only */
/* check extended address if provided */ if ((n_pci & 0xF0) != 0x30)
if (rx_ext && frame.data[0] != rx_extaddr) continue;
continue;
n_pci = frame.data[rx_ext]; bs = frame.data[rx_ext + 1];
/* check flow control PCI only */ stmin = frame.data[rx_ext + 2];
if ((n_pci & 0xF0) != 0x30) }
continue;
bs = frame.data[rx_ext + 1]; /* data content starts and index datidx */
stmin = frame.data[rx_ext + 2]; datidx = 0;
n_pci = frame.data[ext];
switch (n_pci & 0xF0) {
case 0x00:
/* SF */
if (n_pci & 0xF) {
fflen = rcvlen = n_pci & 0xF;
datidx = ext+1;
} else {
fflen = rcvlen = frame.data[ext + 1];
datidx = ext+2;
} }
/* data content starts and index datidx */ /* ignore incorrect SF PDUs */
datidx = 0; if (frame.len < rcvlen + datidx)
n_pci = frame.data[ext];
switch (n_pci & 0xF0) {
case 0x00:
/* SF */
if (n_pci & 0xF) {
fflen = rcvlen = n_pci & 0xF;
datidx = ext+1;
} else {
fflen = rcvlen = frame.data[ext + 1];
datidx = ext+2;
}
/* ignore incorrect SF PDUs */
if (frame.len < rcvlen + datidx)
fflen = rcvlen = 0;
/* get number of digits for printing */
fflen_digits = getdigits(fflen);
/* get CAN FD bitrate & LL_DL setting information */
brs = frame.flags & CANFD_BRS;
ll_dl = frame.len;
if (ll_dl < 8)
ll_dl = 8;
ioctl(s, SIOCGSTAMP, &start_tv);
/* determine CAN frame mode for this PDU */
if (nbytes == CAN_MTU)
canfd_on = 0;
else
canfd_on = 1;
break;
case 0x10:
/* FF */
fflen = ((n_pci & 0x0F)<<8) + frame.data[ext+1];
if (fflen)
datidx = ext+2;
else {
fflen = (frame.data[ext+2]<<24) +
(frame.data[ext+3]<<16) +
(frame.data[ext+4]<<8) +
frame.data[ext+5];
datidx = ext+6;
}
/* to increase the time resolution we multiply fflen with 1000 later */
if (fflen >= (UINT32_MAX / 1000)) {
printf("fflen %lu is more than ~4.2 MB - ignoring PDU\n", fflen);
fflush(stdout);
fflen = rcvlen = 0;
continue;
}
rcvlen = frame.len - datidx;
last_sn = 0;
/* get number of digits for printing */
fflen_digits = getdigits(fflen);
/* get CAN FD bitrate & LL_DL setting information */
brs = frame.flags & CANFD_BRS;
ll_dl = frame.len;
ioctl(s, SIOCGSTAMP, &start_tv);
/* determine CAN frame mode for this PDU */
if (nbytes == CAN_MTU)
canfd_on = 0;
else
canfd_on = 1;
break;
case 0x20:
/* CF */
if (rcvlen) {
sn = n_pci & 0x0F;
if (sn == ((last_sn + 1) & 0xF)) {
last_sn = sn;
datidx = ext+1;
rcvlen += frame.len - datidx;
}
}
break;
default:
break;
}
/* PDU reception in process */
if (rcvlen) {
if (rcvlen > fflen)
rcvlen = fflen;
percent = (rcvlen * 100 / fflen);
printf("\r %3lu%% ", percent);
printf("|");
if (percent > 100)
percent = 100;
for (i=0; i < NUMBAR; i++){
if (i < (int)(percent/PERCENTRES))
printf("X");
else
printf(".");
}
printf("| %*lu/%lu ", fflen_digits, rcvlen, fflen);
}
/* PDU complete */
if (rcvlen && rcvlen >= fflen) {
printf("\r%s %02d%c (BS:%2hhu # ", canfd_on?"CAN-FD":"CAN2.0", ll_dl, brs?'*':' ', bs);
if (stmin < 0x80)
printf("STmin:%3hhu msec)", stmin);
else if (stmin > 0xF0 && stmin < 0xFA)
printf("STmin:%3u usec)", (stmin & 0xF) * 100);
else
printf("STmin: invalid )");
printf(" : %lu byte in ", fflen);
/* calculate time */
ioctl(s, SIOCGSTAMP, &end_tv);
diff_tv.tv_sec = end_tv.tv_sec - start_tv.tv_sec;
diff_tv.tv_usec = end_tv.tv_usec - start_tv.tv_usec;
if (diff_tv.tv_usec < 0)
diff_tv.tv_sec--, diff_tv.tv_usec += 1000000;
if (diff_tv.tv_sec < 0)
diff_tv.tv_sec = diff_tv.tv_usec = 0;
/* check devisor to be not zero */
if (diff_tv.tv_sec * 1000 + diff_tv.tv_usec / 1000){
printf("%llu.%06llus ", (unsigned long long)diff_tv.tv_sec, (unsigned long long)diff_tv.tv_usec);
printf("=> %lu byte/s", (fflen * 1000) /
(unsigned long)(diff_tv.tv_sec * 1000 + diff_tv.tv_usec / 1000));
} else
printf("(no time available) ");
printf("\n");
/* wait for next PDU */
fflen = rcvlen = 0; fflen = rcvlen = 0;
/* get number of digits for printing */
fflen_digits = getdigits(fflen);
/* get CAN FD bitrate & LL_DL setting information */
brs = frame.flags & CANFD_BRS;
ll_dl = frame.len;
if (ll_dl < 8)
ll_dl = 8;
ioctl(s, SIOCGSTAMP, &start_tv);
/* determine CAN frame mode for this PDU */
if (nbytes == CAN_MTU)
canfd_on = 0;
else
canfd_on = 1;
break;
case 0x10:
/* FF */
fflen = ((n_pci & 0x0F)<<8) + frame.data[ext+1];
if (fflen)
datidx = ext+2;
else {
fflen = (frame.data[ext+2]<<24) +
(frame.data[ext+3]<<16) +
(frame.data[ext+4]<<8) +
frame.data[ext+5];
datidx = ext+6;
} }
fflush(stdout);
/* to increase the time resolution we multiply fflen with 1000 later */
if (fflen >= (UINT32_MAX / 1000)) {
printf("fflen %lu is more than ~4.2 MB - ignoring PDU\n", fflen);
fflush(stdout);
fflen = rcvlen = 0;
continue;
}
rcvlen = frame.len - datidx;
last_sn = 0;
/* get number of digits for printing */
fflen_digits = getdigits(fflen);
/* get CAN FD bitrate & LL_DL setting information */
brs = frame.flags & CANFD_BRS;
ll_dl = frame.len;
ioctl(s, SIOCGSTAMP, &start_tv);
/* determine CAN frame mode for this PDU */
if (nbytes == CAN_MTU)
canfd_on = 0;
else
canfd_on = 1;
break;
case 0x20:
/* CF */
if (rcvlen) {
sn = n_pci & 0x0F;
if (sn == ((last_sn + 1) & 0xF)) {
last_sn = sn;
datidx = ext+1;
rcvlen += frame.len - datidx;
}
}
break;
default:
break;
}
/* PDU reception in process */
if (rcvlen) {
if (rcvlen > fflen)
rcvlen = fflen;
percent = (rcvlen * 100 / fflen);
printf("\r %3lu%% ", percent);
printf("|");
if (percent > 100)
percent = 100;
for (i=0; i < NUMBAR; i++){
if (i < (int)(percent/PERCENTRES))
printf("X");
else
printf(".");
}
printf("| %*lu/%lu ", fflen_digits, rcvlen, fflen);
}
/* PDU complete */
if (rcvlen && rcvlen >= fflen) {
printf("\r%s %02d%c (BS:%2hhu # ", canfd_on?"CAN-FD":"CAN2.0", ll_dl, brs?'*':' ', bs);
if (stmin < 0x80)
printf("STmin:%3hhu msec)", stmin);
else if (stmin > 0xF0 && stmin < 0xFA)
printf("STmin:%3u usec)", (stmin & 0xF) * 100);
else
printf("STmin: invalid )");
printf(" : %lu byte in ", fflen);
/* calculate time */
ioctl(s, SIOCGSTAMP, &end_tv);
diff_tv.tv_sec = end_tv.tv_sec - start_tv.tv_sec;
diff_tv.tv_usec = end_tv.tv_usec - start_tv.tv_usec;
if (diff_tv.tv_usec < 0)
diff_tv.tv_sec--, diff_tv.tv_usec += 1000000;
if (diff_tv.tv_sec < 0)
diff_tv.tv_sec = diff_tv.tv_usec = 0;
/* check devisor to be not zero */
if (diff_tv.tv_sec * 1000 + diff_tv.tv_usec / 1000){
printf("%llu.%06llus ", (unsigned long long)diff_tv.tv_sec, (unsigned long long)diff_tv.tv_usec);
printf("=> %lu byte/s", (fflen * 1000) /
(unsigned long)(diff_tv.tv_sec * 1000 + diff_tv.tv_usec / 1000));
} else
printf("(no time available) ");
printf("\n");
/* wait for next PDU */
fflen = rcvlen = 0;
}
fflush(stdout);
} }
close(s); close(s);

View File

@ -82,183 +82,183 @@ void print_usage(char *prg)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int s; int s;
struct sockaddr_can addr; struct sockaddr_can addr;
static struct can_isotp_options opts; static struct can_isotp_options opts;
static struct can_isotp_fc_options fcopts; static struct can_isotp_fc_options fcopts;
static struct can_isotp_ll_options llopts; static struct can_isotp_ll_options llopts;
int opt, i; int opt, i;
extern int optind, opterr, optopt; extern int optind, opterr, optopt;
__u32 force_rx_stmin = 0; __u32 force_rx_stmin = 0;
int loop = 0; int loop = 0;
unsigned char msg[BUFSIZE]; unsigned char msg[BUFSIZE];
int nbytes; int nbytes;
addr.can_addr.tp.tx_id = addr.can_addr.tp.rx_id = NO_CAN_ID; addr.can_addr.tp.tx_id = addr.can_addr.tp.rx_id = NO_CAN_ID;
while ((opt = getopt(argc, argv, "s:d:x:p:P:b:m:w:f:lFL:?")) != -1) { while ((opt = getopt(argc, argv, "s:d:x:p:P:b:m:w:f:lFL:?")) != -1) {
switch (opt) { switch (opt) {
case 's': case 's':
addr.can_addr.tp.tx_id = strtoul(optarg, NULL, 16); addr.can_addr.tp.tx_id = strtoul(optarg, NULL, 16);
if (strlen(optarg) > 7) if (strlen(optarg) > 7)
addr.can_addr.tp.tx_id |= CAN_EFF_FLAG; addr.can_addr.tp.tx_id |= CAN_EFF_FLAG;
break; break;
case 'd': case 'd':
addr.can_addr.tp.rx_id = strtoul(optarg, NULL, 16); addr.can_addr.tp.rx_id = strtoul(optarg, NULL, 16);
if (strlen(optarg) > 7) if (strlen(optarg) > 7)
addr.can_addr.tp.rx_id |= CAN_EFF_FLAG; addr.can_addr.tp.rx_id |= CAN_EFF_FLAG;
break; break;
case 'x': case 'x':
{ {
int elements = sscanf(optarg, "%hhx:%hhx", int elements = sscanf(optarg, "%hhx:%hhx",
&opts.ext_address, &opts.ext_address,
&opts.rx_ext_address); &opts.rx_ext_address);
if (elements == 1) if (elements == 1)
opts.flags |= CAN_ISOTP_EXTEND_ADDR; opts.flags |= CAN_ISOTP_EXTEND_ADDR;
else if (elements == 2) else if (elements == 2)
opts.flags |= (CAN_ISOTP_EXTEND_ADDR | CAN_ISOTP_RX_EXT_ADDR); opts.flags |= (CAN_ISOTP_EXTEND_ADDR | CAN_ISOTP_RX_EXT_ADDR);
else { else {
printf("incorrect extended addr values '%s'.\n", optarg); printf("incorrect extended addr values '%s'.\n", optarg);
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
} }
break; break;
} }
case 'p': case 'p':
{ {
int elements = sscanf(optarg, "%hhx:%hhx", int elements = sscanf(optarg, "%hhx:%hhx",
&opts.txpad_content, &opts.txpad_content,
&opts.rxpad_content); &opts.rxpad_content);
if (elements == 1) if (elements == 1)
opts.flags |= CAN_ISOTP_TX_PADDING; opts.flags |= CAN_ISOTP_TX_PADDING;
else if (elements == 2) else if (elements == 2)
opts.flags |= (CAN_ISOTP_TX_PADDING | CAN_ISOTP_RX_PADDING); opts.flags |= (CAN_ISOTP_TX_PADDING | CAN_ISOTP_RX_PADDING);
else if (sscanf(optarg, ":%hhx", &opts.rxpad_content) == 1) else if (sscanf(optarg, ":%hhx", &opts.rxpad_content) == 1)
opts.flags |= CAN_ISOTP_RX_PADDING; opts.flags |= CAN_ISOTP_RX_PADDING;
else { else {
printf("incorrect padding values '%s'.\n", optarg); printf("incorrect padding values '%s'.\n", optarg);
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
} }
break; break;
} }
case 'P': case 'P':
if (optarg[0] == 'l') if (optarg[0] == 'l')
opts.flags |= CAN_ISOTP_CHK_PAD_LEN; opts.flags |= CAN_ISOTP_CHK_PAD_LEN;
else if (optarg[0] == 'c') else if (optarg[0] == 'c')
opts.flags |= CAN_ISOTP_CHK_PAD_DATA; opts.flags |= CAN_ISOTP_CHK_PAD_DATA;
else if (optarg[0] == 'a') else if (optarg[0] == 'a')
opts.flags |= (CAN_ISOTP_CHK_PAD_LEN | CAN_ISOTP_CHK_PAD_DATA); opts.flags |= (CAN_ISOTP_CHK_PAD_LEN | CAN_ISOTP_CHK_PAD_DATA);
else { else {
printf("unknown padding check option '%c'.\n", optarg[0]); printf("unknown padding check option '%c'.\n", optarg[0]);
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
} }
break; break;
case 'b': case 'b':
fcopts.bs = strtoul(optarg, NULL, 16) & 0xFF; fcopts.bs = strtoul(optarg, NULL, 16) & 0xFF;
break; break;
case 'm': case 'm':
fcopts.stmin = strtoul(optarg, NULL, 16) & 0xFF; fcopts.stmin = strtoul(optarg, NULL, 16) & 0xFF;
break; break;
case 'w': case 'w':
fcopts.wftmax = strtoul(optarg, NULL, 16) & 0xFF; fcopts.wftmax = strtoul(optarg, NULL, 16) & 0xFF;
break; break;
case 'f': case 'f':
opts.flags |= CAN_ISOTP_FORCE_RXSTMIN; opts.flags |= CAN_ISOTP_FORCE_RXSTMIN;
force_rx_stmin = strtoul(optarg, NULL, 10); force_rx_stmin = strtoul(optarg, NULL, 10);
break; break;
case 'l': case 'l':
loop = 1; loop = 1;
break; break;
case 'F': case 'F':
opts.flags |= CAN_ISOTP_DYN_FC_PARMS; opts.flags |= CAN_ISOTP_DYN_FC_PARMS;
break; break;
case 'L': case 'L':
if (sscanf(optarg, "%hhu:%hhu:%hhu", if (sscanf(optarg, "%hhu:%hhu:%hhu",
&llopts.mtu, &llopts.mtu,
&llopts.tx_dl, &llopts.tx_dl,
&llopts.tx_flags) != 3) { &llopts.tx_flags) != 3) {
printf("unknown link layer options '%s'.\n", optarg); printf("unknown link layer options '%s'.\n", optarg);
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
} }
break; break;
case '?': case '?':
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
break; break;
default: default:
fprintf(stderr, "Unknown option %c\n", opt); fprintf(stderr, "Unknown option %c\n", opt);
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(1); exit(1);
break; break;
} }
}
if ((argc - optind != 1) ||
(addr.can_addr.tp.tx_id == NO_CAN_ID) ||
(addr.can_addr.tp.rx_id == NO_CAN_ID)) {
print_usage(basename(argv[0]));
exit(1);
}
if ((s = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) {
perror("socket");
exit(1);
}
setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_RECV_FC, &fcopts, sizeof(fcopts));
if (llopts.tx_dl) {
if (setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_LL_OPTS, &llopts, sizeof(llopts)) < 0) {
perror("link layer sockopt");
exit(1);
} }
}
if (opts.flags & CAN_ISOTP_FORCE_RXSTMIN) if ((argc - optind != 1) ||
setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_RX_STMIN, &force_rx_stmin, sizeof(force_rx_stmin)); (addr.can_addr.tp.tx_id == NO_CAN_ID) ||
(addr.can_addr.tp.rx_id == NO_CAN_ID)) {
print_usage(basename(argv[0]));
exit(1);
}
if ((s = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) {
perror("socket");
exit(1);
}
addr.can_family = AF_CAN; setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts));
addr.can_ifindex = if_nametoindex(argv[optind]); setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_RECV_FC, &fcopts, sizeof(fcopts));
if (!addr.can_ifindex) {
perror("if_nametoindex"); if (llopts.tx_dl) {
exit(1); if (setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_LL_OPTS, &llopts, sizeof(llopts)) < 0) {
} perror("link layer sockopt");
exit(1);
}
}
if (opts.flags & CAN_ISOTP_FORCE_RXSTMIN)
setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_RX_STMIN, &force_rx_stmin, sizeof(force_rx_stmin));
addr.can_family = AF_CAN;
addr.can_ifindex = if_nametoindex(argv[optind]);
if (!addr.can_ifindex) {
perror("if_nametoindex");
exit(1);
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
close(s);
exit(1);
}
do {
nbytes = read(s, msg, BUFSIZE);
if (nbytes > 0 && nbytes < BUFSIZE)
for (i=0; i < nbytes; i++)
printf("%02X ", msg[i]);
printf("\n");
} while (loop);
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
close(s); close(s);
exit(1);
}
do { return 0;
nbytes = read(s, msg, BUFSIZE);
if (nbytes > 0 && nbytes < BUFSIZE)
for (i=0; i < nbytes; i++)
printf("%02X ", msg[i]);
printf("\n");
} while (loop);
close(s);
return 0;
} }

View File

@ -86,238 +86,238 @@ void print_usage(char *prg)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int s; int s;
struct sockaddr_can addr; struct sockaddr_can addr;
static struct can_isotp_options opts; static struct can_isotp_options opts;
static struct can_isotp_ll_options llopts; static struct can_isotp_ll_options llopts;
int opt; int opt;
extern int optind, opterr, optopt; extern int optind, opterr, optopt;
unsigned int loops = 1; /* one (== no) loop by default */ unsigned int loops = 1; /* one (== no) loop by default */
useconds_t usecs = 0; /* wait before sending the PDU */ useconds_t usecs = 0; /* wait before sending the PDU */
__u32 force_tx_stmin = 0; __u32 force_tx_stmin = 0;
unsigned char buf[BUFSIZE]; unsigned char buf[BUFSIZE];
int buflen = 0; int buflen = 0;
int datalen = 0; int datalen = 0;
int retval = 0; int retval = 0;
addr.can_addr.tp.tx_id = addr.can_addr.tp.rx_id = NO_CAN_ID; addr.can_addr.tp.tx_id = addr.can_addr.tp.rx_id = NO_CAN_ID;
while ((opt = getopt(argc, argv, "s:d:x:p:P:t:f:D:l:g:bSCL:?")) != -1) { while ((opt = getopt(argc, argv, "s:d:x:p:P:t:f:D:l:g:bSCL:?")) != -1) {
switch (opt) { switch (opt) {
case 's': case 's':
addr.can_addr.tp.tx_id = strtoul(optarg, NULL, 16); addr.can_addr.tp.tx_id = strtoul(optarg, NULL, 16);
if (strlen(optarg) > 7) if (strlen(optarg) > 7)
addr.can_addr.tp.tx_id |= CAN_EFF_FLAG; addr.can_addr.tp.tx_id |= CAN_EFF_FLAG;
break; break;
case 'd': case 'd':
addr.can_addr.tp.rx_id = strtoul(optarg, NULL, 16); addr.can_addr.tp.rx_id = strtoul(optarg, NULL, 16);
if (strlen(optarg) > 7) if (strlen(optarg) > 7)
addr.can_addr.tp.rx_id |= CAN_EFF_FLAG; addr.can_addr.tp.rx_id |= CAN_EFF_FLAG;
break; break;
case 'x': case 'x':
{ {
int elements = sscanf(optarg, "%hhx:%hhx", int elements = sscanf(optarg, "%hhx:%hhx",
&opts.ext_address, &opts.ext_address,
&opts.rx_ext_address); &opts.rx_ext_address);
if (elements == 1) if (elements == 1)
opts.flags |= CAN_ISOTP_EXTEND_ADDR; opts.flags |= CAN_ISOTP_EXTEND_ADDR;
else if (elements == 2) else if (elements == 2)
opts.flags |= (CAN_ISOTP_EXTEND_ADDR | CAN_ISOTP_RX_EXT_ADDR); opts.flags |= (CAN_ISOTP_EXTEND_ADDR | CAN_ISOTP_RX_EXT_ADDR);
else { else {
printf("incorrect extended addr values '%s'.\n", optarg); printf("incorrect extended addr values '%s'.\n", optarg);
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
} }
break; break;
} }
case 'p': case 'p':
{ {
int elements = sscanf(optarg, "%hhx:%hhx", int elements = sscanf(optarg, "%hhx:%hhx",
&opts.txpad_content, &opts.txpad_content,
&opts.rxpad_content); &opts.rxpad_content);
if (elements == 1) if (elements == 1)
opts.flags |= CAN_ISOTP_TX_PADDING; opts.flags |= CAN_ISOTP_TX_PADDING;
else if (elements == 2) else if (elements == 2)
opts.flags |= (CAN_ISOTP_TX_PADDING | CAN_ISOTP_RX_PADDING); opts.flags |= (CAN_ISOTP_TX_PADDING | CAN_ISOTP_RX_PADDING);
else if (sscanf(optarg, ":%hhx", &opts.rxpad_content) == 1) else if (sscanf(optarg, ":%hhx", &opts.rxpad_content) == 1)
opts.flags |= CAN_ISOTP_RX_PADDING; opts.flags |= CAN_ISOTP_RX_PADDING;
else { else {
printf("incorrect padding values '%s'.\n", optarg); printf("incorrect padding values '%s'.\n", optarg);
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
} }
break; break;
} }
case 'P': case 'P':
if (optarg[0] == 'l') if (optarg[0] == 'l')
opts.flags |= CAN_ISOTP_CHK_PAD_LEN; opts.flags |= CAN_ISOTP_CHK_PAD_LEN;
else if (optarg[0] == 'c') else if (optarg[0] == 'c')
opts.flags |= CAN_ISOTP_CHK_PAD_DATA; opts.flags |= CAN_ISOTP_CHK_PAD_DATA;
else if (optarg[0] == 'a') else if (optarg[0] == 'a')
opts.flags |= (CAN_ISOTP_CHK_PAD_LEN | CAN_ISOTP_CHK_PAD_DATA); opts.flags |= (CAN_ISOTP_CHK_PAD_LEN | CAN_ISOTP_CHK_PAD_DATA);
else { else {
printf("unknown padding check option '%c'.\n", optarg[0]); printf("unknown padding check option '%c'.\n", optarg[0]);
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
} }
break; break;
case 't': case 't':
if (!strncmp(optarg, ZERO_STRING, strlen(ZERO_STRING))) if (!strncmp(optarg, ZERO_STRING, strlen(ZERO_STRING)))
opts.frame_txtime = CAN_ISOTP_FRAME_TXTIME_ZERO; opts.frame_txtime = CAN_ISOTP_FRAME_TXTIME_ZERO;
else else
opts.frame_txtime = strtoul(optarg, NULL, 10); opts.frame_txtime = strtoul(optarg, NULL, 10);
break; break;
case 'f': case 'f':
opts.flags |= CAN_ISOTP_FORCE_TXSTMIN; opts.flags |= CAN_ISOTP_FORCE_TXSTMIN;
force_tx_stmin = strtoul(optarg, NULL, 10); force_tx_stmin = strtoul(optarg, NULL, 10);
break; break;
case 'D': case 'D':
datalen = strtoul(optarg, NULL, 10); datalen = strtoul(optarg, NULL, 10);
if (!datalen || datalen >= BUFSIZE) { if (!datalen || datalen >= BUFSIZE) {
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
} }
break; break;
case 'l': case 'l':
if (optarg[0] == 'i') { if (optarg[0] == 'i') {
loops = 0; /* infinite loop */ loops = 0; /* infinite loop */
} else { } else {
loops = strtoul(optarg, NULL, 10); loops = strtoul(optarg, NULL, 10);
if (!loops) { if (!loops) {
fprintf(stderr, "Invalid argument for option -l!\n"); fprintf(stderr, "Invalid argument for option -l!\n");
return 1; return 1;
} }
} }
break; break;
case 'g': case 'g':
usecs = strtoul(optarg, NULL, 10); usecs = strtoul(optarg, NULL, 10);
break; break;
case 'b': case 'b':
opts.flags |= CAN_ISOTP_WAIT_TX_DONE; opts.flags |= CAN_ISOTP_WAIT_TX_DONE;
break; break;
case 'S': case 'S':
opts.flags |= CAN_ISOTP_SF_BROADCAST; opts.flags |= CAN_ISOTP_SF_BROADCAST;
break; break;
case 'C': case 'C':
opts.flags |= CAN_ISOTP_CF_BROADCAST; opts.flags |= CAN_ISOTP_CF_BROADCAST;
break; break;
case 'L': case 'L':
if (sscanf(optarg, "%hhu:%hhu:%hhu", if (sscanf(optarg, "%hhu:%hhu:%hhu",
&llopts.mtu, &llopts.mtu,
&llopts.tx_dl, &llopts.tx_dl,
&llopts.tx_flags) != 3) { &llopts.tx_flags) != 3) {
printf("unknown link layer options '%s'.\n", optarg); printf("unknown link layer options '%s'.\n", optarg);
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
} }
break; break;
case '?': case '?':
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); exit(0);
break; break;
default: default:
fprintf(stderr, "Unknown option %c\n", opt); fprintf(stderr, "Unknown option %c\n", opt);
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(1); exit(1);
break; break;
} }
} }
#define BC_FLAGS (CAN_ISOTP_SF_BROADCAST | CAN_ISOTP_CF_BROADCAST) #define BC_FLAGS (CAN_ISOTP_SF_BROADCAST | CAN_ISOTP_CF_BROADCAST)
if ((argc - optind != 1) || if ((argc - optind != 1) ||
(addr.can_addr.tp.tx_id == NO_CAN_ID) || (addr.can_addr.tp.tx_id == NO_CAN_ID) ||
((opts.flags & BC_FLAGS) == BC_FLAGS) || ((opts.flags & BC_FLAGS) == BC_FLAGS) ||
((addr.can_addr.tp.rx_id == NO_CAN_ID) && ((addr.can_addr.tp.rx_id == NO_CAN_ID) &&
(!(opts.flags & BC_FLAGS)))) { (!(opts.flags & BC_FLAGS)))) {
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(1); exit(1);
}
if ((s = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) {
perror("socket");
exit(1);
}
if (setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts)) < 0) {
perror("sockopt");
exit(1);
}
if (llopts.tx_dl) {
if (setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_LL_OPTS, &llopts, sizeof(llopts)) < 0) {
perror("link layer sockopt");
exit(1);
} }
}
if (opts.flags & CAN_ISOTP_FORCE_TXSTMIN) if ((s = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) {
setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_TX_STMIN, &force_tx_stmin, sizeof(force_tx_stmin)); perror("socket");
exit(1);
}
addr.can_family = AF_CAN; if (setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts)) < 0) {
addr.can_ifindex = if_nametoindex(argv[optind]); perror("sockopt");
if (!addr.can_ifindex) { exit(1);
perror("if_nametoindex"); }
exit(1);
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
close(s);
exit(1);
}
if (!datalen) { if (llopts.tx_dl) {
while (buflen < BUFSIZE && scanf("%hhx", &buf[buflen]) == 1) if (setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_LL_OPTS, &llopts, sizeof(llopts)) < 0) {
buflen++; perror("link layer sockopt");
} else { exit(1);
for (buflen = 0; buflen < datalen; buflen++) }
buf[buflen] = ((buflen % 0xFF) + 1) & 0xFF; }
}
if (opts.flags & CAN_ISOTP_FORCE_TXSTMIN)
setsockopt(s, SOL_CAN_ISOTP, CAN_ISOTP_TX_STMIN, &force_tx_stmin, sizeof(force_tx_stmin));
addr.can_family = AF_CAN;
addr.can_ifindex = if_nametoindex(argv[optind]);
if (!addr.can_ifindex) {
perror("if_nametoindex");
exit(1);
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
close(s);
exit(1);
}
if (!datalen) {
while (buflen < BUFSIZE && scanf("%hhx", &buf[buflen]) == 1)
buflen++;
} else {
for (buflen = 0; buflen < datalen; buflen++)
buf[buflen] = ((buflen % 0xFF) + 1) & 0xFF;
}
loop: loop:
if (usecs) if (usecs)
usleep(usecs); usleep(usecs);
retval = write(s, buf, buflen); retval = write(s, buf, buflen);
if (retval < 0) { if (retval < 0) {
perror("write"); perror("write");
return retval; return retval;
} }
if (retval != buflen) if (retval != buflen)
fprintf(stderr, "wrote only %d from %d byte\n", retval, buflen); fprintf(stderr, "wrote only %d from %d byte\n", retval, buflen);
if (loops) { if (loops) {
if (--loops) if (--loops)
goto loop; goto loop;
} else { } else {
goto loop; goto loop;
} }
/* /*
* due to a Kernel internal wait queue the PDU is sent completely * due to a Kernel internal wait queue the PDU is sent completely
* before close() returns. * before close() returns.
*/ */
close(s); close(s);
return 0; return 0;
} }

View File

@ -112,10 +112,10 @@ static struct {
int sig_alrm; int sig_alrm;
int sig_usr1; int sig_usr1;
int state; int state;
#define STATE_INITIAL 0 #define STATE_INITIAL 0
#define STATE_REQ_SENT 1 #define STATE_REQ_SENT 1
#define STATE_REQ_PENDING 2 /* wait 1250 msec for first claim */ #define STATE_REQ_PENDING 2 /* wait 1250 msec for first claim */
#define STATE_OPERATIONAL 3 #define STATE_OPERATIONAL 3
} s = { } s = {
.intf = default_intf, .intf = default_intf,
.ranges = default_range, .ranges = default_range,
@ -126,8 +126,8 @@ static struct {
struct { struct {
uint64_t name; uint64_t name;
int flags; int flags;
#define F_USE 0x01 #define F_USE 0x01
#define F_SEEN 0x02 #define F_SEEN 0x02
} addr[J1939_IDLE_ADDR /* =254 */]; } addr[J1939_IDLE_ADDR /* =254 */];
/* lookup by name */ /* lookup by name */
@ -209,7 +209,7 @@ static int open_socket(const char *device, uint64_t name)
if (s.verbose) if (s.verbose)
fprintf(stderr, "- setsockopt(, SOL_CAN_J1939, SO_J1939_FILTER, <filter>, %zd);\n", sizeof(filt)); fprintf(stderr, "- setsockopt(, SOL_CAN_J1939, SO_J1939_FILTER, <filter>, %zd);\n", sizeof(filt));
ret = setsockopt(sock, SOL_CAN_J1939, SO_J1939_FILTER, ret = setsockopt(sock, SOL_CAN_J1939, SO_J1939_FILTER,
&filt, sizeof(filt)); &filt, sizeof(filt));
if (ret < 0) if (ret < 0)
err(1, "setsockopt filter"); err(1, "setsockopt filter");
@ -217,7 +217,7 @@ static int open_socket(const char *device, uint64_t name)
if (s.verbose) if (s.verbose)
fprintf(stderr, "- setsockopt(, SOL_SOCKET, SO_BROADCAST, %d, %zd);\n", value, sizeof(value)); fprintf(stderr, "- setsockopt(, SOL_SOCKET, SO_BROADCAST, %d, %zd);\n", value, sizeof(value));
ret = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, ret = setsockopt(sock, SOL_SOCKET, SO_BROADCAST,
&value, sizeof(value)); &value, sizeof(value));
if (ret < 0) if (ret < 0)
err(1, "setsockopt set broadcast"); err(1, "setsockopt set broadcast");

View File

@ -31,11 +31,11 @@
* strict type-checking.. See the * strict type-checking.. See the
* "unnecessary" pointer comparison. * "unnecessary" pointer comparison.
*/ */
#define min(x, y) ({ \ #define min(x, y) ({ \
typeof(x) _min1 = (x); \ typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \ typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \ (void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; }) _min1 < _min2 ? _min1 : _min2; })
struct j1939cat_stats { struct j1939cat_stats {
@ -98,7 +98,7 @@ static const char help_msg[] =
static const char optstring[] = "?hi:vs:rp:P:R:B"; static const char optstring[] = "?hi:vs:rp:P:R:B";
static ssize_t j1939cat_send_one(struct j1939cat_priv *priv, int out_fd, static ssize_t j1939cat_send_one(struct j1939cat_priv *priv, int out_fd,
const void *buf, size_t buf_size) const void *buf, size_t buf_size)
{ {
ssize_t num_sent; ssize_t num_sent;
int flags = 0; int flags = 0;
@ -132,7 +132,7 @@ static ssize_t j1939cat_send_one(struct j1939cat_priv *priv, int out_fd,
} }
static void j1939cat_print_timestamp(struct j1939cat_priv *priv, const char *name, static void j1939cat_print_timestamp(struct j1939cat_priv *priv, const char *name,
struct timespec *cur) struct timespec *cur)
{ {
struct j1939cat_stats *stats = &priv->stats; struct j1939cat_stats *stats = &priv->stats;
@ -140,8 +140,8 @@ static void j1939cat_print_timestamp(struct j1939cat_priv *priv, const char *nam
return; return;
fprintf(stderr, " %s: %llu s %llu us (seq=%03u, send=%07u)", fprintf(stderr, " %s: %llu s %llu us (seq=%03u, send=%07u)",
name, (unsigned long long)cur->tv_sec, (unsigned long long)cur->tv_nsec / 1000, name, (unsigned long long)cur->tv_sec, (unsigned long long)cur->tv_nsec / 1000,
stats->tskey, stats->send); stats->tskey, stats->send);
fprintf(stderr, "\n"); fprintf(stderr, "\n");
} }
@ -226,7 +226,7 @@ static int j1939cat_extract_serr(struct j1939cat_priv *priv)
stats->tskey = serr->ee_data; stats->tskey = serr->ee_data;
j1939cat_print_timestamp(priv, j1939cat_tstype_to_str(serr->ee_info), j1939cat_print_timestamp(priv, j1939cat_tstype_to_str(serr->ee_info),
&tss->ts[0]); &tss->ts[0]);
if (serr->ee_info == SCM_TSTAMP_SCHED) if (serr->ee_info == SCM_TSTAMP_SCHED)
return -EINTR; return -EINTR;
@ -338,7 +338,7 @@ static int j1939cat_recv_err(struct j1939cat_priv *priv)
} }
static int j1939cat_send_loop(struct j1939cat_priv *priv, int out_fd, char *buf, static int j1939cat_send_loop(struct j1939cat_priv *priv, int out_fd, char *buf,
size_t buf_size) size_t buf_size)
{ {
struct j1939cat_stats *stats = &priv->stats; struct j1939cat_stats *stats = &priv->stats;
ssize_t count; ssize_t count;
@ -411,7 +411,7 @@ static int j1939cat_send_loop(struct j1939cat_priv *priv, int out_fd, char *buf,
} }
static int j1939cat_sendfile(struct j1939cat_priv *priv, int out_fd, int in_fd, static int j1939cat_sendfile(struct j1939cat_priv *priv, int out_fd, int in_fd,
off_t *offset, size_t count) off_t *offset, size_t count)
{ {
int ret = EXIT_SUCCESS; int ret = EXIT_SUCCESS;
off_t orig = 0; off_t orig = 0;
@ -617,7 +617,7 @@ static int j1939cat_sock_prepare(struct j1939cat_priv *priv)
if (priv->todo_prio >= 0) { if (priv->todo_prio >= 0) {
ret = setsockopt(priv->sock, SOL_CAN_J1939, SO_J1939_SEND_PRIO, ret = setsockopt(priv->sock, SOL_CAN_J1939, SO_J1939_SEND_PRIO,
&priv->todo_prio, sizeof(priv->todo_prio)); &priv->todo_prio, sizeof(priv->todo_prio));
if (ret < 0) { if (ret < 0) {
warn("set priority %i", priv->todo_prio); warn("set priority %i", priv->todo_prio);
return EXIT_FAILURE; return EXIT_FAILURE;
@ -633,11 +633,11 @@ static int j1939cat_sock_prepare(struct j1939cat_priv *priv)
} }
sock_opt = SOF_TIMESTAMPING_SOFTWARE | sock_opt = SOF_TIMESTAMPING_SOFTWARE |
SOF_TIMESTAMPING_OPT_CMSG | SOF_TIMESTAMPING_OPT_CMSG |
SOF_TIMESTAMPING_TX_ACK | SOF_TIMESTAMPING_TX_ACK |
SOF_TIMESTAMPING_TX_SCHED | SOF_TIMESTAMPING_TX_SCHED |
SOF_TIMESTAMPING_OPT_STATS | SOF_TIMESTAMPING_OPT_TSONLY | SOF_TIMESTAMPING_OPT_STATS | SOF_TIMESTAMPING_OPT_TSONLY |
SOF_TIMESTAMPING_OPT_ID | SOF_TIMESTAMPING_RX_SOFTWARE; SOF_TIMESTAMPING_OPT_ID | SOF_TIMESTAMPING_RX_SOFTWARE;
if (setsockopt(priv->sock, SOL_SOCKET, SO_TIMESTAMPING, if (setsockopt(priv->sock, SOL_SOCKET, SO_TIMESTAMPING,
(char *) &sock_opt, sizeof(sock_opt))) (char *) &sock_opt, sizeof(sock_opt)))

View File

@ -76,7 +76,7 @@ static struct {
static const int ival_1 = 1; static const int ival_1 = 1;
static char ctrlmsg[ static char ctrlmsg[
CMSG_SPACE(sizeof(struct timeval)) CMSG_SPACE(sizeof(struct timeval))
+ CMSG_SPACE(sizeof(uint8_t)) /* dest addr */ + CMSG_SPACE(sizeof(uint8_t)) /* dest addr */
+ CMSG_SPACE(sizeof(uint64_t)) /* dest name */ + CMSG_SPACE(sizeof(uint64_t)) /* dest name */
+ CMSG_SPACE(sizeof(uint8_t)) /* priority */ + CMSG_SPACE(sizeof(uint8_t)) /* priority */
@ -264,9 +264,9 @@ abs_time:
struct tm tm; struct tm tm;
tm = *localtime(&tdut.tv_sec); tm = *localtime(&tdut.tv_sec);
printf("(%04u%02u%02uT%02u%02u%02u.%04llu)", printf("(%04u%02u%02uT%02u%02u%02u.%04llu)",
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_hour, tm.tm_min, tm.tm_sec,
(unsigned long long)tdut.tv_usec/100); (unsigned long long)tdut.tv_usec/100);
} }
} }
printf(" %s ", libj1939_addr2str(&src)); printf(" %s ", libj1939_addr2str(&src));

View File

@ -68,9 +68,9 @@ static struct {
int pkt_len; int pkt_len;
int priority; int priority;
int defined; int defined;
#define DEF_SRC 1 #define DEF_SRC 1
#define DEF_DST 2 #define DEF_DST 2
#define DEF_PRIO 4 #define DEF_PRIO 4
struct sockaddr_can src, dst; struct sockaddr_can src, dst;
} s = { } s = {
.priority = 6, .priority = 6,

39
lib.c
View File

@ -83,8 +83,8 @@ static inline void _put_id(char *buf, int end_offset, canid_t id)
/* CAN DLC to real data length conversion helpers */ /* CAN DLC to real data length conversion helpers */
static const unsigned char dlc2len[] = {0, 1, 2, 3, 4, 5, 6, 7, static const unsigned char dlc2len[] = {
8, 12, 16, 20, 24, 32, 48, 64}; 0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64};
/* get data length from raw data length code (DLC) */ /* get data length from raw data length code (DLC) */
unsigned char can_fd_dlc2len(unsigned char dlc) unsigned char can_fd_dlc2len(unsigned char dlc)
@ -92,16 +92,17 @@ unsigned char can_fd_dlc2len(unsigned char dlc)
return dlc2len[dlc & 0x0F]; return dlc2len[dlc & 0x0F];
} }
static const unsigned char len2dlc[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, /* 0 - 8 */ static const unsigned char len2dlc[] = {
9, 9, 9, 9, /* 9 - 12 */ 0, 1, 2, 3, 4, 5, 6, 7, 8, /* 0 - 8 */
10, 10, 10, 10, /* 13 - 16 */ 9, 9, 9, 9, /* 9 - 12 */
11, 11, 11, 11, /* 17 - 20 */ 10, 10, 10, 10, /* 13 - 16 */
12, 12, 12, 12, /* 21 - 24 */ 11, 11, 11, 11, /* 17 - 20 */
13, 13, 13, 13, 13, 13, 13, 13, /* 25 - 32 */ 12, 12, 12, 12, /* 21 - 24 */
14, 14, 14, 14, 14, 14, 14, 14, /* 33 - 40 */ 13, 13, 13, 13, 13, 13, 13, 13, /* 25 - 32 */
14, 14, 14, 14, 14, 14, 14, 14, /* 41 - 48 */ 14, 14, 14, 14, 14, 14, 14, 14, /* 33 - 40 */
15, 15, 15, 15, 15, 15, 15, 15, /* 49 - 56 */ 14, 14, 14, 14, 14, 14, 14, 14, /* 41 - 48 */
15, 15, 15, 15, 15, 15, 15, 15}; /* 57 - 64 */ 15, 15, 15, 15, 15, 15, 15, 15, /* 49 - 56 */
15, 15, 15, 15, 15, 15, 15, 15}; /* 57 - 64 */
/* map the sanitized data length to an appropriate data length code */ /* map the sanitized data length to an appropriate data length code */
unsigned char can_fd_len2dlc(unsigned char len) unsigned char can_fd_len2dlc(unsigned char len)
@ -777,8 +778,8 @@ static int snprintf_error_ctrl(char *buf, size_t len, const struct canfd_frame *
n += snprintf(buf + n, len - n, "{"); n += snprintf(buf + n, len - n, "{");
n += snprintf_error_data(buf + n, len - n, cf->data[1], n += snprintf_error_data(buf + n, len - n, cf->data[1],
controller_problems, controller_problems,
ARRAY_SIZE(controller_problems)); ARRAY_SIZE(controller_problems));
n += snprintf(buf + n, len - n, "}"); n += snprintf(buf + n, len - n, "}");
return n; return n;
@ -793,8 +794,8 @@ static int snprintf_error_prot(char *buf, size_t len, const struct canfd_frame *
n += snprintf(buf + n, len - n, "{{"); n += snprintf(buf + n, len - n, "{{");
n += snprintf_error_data(buf + n, len - n, cf->data[2], n += snprintf_error_data(buf + n, len - n, cf->data[2],
protocol_violation_types, protocol_violation_types,
ARRAY_SIZE(protocol_violation_types)); ARRAY_SIZE(protocol_violation_types));
n += snprintf(buf + n, len - n, "}{"); n += snprintf(buf + n, len - n, "}{");
if (cf->data[3] > 0 && if (cf->data[3] > 0 &&
cf->data[3] < ARRAY_SIZE(protocol_violation_locations)) cf->data[3] < ARRAY_SIZE(protocol_violation_locations))
@ -819,7 +820,7 @@ static int snprintf_error_cnt(char *buf, size_t len, const struct canfd_frame *c
} }
int snprintf_can_error_frame(char *buf, size_t len, const struct canfd_frame *cf, int snprintf_can_error_frame(char *buf, size_t len, const struct canfd_frame *cf,
const char* sep) const char* sep)
{ {
canid_t class, mask; canid_t class, mask;
int i, n = 0, classes = 0; int i, n = 0, classes = 0;
@ -858,7 +859,7 @@ int snprintf_can_error_frame(char *buf, size_t len, const struct canfd_frame *cf
n += tmp_n; n += tmp_n;
if (mask == CAN_ERR_LOSTARB) if (mask == CAN_ERR_LOSTARB)
n += snprintf_error_lostarb(buf + n, len - n, n += snprintf_error_lostarb(buf + n, len - n,
cf); cf);
if (mask == CAN_ERR_CRTL) if (mask == CAN_ERR_CRTL)
n += snprintf_error_ctrl(buf + n, len - n, cf); n += snprintf_error_ctrl(buf + n, len - n, cf);
if (mask == CAN_ERR_PROT) if (mask == CAN_ERR_PROT)
@ -878,7 +879,7 @@ int snprintf_can_error_frame(char *buf, size_t len, const struct canfd_frame *cf
} }
int64_t timespec_diff_ms(struct timespec *ts1, int64_t timespec_diff_ms(struct timespec *ts1,
struct timespec *ts2) struct timespec *ts2)
{ {
int64_t diff = (ts1->tv_sec - ts2->tv_sec) * 1000; int64_t diff = (ts1->tv_sec - ts2->tv_sec) * 1000;

View File

@ -197,7 +197,7 @@ int main(int argc, char *argv[])
if (verbose) if (verbose)
fprintf(stderr, "- setsockopt(, SOL_CAN_J1939, SO_J1939_SEND_PRIO, &%i);\n", todo_prio); fprintf(stderr, "- setsockopt(, SOL_CAN_J1939, SO_J1939_SEND_PRIO, &%i);\n", todo_prio);
ret = setsockopt(sock, SOL_CAN_J1939, SO_J1939_SEND_PRIO, ret = setsockopt(sock, SOL_CAN_J1939, SO_J1939_SEND_PRIO,
&todo_prio, sizeof(todo_prio)); &todo_prio, sizeof(todo_prio));
if (ret < 0) if (ret < 0)
err(1, "set priority %i", todo_prio); err(1, "set priority %i", todo_prio);
} }
@ -246,7 +246,7 @@ int main(int argc, char *argv[])
if (verbose) if (verbose)
fprintf(stderr, "- sendto(, <dat>, %i, 0, %s, %zi);\n", todo_send, libj1939_addr2str(&peername), sizeof(peername)); fprintf(stderr, "- sendto(, <dat>, %i, 0, %s, %zi);\n", todo_send, libj1939_addr2str(&peername), sizeof(peername));
ret = sendto(sock, dat, todo_send, 0, ret = sendto(sock, dat, todo_send, 0,
(void *)&peername, sizeof(peername)); (void *)&peername, sizeof(peername));
} else { } else {
/* /*
* we may do sendto(sock, dat, todo_send, 0, NULL, 0) * we may do sendto(sock, dat, todo_send, 0, NULL, 0)
@ -273,7 +273,7 @@ int main(int argc, char *argv[])
fprintf(stderr, "- recvfrom(, <dat>, %zi, 0, &<peername>, %zi);\n", sizeof(peername), sizeof(peername)); fprintf(stderr, "- recvfrom(, <dat>, %zi, 0, &<peername>, %zi);\n", sizeof(peername), sizeof(peername));
peernamelen = sizeof(peername); peernamelen = sizeof(peername);
ret = recvfrom(sock, dat, sizeof(dat), 0, ret = recvfrom(sock, dat, sizeof(dat), 0,
(void *)&peername, &peernamelen); (void *)&peername, &peernamelen);
if (ret < 0) { if (ret < 0) {
if (EINTR == errno) { if (EINTR == errno) {
if (verbose) if (verbose)
@ -287,7 +287,7 @@ int main(int argc, char *argv[])
if (verbose) if (verbose)
fprintf(stderr, "- sendto(, <dat>, %i, 0, %s, %i);\n", ret, libj1939_addr2str(&peername), peernamelen); fprintf(stderr, "- sendto(, <dat>, %i, 0, %s, %i);\n", ret, libj1939_addr2str(&peername), peernamelen);
ret = sendto(sock, dat, ret, 0, ret = sendto(sock, dat, ret, 0,
(void *)&peername, peernamelen); (void *)&peername, peernamelen);
if (ret < 0) if (ret < 0)
err(1, "sendto"); err(1, "sendto");
} }
@ -297,7 +297,7 @@ int main(int argc, char *argv[])
if (todo_names && peername.can_addr.j1939.name) if (todo_names && peername.can_addr.j1939.name)
printf("%016llx ", peername.can_addr.j1939.name); printf("%016llx ", peername.can_addr.j1939.name);
printf("%02x %05x:", peername.can_addr.j1939.addr, printf("%02x %05x:", peername.can_addr.j1939.addr,
peername.can_addr.j1939.pgn); peername.can_addr.j1939.pgn);
for (i = 0, j = 0; i < ret; ++i, j++) { for (i = 0, j = 0; i < ret; ++i, j++) {
if (j == 8) { if (j == 8) {
printf("\n%05x ", i); printf("\n%05x ", i);