From patchwork Mon Mar 7 20:01:15 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Nicolas_de_Peslo=C3=BCan?= X-Patchwork-Id: 85793 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 81FD5B70F7 for ; Tue, 8 Mar 2011 07:01:39 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755744Ab1CGUBe (ORCPT ); Mon, 7 Mar 2011 15:01:34 -0500 Received: from smtp6-g21.free.fr ([212.27.42.6]:33468 "EHLO smtp6-g21.free.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755274Ab1CGUBe (ORCPT ); Mon, 7 Mar 2011 15:01:34 -0500 Received: from localhost.localdomain (unknown [88.175.177.37]) by smtp6-g21.free.fr (Postfix) with ESMTP id 6BF4682406; Mon, 7 Mar 2011 21:01:25 +0100 (CET) From: =?UTF-8?q?Nicolas=20de=20Peslo=C3=BCan?= To: netdev@vger.kernel.org Cc: davem@davemloft.net, shemminger@vyatta.com, eric.dumazet@gmail.com, kaber@trash.net, fubar@us.ibm.com, andy@greyhouse.net, =?UTF-8?q?Nicolas=20de=20Peslo=C3=BCan?= Subject: [PATCH net-next-2.6 V2] net: enhance the documentation for rx_handler. Date: Mon, 7 Mar 2011 21:01:15 +0100 Message-Id: <1299528076-28527-1-git-send-email-nicolas.2p.debian@free.fr> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <20110307083607.3299ed0c@nehalam> References: <20110307083607.3299ed0c@nehalam> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Signed-off-by: Nicolas de Pesloüan Reviewed-by: Jiri Pirko --- This apply on top of Jiri's last patch serie, including the last one that commented the RX_HANDLER_* values. include/linux/netdevice.h | 53 ++++++++++++++++++++++++++++++++++++++------ net/core/dev.c | 2 + 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 26e03f9..0c9dc93 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -390,15 +390,52 @@ enum gro_result { }; typedef enum gro_result gro_result_t; +/** + * enum rx_handler_result - Possible return values for rx_handlers. + * @RX_HANDLER_CONSUMED: skb was consumed by rx_handler, do not process it + * further. + * @RX_HANDLER_ANOTHER: Do another round in receive path. This is indicated in + * case skb->dev was changed by rx_handler. + * @RX_HANDLER_EXACT: Force exact delivery, no wildcard. + * @RX_HANDLER_PASS: Do nothing, process the skb as if no rx_handler was called. + * + * rx_handlers are functions called from inside __netif_receive_skb(), to do + * special processing of the skb, prior to delivery to protocol handlers. + * + * Currently, a net_device can only have a single rx_handler registered. Trying + * to register a second rx_handler will return -EBUSY. + * + * To register a rx_handler on a net_device, use netdev_rx_handler_register(). + * To unregister a rx_handler on a net_device, use + * netdev_rx_handler_unregister(). + * + * Upon return, rx_handler is expected to tell __netif_receive_skb() what to + * do with the skb. + * + * If the rx_handler consumed to skb in some way, it should return + * RX_HANDLER_CONSUMED. This is appropriate when the rx_handler arranged for + * the skb to be delivered in some other ways. + * + * If the rx_handler changed skb->dev, to divert the skb to another + * net_device, it should return RX_HANDLER_ANOTHER. The rx_handler for the + * new device will be called if it exists. + * + * If the rx_handler consider the skb should be ignored, it should return + * RX_HANDLER_EXACT. The skb will only be delivered to protocol handlers that + * are registred on exact device (ptype->dev == skb->dev). + * + * If the rx_handler didn't changed skb->dev, but want the skb to be normally + * delivered, it should return RX_HANDLER_PASS. + * + * A device without a registered rx_handler will behave as if rx_handler + * returned RX_HANDLER_PASS. + */ + enum rx_handler_result { - RX_HANDLER_CONSUMED, /* skb was consumed by rx_handler, - do not process it further. */ - RX_HANDLER_ANOTHER, /* Do another round in receive path. - This is indicated in case skb->dev - was changed by rx_handler */ - RX_HANDLER_EXACT, /* Force exact delivery, no wildcard */ - RX_HANDLER_PASS, /* Do nothing, pass the skb as if - no rx_handler was called */ + RX_HANDLER_CONSUMED, + RX_HANDLER_ANOTHER, + RX_HANDLER_EXACT, + RX_HANDLER_PASS, }; typedef enum rx_handler_result rx_handler_result_t; typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb); diff --git a/net/core/dev.c b/net/core/dev.c index a368223..3630722 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3060,6 +3060,8 @@ out: * on a failure. * * The caller must hold the rtnl_mutex. + * + * For a general description of rx_handler, see enum rx_handler_result. */ int netdev_rx_handler_register(struct net_device *dev, rx_handler_func_t *rx_handler,