lkml.org 
[lkml]   [2010]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v15 11/17] Add a hook to intercept external buffers from NIC driver.
    Date
    From: Xin Xiaohui <xiaohui.xin@intel.com>

    The hook is called in __netif_receive_skb().

    Signed-off-by: Xin Xiaohui <xiaohui.xin@intel.com>
    Signed-off-by: Zhao Yu <yzhao81new@gmail.com>
    Reviewed-by: Jeff Dike <jdike@linux.intel.com>
    ---
    net/core/dev.c | 40 ++++++++++++++++++++++++++++++++++++++++
    1 files changed, 40 insertions(+), 0 deletions(-)

    diff --git a/net/core/dev.c b/net/core/dev.c
    index 84fbb83..bdad1c8 100644
    --- a/net/core/dev.c
    +++ b/net/core/dev.c
    @@ -2814,6 +2814,40 @@ int __skb_bond_should_drop(struct sk_buff *skb, struct net_device *master)
    }
    EXPORT_SYMBOL(__skb_bond_should_drop);

    +#if defined(CONFIG_MEDIATE_PASSTHRU) || defined(CONFIG_MEDIATE_PASSTHRU_MODULE)
    +/* Add a hook to intercept mediate passthru(zero-copy) packets,
    + * and insert it to the socket queue owned by mp_port specially.
    + */
    +static inline struct sk_buff *handle_mpassthru(struct sk_buff *skb,
    + struct packet_type **pt_prev,
    + int *ret,
    + struct net_device *orig_dev)
    +{
    + struct mp_port *mp_port = NULL;
    + struct sock *sk = NULL;
    +
    + if (!dev_is_mpassthru(skb->dev) && !dev_is_mpassthru(orig_dev))
    + return skb;
    + if (dev_is_mpassthru(skb->dev))
    + mp_port = skb->dev->mp_port;
    + else if (orig_dev->master == skb->dev && dev_is_mpassthru(orig_dev))
    + mp_port = orig_dev->mp_port;
    +
    + if (*pt_prev) {
    + *ret = deliver_skb(skb, *pt_prev, orig_dev);
    + *pt_prev = NULL;
    + }
    +
    + sk = mp_port->sock->sk;
    + skb_queue_tail(&sk->sk_receive_queue, skb);
    + sk->sk_state_change(sk);
    +
    + return NULL;
    +}
    +#else
    +#define handle_mpassthru(skb, pt_prev, ret, orig_dev) (skb)
    +#endif
    +
    static int __netif_receive_skb(struct sk_buff *skb)
    {
    struct packet_type *ptype, *pt_prev;
    @@ -2891,6 +2925,11 @@ static int __netif_receive_skb(struct sk_buff *skb)
    ncls:
    #endif

    + /* To intercept mediate passthru(zero-copy) packets here */
    + skb = handle_mpassthru(skb, &pt_prev, &ret, orig_dev);
    + if (!skb)
    + goto out;
    +
    /* Handle special case of bridge or macvlan */
    rx_handler = rcu_dereference(skb->dev->rx_handler);
    if (rx_handler) {
    @@ -2983,6 +3022,7 @@ err:
    EXPORT_SYMBOL(netdev_mp_port_prep);
    #endif

    +
    /**
    * netif_receive_skb - process receive buffer from network
    * @skb: buffer to process
    --
    1.7.3


    \
     
     \ /
      Last update: 2010-11-09 09:47    [W:0.029 / U:209.976 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site