From: Sven Eckelmann Date: Thu, 23 May 2019 19:26:58 +0200 Subject: Revert "batman-adv: genetlink: make policy common to family" OpenWrt's mac80211 package is not yet ready to support the generic netlink API of Linux 5.2. This reverts commit acfc9a214d01695d1676313ca80cfd2d9309f633. --- a/compat-include/linux/cache.h +++ b/compat-include/linux/cache.h @@ -13,8 +13,12 @@ #include #include_next -#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0) +/* hack for netlink.c which marked the family ops as ro */ +#ifdef __ro_after_init +#undef __ro_after_init +#endif #define __ro_after_init #endif /* < KERNEL_VERSION(4, 6, 0) */ --- a/compat-include/net/genetlink.h +++ b/compat-include/net/genetlink.h @@ -30,92 +30,4 @@ void batadv_genl_dump_check_consistent(s #endif /* < KERNEL_VERSION(4, 15, 0) */ - -#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 2, 0) - -struct batadv_genl_family { - /* data handled by the actual kernel */ - struct genl_family family; - - /* data which has to be copied to family by - * batadv_genl_register_family - */ - unsigned int hdrsize; - char name[GENL_NAMSIZ]; - unsigned int version; - unsigned int maxattr; - const struct nla_policy *policy; - bool netnsok; - int (*pre_doit)(const struct genl_ops *ops, struct sk_buff *skb, - struct genl_info *info); - void (*post_doit)(const struct genl_ops *ops, struct sk_buff *skb, - struct genl_info *info); - const struct genl_ops *ops; - const struct genl_multicast_group *mcgrps; - unsigned int n_ops; - unsigned int n_mcgrps; - struct module *module; - - /* allocated by batadv_genl_register_family and free'd by - * batadv_genl_unregister_family. Used to modify the usually read-only - * ops - */ - struct genl_ops *copy_ops; -}; - -#define genl_family batadv_genl_family - -static inline int batadv_genl_register_family(struct batadv_genl_family *family) -{ - struct genl_ops *ops; - unsigned int i; - - family->family.hdrsize = family->hdrsize; - strncpy(family->family.name, family->name, sizeof(family->family.name)); - family->family.version = family->version; - family->family.maxattr = family->maxattr; - family->family.netnsok = family->netnsok; - family->family.pre_doit = family->pre_doit; - family->family.post_doit = family->post_doit; - family->family.mcgrps = family->mcgrps; - family->family.n_ops = family->n_ops; - family->family.n_mcgrps = family->n_mcgrps; - family->family.module = family->module; - - ops = kmemdup(family->ops, sizeof(*ops) * family->n_ops, GFP_KERNEL); - if (!ops) - return -ENOMEM; - - for (i = 0; i < family->family.n_ops; i++) - ops[i].policy = family->policy; - - family->family.ops = ops; - family->copy_ops = ops; - - return genl_register_family(&family->family); -} - -#define genl_register_family(family) \ - batadv_genl_register_family((family)) - -static inline void -batadv_genl_unregister_family(struct batadv_genl_family *family) -{ - - genl_unregister_family(&family->family); - kfree(family->copy_ops); -} - -#define genl_unregister_family(family) \ - batadv_genl_unregister_family((family)) - -#define genlmsg_put(_skb, _pid, _seq, _family, _flags, _cmd) \ - genlmsg_put(_skb, _pid, _seq, &(_family)->family, _flags, _cmd) - -#define genlmsg_multicast_netns(_family, _net, _skb, _portid, _group, _flags) \ - genlmsg_multicast_netns(&(_family)->family, _net, _skb, _portid, \ - _group, _flags) - -#endif /* < KERNEL_VERSION(5, 2, 0) */ - #endif /* _NET_BATMAN_ADV_COMPAT_NET_GENETLINK_H_ */ --- a/net/batman-adv/netlink.c +++ b/net/batman-adv/netlink.c @@ -1344,29 +1344,34 @@ static const struct genl_ops batadv_netl { .cmd = BATADV_CMD_GET_MESH, /* can be retrieved by unprivileged users */ + .policy = batadv_netlink_policy, .doit = batadv_netlink_get_mesh, .internal_flags = BATADV_FLAG_NEED_MESH, }, { .cmd = BATADV_CMD_TP_METER, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .doit = batadv_netlink_tp_meter_start, .internal_flags = BATADV_FLAG_NEED_MESH, }, { .cmd = BATADV_CMD_TP_METER_CANCEL, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .doit = batadv_netlink_tp_meter_cancel, .internal_flags = BATADV_FLAG_NEED_MESH, }, { .cmd = BATADV_CMD_GET_ROUTING_ALGOS, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .dumpit = batadv_algo_dump, }, { .cmd = BATADV_CMD_GET_HARDIF, /* can be retrieved by unprivileged users */ + .policy = batadv_netlink_policy, .dumpit = batadv_netlink_dump_hardif, .doit = batadv_netlink_get_hardif, .internal_flags = BATADV_FLAG_NEED_MESH | @@ -1375,57 +1380,68 @@ static const struct genl_ops batadv_netl { .cmd = BATADV_CMD_GET_TRANSTABLE_LOCAL, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .dumpit = batadv_tt_local_dump, }, { .cmd = BATADV_CMD_GET_TRANSTABLE_GLOBAL, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .dumpit = batadv_tt_global_dump, }, { .cmd = BATADV_CMD_GET_ORIGINATORS, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .dumpit = batadv_orig_dump, }, { .cmd = BATADV_CMD_GET_NEIGHBORS, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .dumpit = batadv_hardif_neigh_dump, }, { .cmd = BATADV_CMD_GET_GATEWAYS, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .dumpit = batadv_gw_dump, }, { .cmd = BATADV_CMD_GET_BLA_CLAIM, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .dumpit = batadv_bla_claim_dump, }, { .cmd = BATADV_CMD_GET_BLA_BACKBONE, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .dumpit = batadv_bla_backbone_dump, }, { .cmd = BATADV_CMD_GET_DAT_CACHE, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .dumpit = batadv_dat_cache_dump, }, { .cmd = BATADV_CMD_GET_MCAST_FLAGS, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .dumpit = batadv_mcast_flags_dump, }, { .cmd = BATADV_CMD_SET_MESH, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .doit = batadv_netlink_set_mesh, .internal_flags = BATADV_FLAG_NEED_MESH, }, { .cmd = BATADV_CMD_SET_HARDIF, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .doit = batadv_netlink_set_hardif, .internal_flags = BATADV_FLAG_NEED_MESH | BATADV_FLAG_NEED_HARDIF, @@ -1433,6 +1449,7 @@ static const struct genl_ops batadv_netl { .cmd = BATADV_CMD_GET_VLAN, /* can be retrieved by unprivileged users */ + .policy = batadv_netlink_policy, .doit = batadv_netlink_get_vlan, .internal_flags = BATADV_FLAG_NEED_MESH | BATADV_FLAG_NEED_VLAN, @@ -1440,6 +1457,7 @@ static const struct genl_ops batadv_netl { .cmd = BATADV_CMD_SET_VLAN, .flags = GENL_ADMIN_PERM, + .policy = batadv_netlink_policy, .doit = batadv_netlink_set_vlan, .internal_flags = BATADV_FLAG_NEED_MESH | BATADV_FLAG_NEED_VLAN, @@ -1451,7 +1469,6 @@ struct genl_family batadv_netlink_family .name = BATADV_NL_NAME, .version = 1, .maxattr = BATADV_ATTR_MAX, - .policy = batadv_netlink_policy, .netnsok = true, .pre_doit = batadv_pre_doit, .post_doit = batadv_post_doit,