diff options
author | Thomas Graf <tgraf@suug.ch> | 2013-11-30 07:21:30 -0500 |
---|---|---|
committer | Jesse Gross <jesse@nicira.com> | 2014-01-06 18:51:53 -0500 |
commit | bb9b18fb55b03477fe5bdd3e97245d6d4d3dee4f (patch) | |
tree | 02d730abd6f31752a842f8c1d9f30d62d185e0b2 /net/netlink/genetlink.c | |
parent | 663efa3696232300a8ad3a46bb10482fc0b861cf (diff) |
genl: Add genlmsg_new_unicast() for unicast message allocation
Allocates a new sk_buff large enough to cover the specified payload
plus required Netlink headers. Will check receiving socket for
memory mapped i/o capability and use it if enabled. Will fall back
to non-mapped skb if message size exceeds the frame size of the ring.
Signed-of-by: Thomas Graf <tgraf@suug.ch>
Reviewed-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: Jesse Gross <jesse@nicira.com>
Diffstat (limited to 'net/netlink/genetlink.c')
-rw-r--r-- | net/netlink/genetlink.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index 4518a57aa5fe..85bf42e2a943 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c | |||
@@ -454,6 +454,26 @@ int genl_unregister_family(struct genl_family *family) | |||
454 | EXPORT_SYMBOL(genl_unregister_family); | 454 | EXPORT_SYMBOL(genl_unregister_family); |
455 | 455 | ||
456 | /** | 456 | /** |
457 | * genlmsg_new_unicast - Allocate generic netlink message for unicast | ||
458 | * @payload: size of the message payload | ||
459 | * @info: information on destination | ||
460 | * @flags: the type of memory to allocate | ||
461 | * | ||
462 | * Allocates a new sk_buff large enough to cover the specified payload | ||
463 | * plus required Netlink headers. Will check receiving socket for | ||
464 | * memory mapped i/o capability and use it if enabled. Will fall back | ||
465 | * to non-mapped skb if message size exceeds the frame size of the ring. | ||
466 | */ | ||
467 | struct sk_buff *genlmsg_new_unicast(size_t payload, struct genl_info *info, | ||
468 | gfp_t flags) | ||
469 | { | ||
470 | size_t len = nlmsg_total_size(genlmsg_total_size(payload)); | ||
471 | |||
472 | return netlink_alloc_skb(info->dst_sk, len, info->snd_portid, flags); | ||
473 | } | ||
474 | EXPORT_SYMBOL_GPL(genlmsg_new_unicast); | ||
475 | |||
476 | /** | ||
457 | * genlmsg_put - Add generic netlink header to netlink message | 477 | * genlmsg_put - Add generic netlink header to netlink message |
458 | * @skb: socket buffer holding the message | 478 | * @skb: socket buffer holding the message |
459 | * @portid: netlink portid the message is addressed to | 479 | * @portid: netlink portid the message is addressed to |
@@ -593,6 +613,7 @@ static int genl_family_rcv_msg(struct genl_family *family, | |||
593 | info.genlhdr = nlmsg_data(nlh); | 613 | info.genlhdr = nlmsg_data(nlh); |
594 | info.userhdr = nlmsg_data(nlh) + GENL_HDRLEN; | 614 | info.userhdr = nlmsg_data(nlh) + GENL_HDRLEN; |
595 | info.attrs = attrbuf; | 615 | info.attrs = attrbuf; |
616 | info.dst_sk = skb->sk; | ||
596 | genl_info_net_set(&info, net); | 617 | genl_info_net_set(&info, net); |
597 | memset(&info.user_ptr, 0, sizeof(info.user_ptr)); | 618 | memset(&info.user_ptr, 0, sizeof(info.user_ptr)); |
598 | 619 | ||