From patchwork Sat Dec 7 15:14:28 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ken-ichirou MATSUZAWA X-Patchwork-Id: 298693 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 0310E2C00C7 for ; Sun, 8 Dec 2013 02:14:43 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755087Ab3LGPOm (ORCPT ); Sat, 7 Dec 2013 10:14:42 -0500 Received: from mail-pd0-f181.google.com ([209.85.192.181]:61120 "EHLO mail-pd0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754859Ab3LGPOl (ORCPT ); Sat, 7 Dec 2013 10:14:41 -0500 Received: by mail-pd0-f181.google.com with SMTP id p10so2615567pdj.12 for ; Sat, 07 Dec 2013 07:14:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:message-id:from:to:subject:user-agent:mime-version :content-type; bh=5jmr08hf1/FAd0zak70w51NbSXSrKtL3ArRINP5LaYI=; b=u20m5B/YKkuwTPe62j6Hje0WsPFBBgBxoUa63nWhbCNhIETF1jdgceufkaRD20vdKy mOGLq+tKRYpWWhkXEZ5C3DpGgqIU2RJfXrkwRI0QgXOZOTF9QvmSlBGPItDDIF5oFw2Q hWggou7OxVk2nN+gYb0PLLitlDKPmdXox3nKcTfige3nid8K3QOs5B4tpiBTw2nbbLws DFAqzVhMctPfn81INCLXyjgUT3AkrTX30MmoW/X4nzeDJyHdGm2PoXGDJJy9VSY2aIh3 yocCPhQZ83EP4rC+99zBZQroOFrzuHcB/vL14qrChgtnShtM2xfyxtY64G7oYfJ3RRjP P2mg== X-Received: by 10.66.158.132 with SMTP id wu4mr10738684pab.66.1386429281568; Sat, 07 Dec 2013 07:14:41 -0800 (PST) Received: from milth.gmail.com (KD106159154146.ppp-bb.dion.ne.jp. [106.159.154.146]) by mx.google.com with ESMTPSA id bh6sm6972483pad.20.2013.12.07.07.14.38 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 07 Dec 2013 07:14:41 -0800 (PST) Date: Sun, 08 Dec 2013 00:14:28 +0900 Message-ID: <87lhzw8zhn.wl%chamaken@gmail.com> From: Ken-ichirou MATSUZAWA To: Pablo Neira Ayuso , netfilter-devel@vger.kernel.org Subject: [libmnl PATCH 6/9] mmap: add more helper - nonmin2 User-Agent: Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (=?ISO-2022-JP-2?B?R29qGyQoRCtXGyhC?=) APEL/10.8 Emacs/23.4 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Sender: netfilter-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netfilter-devel@vger.kernel.org added to not handle struct nl_mmap_hdr * mnl_ring_build_frame introduce new callback which takes buf to build nlmsghdr * mnl_ring_parse_frame2 * mnl_ring_parse_frame wrap cb_run Signed-off-by: Ken-ichirou MATSUZAWA --- include/libmnl/libmnl.h | 10 +++++++ src/libmnl.map | 3 +++ src/mmap.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) diff --git a/include/libmnl/libmnl.h b/include/libmnl/libmnl.h index a8991ce..722cb79 100644 --- a/include/libmnl/libmnl.h +++ b/include/libmnl/libmnl.h @@ -229,6 +229,16 @@ extern int mnl_ring_poll(const struct mnl_ring_socket *nlm, int timeout); extern struct nl_mmap_hdr *mnl_ring_poll_rxframe(struct mnl_ring_socket *nlm); extern int mnl_ring_discard_frames(struct mnl_ring_socket *nlm, enum mnl_ring_types type); +/* non-minimalistic 2 [nonmin2] */ +/* nlmsghdr building callback which returns buffer len */ +typedef int (*mnl_ring_build_t)(void *buf, void *data); +extern int mnl_ring_build_frame(struct mnl_ring_socket *nlm, mnl_ring_build_t cb, void *data); +extern int mnl_ring_parse_frame2(struct mnl_ring_socket *nlm, unsigned int seq, unsigned int portid, + mnl_cb_t cb, void *data, + mnl_cb_t *cb_ctl_array, unsigned int cb_ctl_array_len); +extern int mnl_ring_parse_frame(struct mnl_ring_socket *nlm, unsigned int seq, unsigned int portid, + mnl_cb_t cb, void *data); + /* * other declarations */ diff --git a/src/libmnl.map b/src/libmnl.map index 2a36a5c..d329988 100644 --- a/src/libmnl.map +++ b/src/libmnl.map @@ -82,4 +82,7 @@ LIBMNL_1.2 { mnl_ring_poll; mnl_ring_poll_rxframe; mnl_ring_discard_frames; + mnl_ring_build_frame; + mnl_ring_parse_frame2; + mnl_ring_parse_frame; } LIBMNL_1.1; diff --git a/src/mmap.c b/src/mmap.c index 78fbb1f..6a3af5a 100644 --- a/src/mmap.c +++ b/src/mmap.c @@ -384,3 +384,73 @@ int mnl_ring_discard_frames(struct mnl_ring_socket *nlm, enum mnl_ring_types typ return 1; } EXPORT_SYMBOL(mnl_ring_discard_frames); + +/**** + * non-minimalistic 2 [nonmin2] + ****/ + +/** + * mnl_ring_build_frame - build tx frame using callback + * \param nlm ring descriptor + * \param cb frame building function + * \param data passing to cb + * + * shoud advance ring or not? + * cb receive tx frame pointer for nlmsghdr and should return whole nlmsgs + * length. Users do not need take care of struct nl_mmap_hdr + */ +int mnl_ring_build_frame(struct mnl_ring_socket *nlm, mnl_ring_build_t cb, void *data) { + struct nl_mmap_hdr *hdr; + int ret; + + hdr = mnl_ring_get_frame(nlm, MNL_RING_TX); + if (hdr == NULL) + return -1; + + ret = cb(MNL_MMAP_MSGHDR(hdr), data); + if (ret <= 0) + return ret; + hdr->nm_len = ret; + hdr->nm_status = NL_MMAP_STATUS_VALID; + /* mnl_ring_advance(nlm, MNL_RING_TX); */ + + return ret; +} +EXPORT_SYMBOL(mnl_ring_build_frame); + +/** + * mnl_ring_parse_frame2 + * + * advance ring. + * Just wrapping mnl_cb_run2 to let users not take care of + * struct nl_mmap_hdr + */ +int mnl_ring_parse_frame2(struct mnl_ring_socket *nlm, unsigned int seq, + unsigned int portid, mnl_cb_t cb, void *data, + mnl_cb_t *cb_ctl_array, unsigned int cb_ctl_array_len) +{ + struct nl_mmap_hdr *hdr; + int ret; + + hdr = mnl_ring_poll_rxframe(nlm); + if (hdr == NULL) + return MNL_CB_ERROR; + + ret = mnl_cb_run2(MNL_MMAP_MSGHDR(hdr), hdr->nm_len, seq, portid, + cb, data, cb_ctl_array, cb_ctl_array_len); + hdr->nm_status = NL_MMAP_STATUS_UNUSED; + mnl_ring_advance(nlm, MNL_RING_RX); + + return ret; +} +EXPORT_SYMBOL(mnl_ring_parse_frame2); + +/** + * mnl_ring_parse_frame + */ +int mnl_ring_parse_frame(struct mnl_ring_socket *nlm, unsigned int seq, unsigned int portid, + mnl_cb_t cb, void *data) +{ + return mnl_ring_parse_frame2(nlm, seq, portid, cb, data, NULL, 0); +} +EXPORT_SYMBOL(mnl_ring_parse_frame);