• I
    add vif using local interface index instead of IP · ee5e81f0
    Ilia K 提交于
    When routing daemon wants to enable forwarding of multicast traffic it
    performs something like:
    
           struct vifctl vc = {
                   .vifc_vifi  = 1,
                   .vifc_flags = 0,
                   .vifc_threshold = 1,
                   .vifc_rate_limit = 0,
                   .vifc_lcl_addr = ip, /* <--- ip address of physical
    interface, e.g. eth0 */
                   .vifc_rmt_addr.s_addr = htonl(INADDR_ANY),
             };
           setsockopt(fd, IPPROTO_IP, MRT_ADD_VIF, &vc, sizeof(vc));
    
    This leads (in the kernel) to calling  vif_add() function call which
    search the (physical) device using assigned IP address:
           dev = ip_dev_find(net, vifc->vifc_lcl_addr.s_addr);
    
    The current API (struct vifctl) does not allow to specify an
    interface other way than using it's IP, and if there are more than a
    single interface with specified IP only the first one will be found.
    
    The attached patch (against 2.6.30.4) allows to specify an interface
    by its index, instead of IP address:
    
           struct vifctl vc = {
                   .vifc_vifi  = 1,
                   .vifc_flags = VIFF_USE_IFINDEX,   /* NEW */
                   .vifc_threshold = 1,
                   .vifc_rate_limit = 0,
                   .vifc_lcl_ifindex = if_nametoindex("eth0"),   /* NEW */
                   .vifc_rmt_addr.s_addr = htonl(INADDR_ANY),
             };
           setsockopt(fd, IPPROTO_IP, MRT_ADD_VIF, &vc, sizeof(vc));
    Signed-off-by: NIlia K. <mail4ilia@gmail.com>
    
    === modified file 'include/linux/mroute.h'
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    ee5e81f0
ipmr.c 46.4 KB