#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#include "lib.h"
#define DEBUG 1
int main(int argc, char **argv)
{
int s; /* can
raw socket */
int
required_mtu;
struct
sockaddr_can addr;
struct
canfd_frame frame;
struct ifreq
ifr;
/* parse CAN
frame */
required_mtu =
parse_canframe("123#0011223344556677", &frame);
if(DEBUG)printf("required_mtu=%d\n",required_mtu);
/* open socket
*/
if ((s =
socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) {
perror("socket");
return 1;
}
strncpy(ifr.ifr_name, "can0", IFNAMSIZ - 1);
ifr.ifr_name[IFNAMSIZ - 1] = '\0';
ifr.ifr_ifindex
= if_nametoindex(ifr.ifr_name);
if
(!ifr.ifr_ifindex) {
perror("if_nametoindex");
return 1;
}
memset(&addr, 0, sizeof(addr));
addr.can_family
= AF_CAN;
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(DEBUG) {
printf("can_id:%02x\n",frame.can_id);
printf("len:%d\n",frame.len);
int
i;
for(i=0;i<frame.len;i++) {
printf("data[%d]:%02x\n",i,frame.data[i]);
}
}
if (write(s,
&frame, required_mtu) != required_mtu) {
perror("write");
return 1;
}
close(s);
return 0;
}
|