diff options
Diffstat (limited to 'include/linux/netlink.h')
-rw-r--r-- | include/linux/netlink.h | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index 2a20f488ac1b..f41688f56632 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h | |||
@@ -138,6 +138,11 @@ struct nlattr | |||
138 | #include <linux/capability.h> | 138 | #include <linux/capability.h> |
139 | #include <linux/skbuff.h> | 139 | #include <linux/skbuff.h> |
140 | 140 | ||
141 | static inline struct nlmsghdr *nlmsg_hdr(const struct sk_buff *skb) | ||
142 | { | ||
143 | return (struct nlmsghdr *)skb->data; | ||
144 | } | ||
145 | |||
141 | struct netlink_skb_parms | 146 | struct netlink_skb_parms |
142 | { | 147 | { |
143 | struct ucred creds; /* Skb credentials */ | 148 | struct ucred creds; /* Skb credentials */ |
@@ -152,7 +157,10 @@ struct netlink_skb_parms | |||
152 | #define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds) | 157 | #define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds) |
153 | 158 | ||
154 | 159 | ||
155 | extern struct sock *netlink_kernel_create(int unit, unsigned int groups, void (*input)(struct sock *sk, int len), struct module *module); | 160 | extern struct sock *netlink_kernel_create(int unit, unsigned int groups, |
161 | void (*input)(struct sock *sk, int len), | ||
162 | struct mutex *cb_mutex, | ||
163 | struct module *module); | ||
156 | extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err); | 164 | extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err); |
157 | extern int netlink_has_listeners(struct sock *sk, unsigned int group); | 165 | extern int netlink_has_listeners(struct sock *sk, unsigned int group); |
158 | extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock); | 166 | extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock); |
@@ -171,9 +179,16 @@ int netlink_sendskb(struct sock *sk, struct sk_buff *skb, int protocol); | |||
171 | 179 | ||
172 | /* | 180 | /* |
173 | * skb should fit one page. This choice is good for headerless malloc. | 181 | * skb should fit one page. This choice is good for headerless malloc. |
182 | * But we should limit to 8K so that userspace does not have to | ||
183 | * use enormous buffer sizes on recvmsg() calls just to avoid | ||
184 | * MSG_TRUNC when PAGE_SIZE is very large. | ||
174 | */ | 185 | */ |
175 | #define NLMSG_GOODORDER 0 | 186 | #if PAGE_SIZE < 8192UL |
176 | #define NLMSG_GOODSIZE (SKB_MAX_ORDER(0, NLMSG_GOODORDER)) | 187 | #define NLMSG_GOODSIZE SKB_WITH_OVERHEAD(PAGE_SIZE) |
188 | #else | ||
189 | #define NLMSG_GOODSIZE SKB_WITH_OVERHEAD(8192UL) | ||
190 | #endif | ||
191 | |||
177 | #define NLMSG_DEFAULT_SIZE (NLMSG_GOODSIZE - NLMSG_HDRLEN) | 192 | #define NLMSG_DEFAULT_SIZE (NLMSG_GOODSIZE - NLMSG_HDRLEN) |
178 | 193 | ||
179 | 194 | ||
@@ -217,18 +232,6 @@ __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags) | |||
217 | #define NLMSG_PUT(skb, pid, seq, type, len) \ | 232 | #define NLMSG_PUT(skb, pid, seq, type, len) \ |
218 | NLMSG_NEW(skb, pid, seq, type, len, 0) | 233 | NLMSG_NEW(skb, pid, seq, type, len, 0) |
219 | 234 | ||
220 | #define NLMSG_NEW_ANSWER(skb, cb, type, len, flags) \ | ||
221 | NLMSG_NEW(skb, NETLINK_CB((cb)->skb).pid, \ | ||
222 | (cb)->nlh->nlmsg_seq, type, len, flags) | ||
223 | |||
224 | #define NLMSG_END(skb, nlh) \ | ||
225 | ({ (nlh)->nlmsg_len = (skb)->tail - (unsigned char *) (nlh); \ | ||
226 | (skb)->len; }) | ||
227 | |||
228 | #define NLMSG_CANCEL(skb, nlh) \ | ||
229 | ({ skb_trim(skb, (unsigned char *) (nlh) - (skb)->data); \ | ||
230 | -1; }) | ||
231 | |||
232 | extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, | 235 | extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, |
233 | struct nlmsghdr *nlh, | 236 | struct nlmsghdr *nlh, |
234 | int (*dump)(struct sk_buff *skb, struct netlink_callback*), | 237 | int (*dump)(struct sk_buff *skb, struct netlink_callback*), |