summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--system-linux.c29
-rw-r--r--system.c11
-rw-r--r--system.h8
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);
diff --git a/system.c b/system.c
index f899c7b..3d4a979 100644
--- a/system.c
+++ b/system.c
@@ -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
diff --git a/system.h b/system.h
index 14b1e53..9995fa9 100644
--- a/system.h
+++ b/system.h
@@ -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 */