diff options
-rw-r--r-- | system-linux.c | 29 | ||||
-rw-r--r-- | system.c | 11 | ||||
-rw-r--r-- | system.h | 8 |
3 files changed, 33 insertions, 15 deletions
diff --git a/system-linux.c b/system-linux.c index b7297fd..471efff 100644 --- a/system-linux.c +++ b/system-linux.c @@ -2462,7 +2462,6 @@ static int system_add_vti_tunnel(const char *name, const char *kind, struct nl_msg *nlm; struct ifinfomsg ifi = { .ifi_family = AF_UNSPEC, }; struct blob_attr *cur; - uint32_t ikey = 0, okey = 0; int ret = 0; nlm = nlmsg_alloc_simple(RTM_NEWLINK, NLM_F_REQUEST | NLM_F_REPLACE | NLM_F_CREATE); @@ -2488,14 +2487,6 @@ static int system_add_vti_tunnel(const char *name, const char *kind, if (link) nla_put_u32(nlm, IFLA_VTI_LINK, link); - if ((cur = tb[TUNNEL_ATTR_INFO]) && (blobmsg_type(cur) == BLOBMSG_TYPE_STRING)) { - if (sscanf(blobmsg_get_string(cur), "%u,%u", - &ikey, &okey) < 2) { - ret = -EINVAL; - goto failure; - } - } - if (v6) { struct in6_addr in6buf; if ((cur = tb[TUNNEL_ATTR_LOCAL])) { @@ -2535,11 +2526,23 @@ static int system_add_vti_tunnel(const char *name, const char *kind, } - if (okey) - nla_put_u32(nlm, IFLA_VTI_OKEY, htonl(okey)); + if ((cur = tb[TUNNEL_ATTR_DATA])) { + struct blob_attr *tb_data[__VTI_DATA_ATTR_MAX]; + uint32_t ikey = 0, okey = 0; - if (ikey) - nla_put_u32(nlm, IFLA_VTI_IKEY, htonl(ikey)); + blobmsg_parse(vti_data_attr_list.params, __VTI_DATA_ATTR_MAX, tb_data, + blobmsg_data(cur), blobmsg_len(cur)); + + if ((cur = tb_data[VTI_DATA_IKEY])) { + if ((ikey = blobmsg_get_u32(cur))) + nla_put_u32(nlm, IFLA_VTI_IKEY, htonl(ikey)); + } + + if ((cur = tb_data[VTI_DATA_OKEY])) { + if ((okey = blobmsg_get_u32(cur))) + nla_put_u32(nlm, IFLA_VTI_OKEY, htonl(okey)); + } + } nla_nest_end(nlm, infodata); nla_nest_end(nlm, linkinfo); @@ -27,7 +27,6 @@ static const struct blobmsg_policy tunnel_attrs[__TUNNEL_ATTR_MAX] = { [TUNNEL_ATTR_6RD_RELAY_PREFIX] = { .name = "6rd-relay-prefix", .type = BLOBMSG_TYPE_STRING }, [TUNNEL_ATTR_LINK] = { .name = "link", .type = BLOBMSG_TYPE_STRING }, [TUNNEL_ATTR_FMRS] = { .name = "fmrs", .type = BLOBMSG_TYPE_ARRAY }, - [TUNNEL_ATTR_INFO] = { .name = "info", .type = BLOBMSG_TYPE_STRING }, [TUNNEL_ATTR_DATA] = { .name = "data", .type = BLOBMSG_TYPE_TABLE }, }; @@ -61,6 +60,16 @@ const struct uci_blob_param_list gre_data_attr_list = { .params = gre_data_attrs, }; +static const struct blobmsg_policy vti_data_attrs[__VTI_DATA_ATTR_MAX] = { + [VTI_DATA_IKEY] = { .name = "ikey", .type = BLOBMSG_TYPE_INT32 }, + [VTI_DATA_OKEY] = { .name = "okey", .type = BLOBMSG_TYPE_INT32 }, +}; + +const struct uci_blob_param_list vti_data_attr_list = { + .n_params = __VTI_DATA_ATTR_MAX, + .params = vti_data_attrs, +}; + void system_fd_set_cloexec(int fd) { #ifdef FD_CLOEXEC @@ -34,7 +34,6 @@ enum tunnel_param { TUNNEL_ATTR_6RD_RELAY_PREFIX, TUNNEL_ATTR_LINK, TUNNEL_ATTR_FMRS, - TUNNEL_ATTR_INFO, TUNNEL_ATTR_DATA, __TUNNEL_ATTR_MAX }; @@ -58,8 +57,15 @@ enum gre_data { __GRE_DATA_ATTR_MAX }; +enum vti_data { + VTI_DATA_IKEY, + VTI_DATA_OKEY, + __VTI_DATA_ATTR_MAX +}; + extern const struct uci_blob_param_list vxlan_data_attr_list; extern const struct uci_blob_param_list gre_data_attr_list; +extern const struct uci_blob_param_list vti_data_attr_list; enum bridge_opt { /* stp and forward delay always set */ |