]> git.proxmox.com Git - ovs.git/blame - datapath/linux/compat/include/net/genetlink.h
datapath: Prevent linker error of unknown symbol.
[ovs.git] / datapath / linux / compat / include / net / genetlink.h
CommitLineData
064af421
BP
1#ifndef __NET_GENERIC_NETLINK_WRAPPER_H
2#define __NET_GENERIC_NETLINK_WRAPPER_H 1
3
aaff4b55 4#include <linux/version.h>
064af421 5#include <linux/netlink.h>
8ce41058 6#include <net/net_namespace.h>
b3dcb73c 7#include_next <net/genetlink.h>
aaff4b55 8
28aea917
IY
9/*
10 * 15e473046cb6e5d18a4d0057e61d76315230382b renames pid to portid
11 * the affected structures are
12 * netlink_skb_parms::pid -> portid
13 * genl_info::snd_pid -> snd_portid
14 */
15#if LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)
16#define snd_portid snd_pid
17#define portid pid
18#endif
19
13dd4a97 20#ifndef HAVE_GENL_NOTIFY_TAKES_FAMILY
cb25142c
PS
21struct rpl_genl_family {
22 struct genl_family compat_family;
23 unsigned int id;
24 unsigned int hdrsize;
25 char name[GENL_NAMSIZ];
26 unsigned int version;
27 unsigned int maxattr;
28 bool netnsok;
29 bool parallel_ops;
30 int (*pre_doit)(const struct genl_ops *ops,
31 struct sk_buff *skb,
32 struct genl_info *info);
33 void (*post_doit)(const struct genl_ops *ops,
34 struct sk_buff *skb,
35 struct genl_info *info);
36 struct nlattr ** attrbuf; /* private */
37 const struct genl_ops * ops; /* private */
38 const struct genl_multicast_group *mcgrps; /* private */
39 unsigned int n_ops; /* private */
40 unsigned int n_mcgrps; /* private */
41 unsigned int mcgrp_offset; /* private */
42 struct list_head family_list; /* private */
43 struct module *module;
44};
45
46#define genl_family rpl_genl_family
47#define genl_notify rpl_genl_notify
bedf02f4
AW
48void rpl_genl_notify(struct genl_family *family,
49 struct sk_buff *skb, struct net *net, u32 portid, u32 group,
50 struct nlmsghdr *nlh, gfp_t flags);
cb25142c
PS
51
52static inline void *rpl_genlmsg_put(struct sk_buff *skb, u32 portid, u32 seq,
53 struct genl_family *family, int flags, u8 cmd)
54{
55 return genlmsg_put(skb, portid, seq, &family->compat_family, flags, cmd);
56}
57
58#define genlmsg_put rpl_genlmsg_put
59
60static inline int rpl_genl_unregister_family(struct genl_family *family)
61{
62 return genl_unregister_family(&family->compat_family);
63}
64#define genl_unregister_family rpl_genl_unregister_family
65
66#define genl_set_err rpl_genl_set_err
67static inline int genl_set_err(struct genl_family *family, struct net *net,
68 u32 portid, u32 group, int code)
69{
70#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
71 netlink_set_err(net->genl_sock, portid, group, code);
72 return 0;
73#else
74 return netlink_set_err(net->genl_sock, portid, group, code);
75#endif
76}
77
78#define genlmsg_multicast_netns rpl_genlmsg_multicast_netns
79static inline int genlmsg_multicast_netns(struct genl_family *family,
80 struct net *net, struct sk_buff *skb,
81 u32 portid, unsigned int group, gfp_t flags)
82{
83 return nlmsg_multicast(net->genl_sock, skb, portid, group, flags);
84}
85
86
87#define __genl_register_family rpl___genl_register_family
88int rpl___genl_register_family(struct genl_family *family);
89
90#define genl_register_family rpl_genl_register_family
91static inline int rpl_genl_register_family(struct genl_family *family)
92{
93 family->module = THIS_MODULE;
94 return rpl___genl_register_family(family);
95}
96
97#endif
aaff4b55 98
705e9260 99#ifndef HAVE_GENLMSG_NEW_UNICAST
6c75562d
JG
100static inline struct sk_buff *genlmsg_new_unicast(size_t payload,
101 struct genl_info *info,
102 gfp_t flags)
103{
104 return genlmsg_new(payload, flags);
105}
106#endif
107
114fce23
SG
108#ifndef HAVE_GENL_HAS_LISTENERS
109static inline int genl_has_listeners(struct genl_family *family,
6233a1bd 110 struct net *net, unsigned int group)
114fce23
SG
111{
112#ifdef HAVE_MCGRP_OFFSET
113 if (WARN_ON_ONCE(group >= family->n_mcgrps))
114 return -EINVAL;
115 group = family->mcgrp_offset + group;
114fce23 116#endif
6233a1bd 117 return netlink_has_listeners(net->genl_sock, group);
114fce23 118}
6233a1bd
TG
119#else
120
121#ifndef HAVE_GENL_HAS_LISTENERS_TAKES_NET
122static inline int rpl_genl_has_listeners(struct genl_family *family,
123 struct net *net, unsigned int group)
124{
13dd4a97 125#ifdef HAVE_GENL_NOTIFY_TAKES_FAMILY
6233a1bd 126 return genl_has_listeners(family, net->genl_sock, group);
13dd4a97
JS
127#else
128 return genl_has_listeners(&family->compat_family, net->genl_sock, group);
129#endif
6233a1bd
TG
130}
131
132#define genl_has_listeners rpl_genl_has_listeners
114fce23
SG
133#endif
134
6233a1bd
TG
135#endif /* HAVE_GENL_HAS_LISTENERS */
136
c623ba49
JS
137#ifndef HAVE_GENLMSG_PARSE
138static inline int genlmsg_parse(const struct nlmsghdr *nlh,
139 const struct genl_family *family,
140 struct nlattr *tb[], int maxtype,
141 const struct nla_policy *policy)
142{
143 return nlmsg_parse(nlh, family->hdrsize + GENL_HDRLEN, tb, maxtype,
144 policy);
145}
146#endif
147
064af421 148#endif /* genetlink.h */