nla_len(tb[CGW_MOD_AND]) == CGW_MODATTR_LEN) {
nla_memcpy(&buf, tb[CGW_MOD_AND], CGW_MODATTR_LEN);
- memcpy(&gwj->ccgw.modframe.and, &buf[1],
+ memcpy(&gwj->ccgw.modframe.and, buf,
sizeof(struct can_frame));
- if (buf[0] & CGW_MOD_ID)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_ID)
gwj->ccgw.modfunc[modidx++] = mod_and_id;
- if (buf[0] & CGW_MOD_DLC)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_DLC)
gwj->ccgw.modfunc[modidx++] = mod_and_dlc;
- if (buf[0] & CGW_MOD_DATA)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_DATA)
gwj->ccgw.modfunc[modidx++] = mod_and_data;
}
nla_len(tb[CGW_MOD_OR]) == CGW_MODATTR_LEN) {
nla_memcpy(&buf, tb[CGW_MOD_OR], CGW_MODATTR_LEN);
- memcpy(&gwj->ccgw.modframe.or, &buf[1],
+ memcpy(&gwj->ccgw.modframe.or, buf,
sizeof(struct can_frame));
- if (buf[0] & CGW_MOD_ID)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_ID)
gwj->ccgw.modfunc[modidx++] = mod_or_id;
- if (buf[0] & CGW_MOD_DLC)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_DLC)
gwj->ccgw.modfunc[modidx++] = mod_or_dlc;
- if (buf[0] & CGW_MOD_DATA)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_DATA)
gwj->ccgw.modfunc[modidx++] = mod_or_data;
}
nla_len(tb[CGW_MOD_XOR]) == CGW_MODATTR_LEN) {
nla_memcpy(&buf, tb[CGW_MOD_XOR], CGW_MODATTR_LEN);
- memcpy(&gwj->ccgw.modframe.xor, &buf[1],
+ memcpy(&gwj->ccgw.modframe.xor, buf,
sizeof(struct can_frame));
- if (buf[0] & CGW_MOD_ID)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_ID)
gwj->ccgw.modfunc[modidx++] = mod_xor_id;
- if (buf[0] & CGW_MOD_DLC)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_DLC)
gwj->ccgw.modfunc[modidx++] = mod_xor_dlc;
- if (buf[0] & CGW_MOD_DATA)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_DATA)
gwj->ccgw.modfunc[modidx++] = mod_xor_data;
}
nla_len(tb[CGW_MOD_SET]) == CGW_MODATTR_LEN) {
nla_memcpy(&buf, tb[CGW_MOD_SET], CGW_MODATTR_LEN);
- memcpy(&gwj->ccgw.modframe.set, &buf[1],
+ memcpy(&gwj->ccgw.modframe.set, buf,
sizeof(struct can_frame));
- if (buf[0] & CGW_MOD_ID)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_ID)
gwj->ccgw.modfunc[modidx++] = mod_set_id;
- if (buf[0] & CGW_MOD_DLC)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_DLC)
gwj->ccgw.modfunc[modidx++] = mod_set_dlc;
- if (buf[0] & CGW_MOD_DATA)
+ if (buf[sizeof(struct can_frame)] & CGW_MOD_DATA)
gwj->ccgw.modfunc[modidx++] = mod_set_data;
}
return 0;
}
+#define USE_PACKED_STRUCT
+
int main(int argc, char **argv)
{
int s;
} req;
- static struct can_frame modframe;
struct can_filter filter;
struct sockaddr_nl nladdr;
+
+#ifdef USE_PACKED_STRUCT
+ struct modattr {
+ struct can_frame cf;
+ __u8 modtype;
+ } __attribute__((packed));
+
+ struct modattr modmsg;
+#else
+ static struct can_frame modframe;
char modbuf[CGW_MODATTR_LEN];
+#endif
s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
filter.can_mask = 0x700;
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.cf.can_id = 0x555;
+ modmsg.cf.can_dlc = 5;
+ *(unsigned long long *)modmsg.cf.data = 0x5555555555555555ULL;
+
+ modmsg.modtype = CGW_MOD_ID;
+ addattr_l(&req.n, sizeof(req), CGW_MOD_SET, &modmsg, CGW_MODATTR_LEN);
+
+ modmsg.modtype = CGW_MOD_DLC;
+ addattr_l(&req.n, sizeof(req), CGW_MOD_AND, &modmsg, CGW_MODATTR_LEN);
+
+ 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;
- modbuf[0] = CGW_MOD_ID;
- memcpy(&modbuf[1], &modframe, sizeof(struct can_frame));
+ 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[0] = CGW_MOD_DLC;
- memcpy(&modbuf[1], &modframe, sizeof(struct can_frame));
-
+ modbuf[sizeof(struct can_frame)] = CGW_MOD_DLC;
addattr_l(&req.n, sizeof(req), CGW_MOD_AND, modbuf, CGW_MODATTR_LEN);
- modbuf[0] = CGW_MOD_DATA;
- memcpy(&modbuf[1], &modframe, sizeof(struct can_frame));
-
+ 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;