From patchwork Sun Oct 27 11:03:55 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kristian Evensen X-Patchwork-Id: 286329 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id E6ACA2C00B7 for ; Sun, 27 Oct 2013 22:04:08 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751952Ab3J0LEF (ORCPT ); Sun, 27 Oct 2013 07:04:05 -0400 Received: from mail-la0-f47.google.com ([209.85.215.47]:43009 "EHLO mail-la0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751881Ab3J0LED (ORCPT ); Sun, 27 Oct 2013 07:04:03 -0400 Received: by mail-la0-f47.google.com with SMTP id ep20so4381901lab.34 for ; Sun, 27 Oct 2013 04:04:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=xNyMwTZh8meDxX4/Cz+t8/ZLfPpfCpb3N2D+2wI6Z8A=; b=AAHJREnkVxwsrSf9Xg00Wtn4PtuedFpNWV9JxQbX1D/opssEb+5w2KyPBmkQvZr6F/ H1ssLL+4dO1b4vGOynFCBsCznMhxT/At9Ss4mzj7a6KSrdzKbzRxewzanE/Jdb2me6Yv /6vtDpKAns+Y2FzxtG+jAgB0OeEzJ6oWUQP5N02QxXiS7thJ8YGA13eqKHSlwXCiLAcf BjHQGvLuDsndY0i0de89oqx+Rpv010siR+wO8zqj0/IkdWGjmOjQNXXOmsQn3gPW7reA 1xJZ+15lKFJrq1uPcOz0n3TRv6VGmqXyFBYb6Yp9EB6savg0QX7/hCsFlDBYH4pUWoQ+ G/IA== X-Received: by 10.112.14.3 with SMTP id l3mr7475729lbc.27.1382871842094; Sun, 27 Oct 2013 04:04:02 -0700 (PDT) Received: from armstrong.lyse.net (14.79-160-43.customer.lyse.net. [79.160.43.14]) by mx.google.com with ESMTPSA id u20sm9088157lbh.7.2013.10.27.04.04.00 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 27 Oct 2013 04:04:01 -0700 (PDT) From: Kristian Evensen To: netfilter-devel@vger.kernel.org Cc: Kristian Evensen Subject: [PATCH libmnl] socket: Enable specifying receiver of a netlink messages Date: Sun, 27 Oct 2013 12:03:55 +0100 Message-Id: <1382871835-2491-1-git-send-email-kristian.evensen@gmail.com> X-Mailer: git-send-email 1.8.3.2 Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org From: Kristian Evensen This patch adds the mnl_socket_sendto2()-call, which enables applications to specify the receiving pid/netlink multicast group of a netlink message. This functionality is useful when using Netlink to communicate between application running in userspace, for example over the NETLINK_USERSOCK netlink-family. A new inline function, __mnl_socket_sendto(), sends the data. This function is called by both mnl_socket_sendto() and mnl_socket_sendto2(). Signed-off-by: Kristian Evensen --- include/libmnl/libmnl.h | 2 ++ src/libmnl.map | 1 + src/socket.c | 39 ++++++++++++++++++++++++++++++++++----- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/include/libmnl/libmnl.h b/include/libmnl/libmnl.h index 223709c..f953129 100644 --- a/include/libmnl/libmnl.h +++ b/include/libmnl/libmnl.h @@ -27,6 +27,8 @@ extern int mnl_socket_close(struct mnl_socket *nl); extern int mnl_socket_get_fd(const struct mnl_socket *nl); extern unsigned int mnl_socket_get_portid(const struct mnl_socket *nl); extern ssize_t mnl_socket_sendto(const struct mnl_socket *nl, const void *req, size_t siz); +extern ssize_t mnl_socket_sendto2(const struct mnl_socket *nl, const void *req, size_t siz, + const pid_t pid, const unsigned int group); extern ssize_t mnl_socket_recvfrom(const struct mnl_socket *nl, void *buf, size_t siz); extern int mnl_socket_setsockopt(const struct mnl_socket *nl, int type, void *buf, socklen_t len); extern int mnl_socket_getsockopt(const struct mnl_socket *nl, int type, void *buf, socklen_t *len); diff --git a/src/libmnl.map b/src/libmnl.map index dbc332e..295b160 100644 --- a/src/libmnl.map +++ b/src/libmnl.map @@ -71,4 +71,5 @@ local: *; LIBMNL_1.1 { mnl_attr_parse_payload; + mnl_socket_sendto2; } LIBMNL_1.0; diff --git a/src/socket.c b/src/socket.c index 6d54563..d6236e7 100644 --- a/src/socket.c +++ b/src/socket.c @@ -168,6 +168,19 @@ int mnl_socket_bind(struct mnl_socket *nl, unsigned int groups, pid_t pid) } EXPORT_SYMBOL(mnl_socket_bind); +static inline ssize_t +__mnl_socket_sendto(const struct mnl_socket *nl, const void *buf, size_t len, + const pid_t pid, const unsigned int group) +{ + struct sockaddr_nl snl = { + .nl_family = AF_NETLINK, + .nl_pid = pid, + .nl_groups = group, + }; + return sendto(nl->fd, buf, len, 0, + (struct sockaddr *) &snl, sizeof(snl)); +} + /** * mnl_socket_sendto - send a netlink message of a certain size * \param nl netlink socket obtained via mnl_socket_open() @@ -180,15 +193,31 @@ EXPORT_SYMBOL(mnl_socket_bind); ssize_t mnl_socket_sendto(const struct mnl_socket *nl, const void *buf, size_t len) { - static const struct sockaddr_nl snl = { - .nl_family = AF_NETLINK - }; - return sendto(nl->fd, buf, len, 0, - (struct sockaddr *) &snl, sizeof(snl)); + return __mnl_socket_sendto(nl, buf, len, 0, 0); } EXPORT_SYMBOL(mnl_socket_sendto); /** + * mnl_socket_sendto2 - send a netlink message of a certain size to a given + * receiver. + * \param nl netlink socket obtained via mnl_socket_open() + * \param buf buffer containing the netlink message to be sent + * \param len number of bytes in the buffer that you want to send + * \param pid pid to send message to + * \param group netlink multicast group to send message to + * + * On error, it returns -1 and errno is appropriately set. Otherwise, it + * returns the number of bytes sent. + */ +ssize_t +mnl_socket_sendto2(const struct mnl_socket *nl, const void *buf, size_t len, + const pid_t pid, const unsigned int group) +{ + return __mnl_socket_sendto(nl, buf, len, pid, group); +} +EXPORT_SYMBOL(mnl_socket_sendto2); + +/** * mnl_socket_recvfrom - receive a netlink message * \param nl netlink socket obtained via mnl_socket_open() * \param buf buffer that you want to use to store the netlink message