Hey Antonio,

I've tested this (just test, no code review) in my 2.6.32 qemu (Debian squeeze, 
iproute from wheezy).
It generally loads and batctl if add/del seems to work, but there is something 
weird going on with
bridge interaction. After calling the following 3 commands:

brctl addbr br0
batctl if add eth0
ip link set dev eth0 master br0

I would expect that eth0 moved from bat0 to br0 (or some error is reported). 
But what I see is:

root@debian:~# batctl if
eth0: active
br0: not in use
root@debian:~# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no

Even more weird, after doing batctl if del eth0 or batctl if del br0, I don't 
get any output, but
both devices remain in bat0 (according to batctl if). But I do get some output 
that it's trying
to remove eth0:

[  102.788930] batman_adv: bat0: Interface deactivated: eth0                   
[  102.788935] batman_adv: bat0: Removing interface: eth0                    

Note that I don't have this behaviour on my host machine (3.2.0, Debian 
unstable kernel).

So I can't ack this now, although I don't know if the problem is in this patch, 
in the
current batman-adv/netlink implementation or somewhere in 2.6.32 kernel release.

Cheers,
        Simon


On Sun, Feb 17, 2013 at 03:43:04PM +0100, Antonio Quartulli wrote:
> This patches enable the new rtnl ops to compile on kernels starting from 
> 2.6.32
> 
> Signed-off-by: Antonio Quartulli <or...@autistici.org>
> ---
> 
> Could not be uglier.
> *Compile tested only* because linux-2.6.32 does not compile on my laptop
> 
> 
> 
>  compat.h | 40 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 40 insertions(+)
> 
> diff --git a/compat.h b/compat.h
> index 885e551..de22e2b 100644
> --- a/compat.h
> +++ b/compat.h
> @@ -71,6 +71,9 @@ static inline void batadv_this_cpu_add(uint64_t *count_ptr, 
> size_t count)
>       put_cpu();
>  }
>  
> +#define batadv_softif_destroy_netlink(dev, head) 
> batadv_softif_destroy_netlink(dev)
> +#define unregister_netdevice_queue(dev, head) unregister_netdevice(dev)
> +
>  #endif /* < KERNEL_VERSION(2, 6, 33) */
>  
>  
> @@ -132,6 +135,43 @@ static inline int batadv_param_set_copystring(const char 
> *val,
>  #define kstrtoul strict_strtoul
>  #define kstrtol  strict_strtol
>  
> +#define batadv_softif_slave_add(x, y) \
> +batadv_softif_slave_add(struct net_device *dev, struct ifreq *rq, int cmd)\
> +{\
> +     return 0;\
> +}\
> +static int __batadv_softif_slave_add(x, y)
> +
> +#define batadv_softif_slave_del(x, y) \
> +__batadv_softif_slave_del(struct net_device *dev, struct net_device 
> *slave_dev);\
> +static int batadv_softif_slave_del(struct net_device *dev, struct ifreq *rq, 
> int cmd)\
> +{\
> +     struct batadv_priv *bat_priv = netdev_priv(dev);\
> +     struct net_device *slave_dev;\
> +     int ret;\
> +     if (!capable(CAP_NET_ADMIN))\
> +             return -EPERM;\
> +     slave_dev = dev_get_by_index(&init_net, rq->ifr_ifindex);\
> +     if (!dev)\
> +             return -EINVAL;\
> +     switch(cmd) {\
> +     case SIOCBRADDIF:\
> +             ret = __batadv_softif_slave_add(bat_priv->soft_iface, 
> slave_dev);\
> +     case SIOCBRDELIF:\
> +             ret = __batadv_softif_slave_del(bat_priv->soft_iface, 
> slave_dev);\
> +     default:\
> +             pr_debug("batman-adv does not support ioctl 0x%x\n", cmd);\
> +             return -EOPNOTSUPP;\
> +     }\
> +\
> +     dev_put(slave_dev);\
> +     return ret;\
> +}\
> +static int __batadv_softif_slave_del(x, y)
> +
> +#define ndo_add_slave ndo_do_ioctl
> +#define ndo_del_slave ndo_do_ioctl
> +
>  #endif /* < KERNEL_VERSION(2, 6, 39) */
>  
>  
> -- 
> 1.8.1.2
> 

Attachment: signature.asc
Description: Digital signature

Reply via email to