net: fou: use policy and operation tables generated from the spec
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>
This commit is contained in:
Родитель
08d323234d
Коммит
1d562c32e4
|
@ -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
|
||||
|
|
|
@ -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,27 +885,6 @@ 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,
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
};
|
|
@ -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 */
|
Загрузка…
Ссылка в новой задаче