return 0;
}
-#define USE_PACKED_STRUCT
-
int main(int argc, char **argv)
{
int s;
struct can_filter filter;
struct sockaddr_nl nladdr;
-#ifdef USE_PACKED_STRUCT
- struct modattr {
- struct can_frame cf;
- __u8 modtype;
- } __attribute__((packed));
+ struct cgw_frame_mod modmsg;
- struct modattr modmsg;
-#else
- static struct can_frame modframe;
- char modbuf[CGW_MODATTR_LEN];
-#endif
+ u_int32_t src = if_nametoindex("vcan2");
+ u_int32_t dst = if_nametoindex("vcan3");
s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
req.n.nlmsg_seq = 0;
req.r.can_family = AF_CAN;
- req.r.src_ifindex = if_nametoindex("vcan2");
- req.r.dst_ifindex = if_nametoindex("vcan3");
- req.r.can_txflags = CAN_GW_TXFLAGS_ECHO;
+ req.r.gwtype = CGW_TYPE_CAN_CAN;
+ req.r.flags = CGW_FLAGS_CAN_ECHO;
+
+ addattr_l(&req.n, sizeof(req), CGW_SRC_IF, &src, sizeof(src));
+ addattr_l(&req.n, sizeof(req), CGW_DST_IF, &dst, sizeof(dst));
/* add new attributes here */
addattr_l(&req.n, sizeof(req), CGW_FILTER, &filter, sizeof(filter));
-#ifdef USE_PACKED_STRUCT
-
if (sizeof(modmsg) != CGW_MODATTR_LEN) {
printf("Problem with packed msg. Use linear copy instead.\n");
return 1;
modmsg.modtype = CGW_MOD_DATA;
addattr_l(&req.n, sizeof(req), CGW_MOD_XOR, &modmsg, CGW_MODATTR_LEN);
-#else
-
- modframe.can_id = 0x555;
- modframe.can_dlc = 5;
- *(unsigned long long *)modframe.data = 0x5555555555555555ULL;
-
- memcpy(modbuf, &modframe, sizeof(struct can_frame));
-
- modbuf[sizeof(struct can_frame)] = CGW_MOD_ID;
- addattr_l(&req.n, sizeof(req), CGW_MOD_SET, modbuf, CGW_MODATTR_LEN);
-
- modbuf[sizeof(struct can_frame)] = CGW_MOD_DLC;
- addattr_l(&req.n, sizeof(req), CGW_MOD_AND, modbuf, CGW_MODATTR_LEN);
-
- modbuf[sizeof(struct can_frame)] = CGW_MOD_DATA;
- addattr_l(&req.n, sizeof(req), CGW_MOD_XOR, modbuf, CGW_MODATTR_LEN);
-
-#endif
-
memset(&nladdr, 0, sizeof(nladdr));
nladdr.nl_family = AF_NETLINK;
nladdr.nl_pid = 0;