Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec...
[cascardo/linux.git] / net / tipc / bearer.c
index 26630a5..463db5b 100644 (file)
@@ -647,7 +647,8 @@ void tipc_bearer_stop(void)
 }
 
 /* Caller should hold rtnl_lock to protect the bearer */
-int __tipc_nl_add_bearer(struct tipc_nl_msg *msg, struct tipc_bearer *bearer)
+static int __tipc_nl_add_bearer(struct tipc_nl_msg *msg,
+                               struct tipc_bearer *bearer)
 {
        void *hdr;
        struct nlattr *attrs;
@@ -905,7 +906,8 @@ int tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
        return 0;
 }
 
-int __tipc_nl_add_media(struct tipc_nl_msg *msg, struct tipc_media *media)
+static int __tipc_nl_add_media(struct tipc_nl_msg *msg,
+                              struct tipc_media *media)
 {
        void *hdr;
        struct nlattr *attrs;
@@ -1023,3 +1025,50 @@ err_out:
 
        return err;
 }
+
+int tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
+{
+       int err;
+       char *name;
+       struct tipc_media *m;
+       struct nlattr *attrs[TIPC_NLA_BEARER_MAX + 1];
+
+       if (!info->attrs[TIPC_NLA_MEDIA])
+               return -EINVAL;
+
+       err = nla_parse_nested(attrs, TIPC_NLA_MEDIA_MAX,
+                              info->attrs[TIPC_NLA_MEDIA],
+                              tipc_nl_media_policy);
+
+       if (!attrs[TIPC_NLA_MEDIA_NAME])
+               return -EINVAL;
+       name = nla_data(attrs[TIPC_NLA_MEDIA_NAME]);
+
+       rtnl_lock();
+       m = tipc_media_find(name);
+       if (!m) {
+               rtnl_unlock();
+               return -EINVAL;
+       }
+
+       if (attrs[TIPC_NLA_MEDIA_PROP]) {
+               struct nlattr *props[TIPC_NLA_PROP_MAX + 1];
+
+               err = tipc_nl_parse_link_prop(attrs[TIPC_NLA_MEDIA_PROP],
+                                             props);
+               if (err) {
+                       rtnl_unlock();
+                       return err;
+               }
+
+               if (props[TIPC_NLA_PROP_TOL])
+                       m->tolerance = nla_get_u32(props[TIPC_NLA_PROP_TOL]);
+               if (props[TIPC_NLA_PROP_PRIO])
+                       m->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
+               if (props[TIPC_NLA_PROP_WIN])
+                       m->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
+       }
+       rtnl_unlock();
+
+       return 0;
+}