diff --git a/src/ipc-linux.h b/src/ipc-linux.h index 141c5aa..21d2916 100644 --- a/src/ipc-linux.h +++ b/src/ipc-linux.h @@ -25,9 +25,9 @@ #define IPC_SUPPORTS_KERNEL_INTERFACE -void put_magic_header_attr(struct nlmsghdr *nlh, int attr_name, char *header_field) +void put_magic_header_attr(uint8_t version, struct nlmsghdr *nlh, int attr_name, char *header_field) { - if (contains_hyphen(header_field)) { + if (version >= 2) { mnl_attr_put_strz(nlh, attr_name, header_field); } else { uint32_t magic_header = strtoul(header_field, NULL, 10); @@ -177,7 +177,7 @@ static int kernel_set_device(struct wgdevice *dev) struct nlmsghdr *nlh; struct mnlg_socket *nlg; - nlg = mnlg_socket_open(WG_GENL_NAME, WG_GENL_VERSION); + nlg = mnlg_socket_open(WG_GENL_NAME); if (!nlg) return -errno; @@ -207,13 +207,13 @@ again: if (dev->flags & WGDEVICE_HAS_S4) mnl_attr_put_u16(nlh, WGDEVICE_A_S4, dev->transport_packet_junk_size); if (dev->flags & WGDEVICE_HAS_H1) - put_magic_header_attr(nlh, WGDEVICE_A_H1, dev->init_packet_magic_header); + put_magic_header_attr(nlg->version, nlh, WGDEVICE_A_H1, dev->init_packet_magic_header); if (dev->flags & WGDEVICE_HAS_H2) - put_magic_header_attr(nlh, WGDEVICE_A_H2, dev->response_packet_magic_header); + put_magic_header_attr(nlg->version, nlh, WGDEVICE_A_H2, dev->response_packet_magic_header); if (dev->flags & WGDEVICE_HAS_H3) - put_magic_header_attr(nlh, WGDEVICE_A_H3, dev->underload_packet_magic_header); + put_magic_header_attr(nlg->version, nlh, WGDEVICE_A_H3, dev->underload_packet_magic_header); if (dev->flags & WGDEVICE_HAS_H4) - put_magic_header_attr(nlh, WGDEVICE_A_H4, dev->transport_packet_magic_header); + put_magic_header_attr(nlg->version, nlh, WGDEVICE_A_H4, dev->transport_packet_magic_header); if (dev->flags & WGDEVICE_HAS_I1) mnl_attr_put_strz(nlh, WGDEVICE_A_I1, dev->i1); if (dev->flags & WGDEVICE_HAS_I2) @@ -685,7 +685,7 @@ try_again: if (!*device) return -errno; - nlg = mnlg_socket_open(WG_GENL_NAME, WG_GENL_VERSION); + nlg = mnlg_socket_open(WG_GENL_NAME); if (!nlg) { free_wgdevice(*device); *device = NULL; diff --git a/src/netlink.h b/src/netlink.h index f9729ee..83fa5bb 100644 --- a/src/netlink.h +++ b/src/netlink.h @@ -718,17 +718,18 @@ static int get_family_id_attr_cb(const struct nlattr *attr, void *data) static int get_family_id_cb(const struct nlmsghdr *nlh, void *data) { - uint16_t *p_id = data; + struct mnlg_socket *nlg = data; struct nlattr *tb[CTRL_ATTR_MAX + 1] = { 0 }; mnl_attr_parse(nlh, sizeof(struct genlmsghdr), get_family_id_attr_cb, tb); - if (!tb[CTRL_ATTR_FAMILY_ID]) + if (!tb[CTRL_ATTR_FAMILY_ID] || !tb[CTRL_ATTR_VERSION]) return MNL_CB_ERROR; - *p_id = mnl_attr_get_u16(tb[CTRL_ATTR_FAMILY_ID]); + nlg->id = mnl_attr_get_u16(tb[CTRL_ATTR_FAMILY_ID]); + nlg->version = mnl_attr_get_u32(tb[CTRL_ATTR_VERSION]); return MNL_CB_OK; } -static struct mnlg_socket *mnlg_socket_open(const char *family_name, uint8_t version) +static struct mnlg_socket *mnlg_socket_open(const char *family_name) { struct mnlg_socket *nlg; struct nlmsghdr *nlh; @@ -767,13 +768,12 @@ static struct mnlg_socket *mnlg_socket_open(const char *family_name, uint8_t ver } errno = 0; - if (mnlg_socket_recv_run(nlg, get_family_id_cb, &nlg->id) < 0) { + if (mnlg_socket_recv_run(nlg, get_family_id_cb, nlg) < 0) { errno = errno == ENOENT ? EPROTONOSUPPORT : errno; err = errno ? -errno : -ENOSYS; goto err_mnlg_socket_recv_run; } - nlg->version = version; errno = 0; return nlg;