[Click] [PATCH 07/12] FromHost: netdev_ops for linux 2.6.33+

Eddie Kohler kohler at cs.ucla.edu
Wed Sep 29 19:12:47 EDT 2010


Something like this will definitely be necessary, but is dev->netdev_ops 
really private to JUST THIS DEVICE?  It's not shared or anything?

E


On 09/25/2010 10:30 PM, Joonwoo Park wrote:
> Signed-off-by: Joonwoo Park<joonwpark81 at gmail.com>
> ---
>   elements/linuxmodule/fromhost.cc |   17 +++++++++++++++++
>   1 files changed, 17 insertions(+), 0 deletions(-)
>
> diff --git a/elements/linuxmodule/fromhost.cc b/elements/linuxmodule/fromhost.cc
> index 8c26fc5..9062098 100644
> --- a/elements/linuxmodule/fromhost.cc
> +++ b/elements/linuxmodule/fromhost.cc
> @@ -134,12 +134,21 @@ FromHost::new_device(const char *name)
>   #if LINUX_VERSION_CODE<  KERNEL_VERSION(2, 6, 0)
>       setup(dev);
>   #endif
> +#if LINUX_VERSION_CODE<  KERNEL_VERSION(2, 6, 32)
>       dev->open = fl_open;
>       dev->stop = fl_close;
>       dev->hard_start_xmit = fl_tx;
>       dev->get_stats = fl_stats;
>       dev->mtu = _mtu;
>       dev->tx_queue_len = 0;
> +#else
> +    ((struct net_device_ops*)(dev->netdev_ops))->ndo_open = fl_open;
> +    ((struct net_device_ops*)(dev->netdev_ops))->ndo_stop = fl_close;
> +    ((struct net_device_ops*)(dev->netdev_ops))->ndo_start_xmit = fl_tx;
> +    ((struct net_device_ops*)(dev->netdev_ops))->ndo_get_stats = fl_stats;
> +    dev->mtu = _mtu;
> +    dev->tx_queue_len = 0;
> +#endif
>       return dev;
>   }
>
> @@ -175,7 +184,11 @@ FromHost::configure(Vector<String>  &conf, ErrorHandler *errh)
>       // check for existing device
>       _dev = AnyDevice::get_by_name(_devname.c_str());
>       if (_dev) {
> +#if LINUX_VERSION_CODE<  KERNEL_VERSION(2, 6, 32)
>   	if (_dev->open != fl_open) {
> +#else
> +	if (_dev->netdev_ops->ndo_open != fl_open) {
> +#endif
>   	    dev_put(_dev);
>   	    _dev = 0;
>   	    return errh->error("device '%s' already exists", _devname.c_str());
> @@ -410,10 +423,14 @@ FromHost::fl_tx(struct sk_buff *skb, net_device *dev)
>   #if HAVE_SKB_DST_DROP
>   	    skb_dst_drop(skb);
>   #else
> +#if LINUX_VERSION_CODE<  KERNEL_VERSION(2, 6, 35)
>   	    if (skb->dst) {
>   		dst_release(skb->dst);
>   		skb->dst = 0;
>   	    }
> +#else
> +	    dst_release(skb_dst(skb));
> +#endif
>   #endif
>
>   	    Packet *p = Packet::make(skb);


More information about the click mailing list