net: fou: use policy and operation tables generated from the spec
authorJakub Kicinski <kuba@kernel.org>
Fri, 20 Jan 2023 17:50:40 +0000 (09:50 -0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 24 Jan 2023 09:58:11 +0000 (10:58 +0100)
Generate and plug in the spec-based tables.

A little bit of renaming is needed in the FOU code.

Acked-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/ipv4/Makefile
net/ipv4/fou_core.c
net/ipv4/fou_nl.c [new file with mode: 0644]
net/ipv4/fou_nl.h [new file with mode: 0644]

index fabbe46897cee5cfbec66d248626c5995213aaa7..880277c9fd07bf8fb12323c43ef1df4faea70417 100644 (file)
@@ -26,7 +26,7 @@ obj-$(CONFIG_IP_MROUTE) += ipmr.o
 obj-$(CONFIG_IP_MROUTE_COMMON) += ipmr_base.o
 obj-$(CONFIG_NET_IPIP) += ipip.o
 gre-y := gre_demux.o
-fou-y := fou_core.o
+fou-y := fou_core.o fou_nl.o
 obj-$(CONFIG_NET_FOU) += fou.o
 obj-$(CONFIG_NET_IPGRE_DEMUX) += gre.o
 obj-$(CONFIG_NET_IPGRE) += ip_gre.o
index 0c3c6d0cee290cfef07ec8f3fa7e2089f68db341..cafec9b4eee01622a09a48197628ea6ef41239e9 100644 (file)
@@ -19,6 +19,8 @@
 #include <uapi/linux/fou.h>
 #include <uapi/linux/genetlink.h>
 
+#include "fou_nl.h"
+
 struct fou {
        struct socket *sock;
        u8 protocol;
@@ -640,20 +642,6 @@ static int fou_destroy(struct net *net, struct fou_cfg *cfg)
 
 static struct genl_family fou_nl_family;
 
-static const struct nla_policy fou_nl_policy[FOU_ATTR_MAX + 1] = {
-       [FOU_ATTR_PORT]                 = { .type = NLA_U16, },
-       [FOU_ATTR_AF]                   = { .type = NLA_U8, },
-       [FOU_ATTR_IPPROTO]              = { .type = NLA_U8, },
-       [FOU_ATTR_TYPE]                 = { .type = NLA_U8, },
-       [FOU_ATTR_REMCSUM_NOPARTIAL]    = { .type = NLA_FLAG, },
-       [FOU_ATTR_LOCAL_V4]             = { .type = NLA_U32, },
-       [FOU_ATTR_PEER_V4]              = { .type = NLA_U32, },
-       [FOU_ATTR_LOCAL_V6]             = { .len = sizeof(struct in6_addr), },
-       [FOU_ATTR_PEER_V6]              = { .len = sizeof(struct in6_addr), },
-       [FOU_ATTR_PEER_PORT]            = { .type = NLA_U16, },
-       [FOU_ATTR_IFINDEX]              = { .type = NLA_S32, },
-};
-
 static int parse_nl_config(struct genl_info *info,
                           struct fou_cfg *cfg)
 {
@@ -745,7 +733,7 @@ static int parse_nl_config(struct genl_info *info,
        return 0;
 }
 
-static int fou_nl_cmd_add_port(struct sk_buff *skb, struct genl_info *info)
+int fou_nl_add_doit(struct sk_buff *skb, struct genl_info *info)
 {
        struct net *net = genl_info_net(info);
        struct fou_cfg cfg;
@@ -758,7 +746,7 @@ static int fou_nl_cmd_add_port(struct sk_buff *skb, struct genl_info *info)
        return fou_create(net, &cfg, NULL);
 }
 
-static int fou_nl_cmd_rm_port(struct sk_buff *skb, struct genl_info *info)
+int fou_nl_del_doit(struct sk_buff *skb, struct genl_info *info)
 {
        struct net *net = genl_info_net(info);
        struct fou_cfg cfg;
@@ -827,7 +815,7 @@ nla_put_failure:
        return -EMSGSIZE;
 }
 
-static int fou_nl_cmd_get_port(struct sk_buff *skb, struct genl_info *info)
+int fou_nl_get_doit(struct sk_buff *skb, struct genl_info *info)
 {
        struct net *net = genl_info_net(info);
        struct fou_net *fn = net_generic(net, fou_net_id);
@@ -874,7 +862,7 @@ out_free:
        return ret;
 }
 
-static int fou_nl_dump(struct sk_buff *skb, struct netlink_callback *cb)
+int fou_nl_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
 {
        struct net *net = sock_net(skb->sk);
        struct fou_net *fn = net_generic(net, fou_net_id);
@@ -897,33 +885,12 @@ static int fou_nl_dump(struct sk_buff *skb, struct netlink_callback *cb)
        return skb->len;
 }
 
-static const struct genl_small_ops fou_nl_ops[] = {
-       {
-               .cmd = FOU_CMD_ADD,
-               .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
-               .doit = fou_nl_cmd_add_port,
-               .flags = GENL_ADMIN_PERM,
-       },
-       {
-               .cmd = FOU_CMD_DEL,
-               .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
-               .doit = fou_nl_cmd_rm_port,
-               .flags = GENL_ADMIN_PERM,
-       },
-       {
-               .cmd = FOU_CMD_GET,
-               .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
-               .doit = fou_nl_cmd_get_port,
-               .dumpit = fou_nl_dump,
-       },
-};
-
 static struct genl_family fou_nl_family __ro_after_init = {
        .hdrsize        = 0,
        .name           = FOU_GENL_NAME,
        .version        = FOU_GENL_VERSION,
        .maxattr        = FOU_ATTR_MAX,
-       .policy = fou_nl_policy,
+       .policy         = fou_nl_policy,
        .netnsok        = true,
        .module         = THIS_MODULE,
        .small_ops      = fou_nl_ops,
diff --git a/net/ipv4/fou_nl.c b/net/ipv4/fou_nl.c
new file mode 100644 (file)
index 0000000..6c3820f
--- /dev/null
@@ -0,0 +1,48 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/* Do not edit directly, auto-generated from: */
+/*     Documentation/netlink/specs/fou.yaml */
+/* YNL-GEN kernel source */
+
+#include <net/netlink.h>
+#include <net/genetlink.h>
+
+#include "fou_nl.h"
+
+#include <linux/fou.h>
+
+/* Global operation policy for fou */
+const struct nla_policy fou_nl_policy[FOU_ATTR_IFINDEX + 1] = {
+       [FOU_ATTR_PORT] = { .type = NLA_U16, },
+       [FOU_ATTR_AF] = { .type = NLA_U8, },
+       [FOU_ATTR_IPPROTO] = { .type = NLA_U8, },
+       [FOU_ATTR_TYPE] = { .type = NLA_U8, },
+       [FOU_ATTR_REMCSUM_NOPARTIAL] = { .type = NLA_FLAG, },
+       [FOU_ATTR_LOCAL_V4] = { .type = NLA_U32, },
+       [FOU_ATTR_LOCAL_V6] = { .len = 16, },
+       [FOU_ATTR_PEER_V4] = { .type = NLA_U32, },
+       [FOU_ATTR_PEER_V6] = { .len = 16, },
+       [FOU_ATTR_PEER_PORT] = { .type = NLA_U16, },
+       [FOU_ATTR_IFINDEX] = { .type = NLA_S32, },
+};
+
+/* Ops table for fou */
+const struct genl_small_ops fou_nl_ops[3] = {
+       {
+               .cmd            = FOU_CMD_ADD,
+               .validate       = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
+               .doit           = fou_nl_add_doit,
+               .flags          = GENL_ADMIN_PERM,
+       },
+       {
+               .cmd            = FOU_CMD_DEL,
+               .validate       = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
+               .doit           = fou_nl_del_doit,
+               .flags          = GENL_ADMIN_PERM,
+       },
+       {
+               .cmd            = FOU_CMD_GET,
+               .validate       = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
+               .doit           = fou_nl_get_doit,
+               .dumpit         = fou_nl_get_dumpit,
+       },
+};
diff --git a/net/ipv4/fou_nl.h b/net/ipv4/fou_nl.h
new file mode 100644 (file)
index 0000000..b7a6812
--- /dev/null
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/* Do not edit directly, auto-generated from: */
+/*     Documentation/netlink/specs/fou.yaml */
+/* YNL-GEN kernel header */
+
+#ifndef _LINUX_FOU_GEN_H
+#define _LINUX_FOU_GEN_H
+
+#include <net/netlink.h>
+#include <net/genetlink.h>
+
+#include <linux/fou.h>
+
+/* Global operation policy for fou */
+extern const struct nla_policy fou_nl_policy[FOU_ATTR_IFINDEX + 1];
+
+/* Ops table for fou */
+extern const struct genl_small_ops fou_nl_ops[3];
+
+int fou_nl_add_doit(struct sk_buff *skb, struct genl_info *info);
+int fou_nl_del_doit(struct sk_buff *skb, struct genl_info *info);
+int fou_nl_get_doit(struct sk_buff *skb, struct genl_info *info);
+int fou_nl_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb);
+
+#endif /* _LINUX_FOU_GEN_H */