#include #include #include #include #define _LINUX_IN_H #include #include #include #include #include #include #include #define XE(y, x) do { errno = 0; if (x) { \ int __e = errno; \ fprintf(stderr, "(%03d) %s [%d] %s\n", \ __LINE__, #x, __e, strerror(__e)); \ if (y) return 2; \ } \ } while (0); #define E(x) XE(1,x) #define W(x) XE(0,x) struct vifctln { vifi_t vifc_vifi; /* Index of VIF */ unsigned char vifc_flags; /* VIFF_ flags */ unsigned char vifc_threshold; /* ttl limit */ unsigned int vifc_rate_limit; /* Rate limiter values (NI) */ struct in_addr vifc_lcl_addr; /* Our address */ struct in_addr vifc_rmt_addr; /* IPIP tunnel addr */ int vifc_ifindex; /* Index of real Interface */ }; int main(int argc, char **argv) { int igmp_socket; struct vifctl vc; struct vifctln vcn; struct in_addr addr; char buf[IFNAMSIZ]; int ifi; int p = 1; if (argc != 3) { fprintf(stderr, "Syntax: %s \n" "where is some existing interface,\n" "\tif possible with MULTICAST in its flags\n" "and is a local address on that interface\n", argv[0]); return 1; } ifi = if_nametoindex(argv[1]); if (ifi <= 0) { fprintf(stderr, "invalid interface %s\n", argv[1]); return 1; } addr.s_addr = inet_addr(argv[2]); if (!addr.s_addr) { fprintf(stderr, "invalid address %s\n", argv[2]); return 1; } printf("using %s<%d> - %s\n", if_indextoname(ifi, buf), ifi, inet_ntoa(addr)); printf("multicast routing support - general: "); E((igmp_socket = socket(AF_INET, SOCK_RAW, IPPROTO_IGMP)) == -1); E(setsockopt(igmp_socket, SOL_IP, MRT_INIT, &p, sizeof(p))); printf("\033[32;1mOK.\033[m\n"); printf("multicast routing support - withOUT interface indici: "); memset(&vc, 0, sizeof(vc)); vc.vifc_vifi = 0; vc.vifc_threshold = 1; vc.vifc_rate_limit = 5; vc.vifc_lcl_addr = addr; E(setsockopt(igmp_socket, IPPROTO_IP, MRT_ADD_VIF, &vc, sizeof(vc))); printf("\033[32;1mOK.\033[m\n"); memset(&vc, 0, sizeof(vc)); vc.vifc_vifi = 0; vc.vifc_lcl_addr = addr; W(setsockopt(igmp_socket, IPPROTO_IP, MRT_DEL_VIF, &vc, sizeof(vc))); printf("multicast routing support - with interface indici: "); memset(&vcn, 0, sizeof(vcn)); vcn.vifc_vifi = 0; vcn.vifc_threshold = 1; vcn.vifc_rate_limit = 5; vcn.vifc_lcl_addr = addr; vcn.vifc_ifindex = ifi; E(setsockopt(igmp_socket, IPPROTO_IP, MRT_ADD_VIF, &vcn, sizeof(vcn))); printf("\033[32;1mOK.\033[m\n"); memset(&vcn, 0, sizeof(vcn)); vcn.vifc_vifi = 0; vcn.vifc_lcl_addr = addr; vcn.vifc_ifindex = ifi; W(setsockopt(igmp_socket, IPPROTO_IP, MRT_DEL_VIF, &vcn, sizeof(vcn))); E(setsockopt(igmp_socket, SOL_IP, MRT_DONE, NULL, 0)); close(igmp_socket); printf("Perfect, everything working!\n"); return 0; }