Skip to content

Commit

Permalink
genetlink: no longer support using static family IDs
Browse files Browse the repository at this point in the history
Static family IDs have never really been used, the only
use case was the workaround I introduced for those users
that assumed their family ID was also their multicast
group ID.

Additionally, because static family IDs would never be
reserved by the generic netlink code, using a relatively
low ID would only work for built-in families that can be
registered immediately after generic netlink is started,
which is basically only the control family (apart from
the workaround code, which I also had to add code for so
it would reserve those IDs)

Thus, anything other than GENL_ID_GENERATE is flawed and
luckily not used except in the cases I mentioned. Move
those workarounds into a few lines of code, and then get
rid of GENL_ID_GENERATE entirely, making it more robust.

Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
jmberg-intel authored and davem330 committed Oct 27, 2016
1 parent c90c39d commit a07ea4d
Show file tree
Hide file tree
Showing 37 changed files with 24 additions and 69 deletions.
1 change: 0 additions & 1 deletion drivers/acpi/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ static const struct genl_multicast_group acpi_event_mcgrps[] = {
};

static struct genl_family acpi_event_genl_family = {
.id = GENL_ID_GENERATE,
.name = ACPI_GENL_FAMILY_NAME,
.version = ACPI_GENL_VERSION,
.maxattr = ACPI_GENL_ATTR_MAX,
Expand Down
1 change: 0 additions & 1 deletion drivers/net/gtp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1095,7 +1095,6 @@ static int gtp_genl_del_pdp(struct sk_buff *skb, struct genl_info *info)
}

static struct genl_family gtp_genl_family = {
.id = GENL_ID_GENERATE,
.name = "gtp",
.version = 0,
.hdrsize = 0,
Expand Down
1 change: 0 additions & 1 deletion drivers/net/macsec.c
Original file line number Diff line number Diff line change
Expand Up @@ -1422,7 +1422,6 @@ static void clear_tx_sa(struct macsec_tx_sa *tx_sa)
}

static struct genl_family macsec_fam = {
.id = GENL_ID_GENERATE,
.name = MACSEC_GENL_NAME,
.hdrsize = 0,
.version = MACSEC_GENL_VERSION,
Expand Down
1 change: 0 additions & 1 deletion drivers/net/team/team.c
Original file line number Diff line number Diff line change
Expand Up @@ -2151,7 +2151,6 @@ static struct rtnl_link_ops team_link_ops __read_mostly = {
***********************************/

static struct genl_family team_nl_family = {
.id = GENL_ID_GENERATE,
.name = TEAM_GENL_NAME,
.version = TEAM_GENL_VERSION,
.maxattr = TEAM_ATTR_MAX,
Expand Down
1 change: 0 additions & 1 deletion drivers/net/wireless/mac80211_hwsim.c
Original file line number Diff line number Diff line change
Expand Up @@ -589,7 +589,6 @@ struct hwsim_radiotap_ack_hdr {

/* MAC80211_HWSIM netlinf family */
static struct genl_family hwsim_genl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = "MAC80211_HWSIM",
.version = 1,
Expand Down
6 changes: 0 additions & 6 deletions drivers/scsi/pmcraid.c
Original file line number Diff line number Diff line change
Expand Up @@ -1369,12 +1369,6 @@ static struct genl_multicast_group pmcraid_mcgrps[] = {
};

static struct genl_family pmcraid_event_family = {
/*
* Due to prior multicast group abuse (the code having assumed that
* the family ID can be used as a multicast group ID) we need to
* statically allocate a family (and thus group) ID.
*/
.id = GENL_ID_PMCRAID,
.name = "pmcraid",
.version = 1,
.maxattr = PMCRAID_AEN_ATTR_MAX,
Expand Down
1 change: 0 additions & 1 deletion drivers/target/target_core_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ static const struct genl_multicast_group tcmu_mcgrps[] = {

/* Our generic netlink family */
static struct genl_family tcmu_genl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = "TCM-USER",
.version = 1,
Expand Down
1 change: 0 additions & 1 deletion drivers/thermal/thermal_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2164,7 +2164,6 @@ static const struct genl_multicast_group thermal_event_mcgrps[] = {
};

static struct genl_family thermal_event_genl_family = {
.id = GENL_ID_GENERATE,
.name = THERMAL_GENL_FAMILY_NAME,
.version = THERMAL_GENL_VERSION,
.maxattr = THERMAL_GENL_ATTR_MAX,
Expand Down
1 change: 0 additions & 1 deletion fs/dlm/netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ static uint32_t dlm_nl_seqnum;
static uint32_t listener_nlportid;

static struct genl_family family = {
.id = GENL_ID_GENERATE,
.name = DLM_GENL_NAME,
.version = DLM_GENL_VERSION,
};
Expand Down
7 changes: 0 additions & 7 deletions fs/quota/netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,6 @@ static const struct genl_multicast_group quota_mcgrps[] = {

/* Netlink family structure for quota */
static struct genl_family quota_genl_family = {
/*
* Needed due to multicast group ID abuse - old code assumed
* the family ID was also a valid multicast group ID (which
* isn't true) and userspace might thus rely on it. Assign a
* static ID for this group to make dealing with that easier.
*/
.id = GENL_ID_VFS_DQUOT,
.hdrsize = 0,
.name = "VFS_DQUOT",
.version = 1,
Expand Down
1 change: 0 additions & 1 deletion include/linux/genl_magic_func.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,6 @@ static struct genl_ops ZZZ_genl_ops[] __read_mostly = {
*/
#define ZZZ_genl_family CONCAT_(GENL_MAGIC_FAMILY, _genl_family)
static struct genl_family ZZZ_genl_family __read_mostly = {
.id = GENL_ID_GENERATE,
.name = __stringify(GENL_MAGIC_FAMILY),
.version = GENL_MAGIC_VERSION,
#ifdef GENL_MAGIC_FAMILY_HDRSZ
Expand Down
7 changes: 2 additions & 5 deletions include/net/genetlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ struct genl_info;

/**
* struct genl_family - generic netlink family
* @id: protocol family idenfitier
* @id: protocol family identifier (private)
* @hdrsize: length of user specific header in bytes
* @name: name of family
* @version: protocol version
Expand Down Expand Up @@ -48,7 +48,7 @@ struct genl_info;
* @n_ops: number of operations supported by this family (private)
*/
struct genl_family {
unsigned int id;
unsigned int id; /* private */
unsigned int hdrsize;
char name[GENL_NAMSIZ];
unsigned int version;
Expand Down Expand Up @@ -149,9 +149,6 @@ static inline int genl_register_family(struct genl_family *family)
* Registers the specified family and operations from the specified table.
* Only one family may be registered with the same family name or identifier.
*
* The family id may equal GENL_ID_GENERATE causing an unique id to
* be automatically generated and assigned.
*
* Either a doit or dumpit callback must be specified for every registered
* operation or the function will fail. Only one operation structure per
* command identifier may be registered.
Expand Down
1 change: 0 additions & 1 deletion include/uapi/linux/genetlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ struct genlmsghdr {
/*
* List of reserved static generic netlink identifiers:
*/
#define GENL_ID_GENERATE 0
#define GENL_ID_CTRL NLMSG_MIN_TYPE
#define GENL_ID_VFS_DQUOT (NLMSG_MIN_TYPE + 1)
#define GENL_ID_PMCRAID (NLMSG_MIN_TYPE + 2)
Expand Down
1 change: 0 additions & 1 deletion kernel/taskstats.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ static int family_registered;
struct kmem_cache *taskstats_cache;

static struct genl_family family = {
.id = GENL_ID_GENERATE,
.name = TASKSTATS_GENL_NAME,
.version = TASKSTATS_GENL_VERSION,
.maxattr = TASKSTATS_CMD_ATTR_MAX,
Expand Down
1 change: 0 additions & 1 deletion net/batman-adv/netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
#include "translation-table.h"

struct genl_family batadv_netlink_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = BATADV_NL_NAME,
.version = 1,
Expand Down
1 change: 0 additions & 1 deletion net/core/devlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,6 @@ static void devlink_nl_post_doit(const struct genl_ops *ops,
}

static struct genl_family devlink_nl_family = {
.id = GENL_ID_GENERATE,
.name = DEVLINK_GENL_NAME,
.version = DEVLINK_GENL_VERSION,
.maxattr = DEVLINK_ATTR_MAX,
Expand Down
1 change: 0 additions & 1 deletion net/core/drop_monitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ struct dm_hw_stat_delta {
};

static struct genl_family net_drop_monitor_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = "NET_DM",
.version = 2,
Expand Down
1 change: 0 additions & 1 deletion net/hsr/hsr_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@ static const struct nla_policy hsr_genl_policy[HSR_A_MAX + 1] = {
};

static struct genl_family hsr_genl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = "HSR",
.version = 1,
Expand Down
1 change: 0 additions & 1 deletion net/ieee802154/netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ static unsigned int ieee802154_seq_num;
static DEFINE_SPINLOCK(ieee802154_seq_lock);

struct genl_family nl802154_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = IEEE802154_NL_NAME,
.version = 1,
Expand Down
1 change: 0 additions & 1 deletion net/ieee802154/nl802154.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ static void nl802154_post_doit(const struct genl_ops *ops, struct sk_buff *skb,

/* the netlink family */
static struct genl_family nl802154_fam = {
.id = GENL_ID_GENERATE, /* don't bother with a hardcoded ID */
.name = NL802154_GENL_NAME, /* have users key off the name instead */
.hdrsize = 0, /* no private header */
.version = 1, /* no particular meaning now */
Expand Down
1 change: 0 additions & 1 deletion net/ipv4/fou.c
Original file line number Diff line number Diff line change
Expand Up @@ -623,7 +623,6 @@ static int fou_destroy(struct net *net, struct fou_cfg *cfg)
}

static struct genl_family fou_nl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = FOU_GENL_NAME,
.version = FOU_GENL_VERSION,
Expand Down
1 change: 0 additions & 1 deletion net/ipv4/tcp_metrics.c
Original file line number Diff line number Diff line change
Expand Up @@ -743,7 +743,6 @@ void tcp_fastopen_cache_set(struct sock *sk, u16 mss,
}

static struct genl_family tcp_metrics_nl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = TCP_METRICS_GENL_NAME,
.version = TCP_METRICS_GENL_VERSION,
Expand Down
1 change: 0 additions & 1 deletion net/ipv6/ila/ila_xlat.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ static const struct rhashtable_params rht_params = {
};

static struct genl_family ila_nl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = ILA_GENL_NAME,
.version = ILA_GENL_VERSION,
Expand Down
1 change: 0 additions & 1 deletion net/irda/irnetlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@


static struct genl_family irda_nl_family = {
.id = GENL_ID_GENERATE,
.name = IRDA_NL_NAME,
.hdrsize = 0,
.version = IRDA_NL_VERSION,
Expand Down
1 change: 0 additions & 1 deletion net/l2tp/l2tp_netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@


static struct genl_family l2tp_nl_family = {
.id = GENL_ID_GENERATE,
.name = L2TP_GENL_NAME,
.version = L2TP_GENL_VERSION,
.hdrsize = 0,
Expand Down
1 change: 0 additions & 1 deletion net/netfilter/ipvs/ip_vs_ctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -2841,7 +2841,6 @@ static struct nf_sockopt_ops ip_vs_sockopts = {

/* IPVS genetlink family */
static struct genl_family ip_vs_genl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = IPVS_GENL_NAME,
.version = IPVS_GENL_VERSION,
Expand Down
1 change: 0 additions & 1 deletion net/netlabel/netlabel_calipso.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ struct netlbl_domhsh_walk_arg {

/* NetLabel Generic NETLINK CALIPSO family */
static struct genl_family netlbl_calipso_gnl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = NETLBL_NLTYPE_CALIPSO_NAME,
.version = NETLBL_PROTO_VERSION,
Expand Down
1 change: 0 additions & 1 deletion net/netlabel/netlabel_cipso_v4.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ struct netlbl_domhsh_walk_arg {

/* NetLabel Generic NETLINK CIPSOv4 family */
static struct genl_family netlbl_cipsov4_gnl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = NETLBL_NLTYPE_CIPSOV4_NAME,
.version = NETLBL_PROTO_VERSION,
Expand Down
1 change: 0 additions & 1 deletion net/netlabel/netlabel_mgmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ struct netlbl_domhsh_walk_arg {

/* NetLabel Generic NETLINK CIPSOv4 family */
static struct genl_family netlbl_mgmt_gnl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = NETLBL_NLTYPE_MGMT_NAME,
.version = NETLBL_PROTO_VERSION,
Expand Down
1 change: 0 additions & 1 deletion net/netlabel/netlabel_unlabeled.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,6 @@ static u8 netlabel_unlabel_acceptflg;

/* NetLabel Generic NETLINK unlabeled family */
static struct genl_family netlbl_unlabel_gnl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = NETLBL_NLTYPE_UNLABELED_NAME,
.version = NETLBL_PROTO_VERSION,
Expand Down
37 changes: 22 additions & 15 deletions net/netlink/genetlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -349,8 +349,6 @@ static int genl_validate_ops(const struct genl_family *family)
*
* Registers the specified family after validating it first. Only one
* family may be registered with the same family name or identifier.
* The family id may equal GENL_ID_GENERATE causing an unique id to
* be automatically generated and assigned.
*
* The family's ops array must already be assigned, you can use the
* genl_register_family_with_ops() helper function.
Expand All @@ -359,13 +357,7 @@ static int genl_validate_ops(const struct genl_family *family)
*/
int __genl_register_family(struct genl_family *family)
{
int err = -EINVAL, i;

if (family->id && family->id < GENL_MIN_ID)
goto errout;

if (family->id > GENL_MAX_ID)
goto errout;
int err, i;

err = genl_validate_ops(family);
if (err)
Expand All @@ -378,18 +370,34 @@ int __genl_register_family(struct genl_family *family)
goto errout_locked;
}

if (family->id == GENL_ID_GENERATE) {
u16 newid = genl_generate_id();
if (family == &genl_ctrl) {
family->id = GENL_ID_CTRL;
} else {
u16 newid;

/* this should be left zero in the struct */
WARN_ON(family->id);

/*
* Sadly, a few cases need to be special-cased
* due to them having previously abused the API
* and having used their family ID also as their
* multicast group ID, so we use reserved IDs
* for both to be sure we can do that mapping.
*/
if (strcmp(family->name, "pmcraid") == 0)
newid = GENL_ID_PMCRAID;
else if (strcmp(family->name, "VFS_DQUOT") == 0)
newid = GENL_ID_VFS_DQUOT;
else
newid = genl_generate_id();

if (!newid) {
err = -ENOMEM;
goto errout_locked;
}

family->id = newid;
} else if (genl_family_find_byid(family->id)) {
err = -EEXIST;
goto errout_locked;
}

if (family->maxattr && !family->parallel_ops) {
Expand Down Expand Up @@ -419,7 +427,6 @@ int __genl_register_family(struct genl_family *family)

errout_locked:
genl_unlock_all();
errout:
return err;
}
EXPORT_SYMBOL(__genl_register_family);
Expand Down
1 change: 0 additions & 1 deletion net/nfc/netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ static const struct genl_multicast_group nfc_genl_mcgrps[] = {
};

static struct genl_family nfc_genl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = 0,
.name = NFC_GENL_NAME,
.version = NFC_GENL_VERSION,
Expand Down
4 changes: 0 additions & 4 deletions net/openvswitch/datapath.c
Original file line number Diff line number Diff line change
Expand Up @@ -671,7 +671,6 @@ static const struct genl_ops dp_packet_genl_ops[] = {
};

static struct genl_family dp_packet_genl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = sizeof(struct ovs_header),
.name = OVS_PACKET_FAMILY,
.version = OVS_PACKET_VERSION,
Expand Down Expand Up @@ -1436,7 +1435,6 @@ static const struct genl_ops dp_flow_genl_ops[] = {
};

static struct genl_family dp_flow_genl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = sizeof(struct ovs_header),
.name = OVS_FLOW_FAMILY,
.version = OVS_FLOW_VERSION,
Expand Down Expand Up @@ -1822,7 +1820,6 @@ static const struct genl_ops dp_datapath_genl_ops[] = {
};

static struct genl_family dp_datapath_genl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = sizeof(struct ovs_header),
.name = OVS_DATAPATH_FAMILY,
.version = OVS_DATAPATH_VERSION,
Expand Down Expand Up @@ -2244,7 +2241,6 @@ static const struct genl_ops dp_vport_genl_ops[] = {
};

struct genl_family dp_vport_genl_family = {
.id = GENL_ID_GENERATE,
.hdrsize = sizeof(struct ovs_header),
.name = OVS_VPORT_FAMILY,
.version = OVS_VPORT_VERSION,
Expand Down
1 change: 0 additions & 1 deletion net/tipc/netlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,6 @@ const struct nla_policy tipc_nl_udp_policy[TIPC_NLA_UDP_MAX + 1] = {
* so we have a separate genl handling for the new API.
*/
struct genl_family tipc_genl_family = {
.id = GENL_ID_GENERATE,
.name = TIPC_GENL_V2_NAME,
.version = TIPC_GENL_V2_VERSION,
.hdrsize = 0,
Expand Down
1 change: 0 additions & 1 deletion net/tipc/netlink_compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -1216,7 +1216,6 @@ static int tipc_nl_compat_recv(struct sk_buff *skb, struct genl_info *info)
}

static struct genl_family tipc_genl_compat_family = {
.id = GENL_ID_GENERATE,
.name = TIPC_GENL_NAME,
.version = TIPC_GENL_VERSION,
.hdrsize = TIPC_GENL_HDRLEN,
Expand Down
Loading

0 comments on commit a07ea4d

Please sign in to comment.