Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[firefly-linux-kernel-4.4.55.git] / net / l2tp / l2tp_netlink.c
index 3d0f7f6f748809110d52d10ec4bccf4b6514f3af..4c1e540732d7e43fdb6b22a445e33d5301c9b4df 100644 (file)
@@ -129,11 +129,21 @@ static int l2tp_nl_cmd_tunnel_create(struct sk_buff *skb, struct genl_info *info
        }
        cfg.encap = nla_get_u16(info->attrs[L2TP_ATTR_ENCAP_TYPE]);
 
-       if (!info->attrs[L2TP_ATTR_FD]) {
-               ret = -EINVAL;
-               goto out;
+       fd = -1;
+       if (info->attrs[L2TP_ATTR_FD]) {
+               fd = nla_get_u32(info->attrs[L2TP_ATTR_FD]);
+       } else {
+               if (info->attrs[L2TP_ATTR_IP_SADDR])
+                       cfg.local_ip.s_addr = nla_get_be32(info->attrs[L2TP_ATTR_IP_SADDR]);
+               if (info->attrs[L2TP_ATTR_IP_DADDR])
+                       cfg.peer_ip.s_addr = nla_get_be32(info->attrs[L2TP_ATTR_IP_DADDR]);
+               if (info->attrs[L2TP_ATTR_UDP_SPORT])
+                       cfg.local_udp_port = nla_get_u16(info->attrs[L2TP_ATTR_UDP_SPORT]);
+               if (info->attrs[L2TP_ATTR_UDP_DPORT])
+                       cfg.peer_udp_port = nla_get_u16(info->attrs[L2TP_ATTR_UDP_DPORT]);
+               if (info->attrs[L2TP_ATTR_UDP_CSUM])
+                       cfg.use_udp_checksums = nla_get_flag(info->attrs[L2TP_ATTR_UDP_CSUM]);
        }
-       fd = nla_get_u32(info->attrs[L2TP_ATTR_FD]);
 
        if (info->attrs[L2TP_ATTR_DEBUG])
                cfg.debug = nla_get_u32(info->attrs[L2TP_ATTR_DEBUG]);
@@ -827,4 +837,4 @@ MODULE_DESCRIPTION("L2TP netlink");
 MODULE_LICENSE("GPL");
 MODULE_VERSION("1.0");
 MODULE_ALIAS("net-pf-" __stringify(PF_NETLINK) "-proto-" \
-            __stringify(NETLINK_GENERIC) "-type-" "l2tp")
+            __stringify(NETLINK_GENERIC) "-type-" "l2tp");