#include #include #include #include #include #include #include #include #include void die(const char *s) { perror(s); exit(1); } int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); } int sock = socket(AF_INET, SOCK_RAW, IPPROTO_IGMP); if (sock < 0) { die("socket"); } if (setsockopt(sock, IPPROTO_IP, MRT_INIT, &(int){1}, sizeof(int)) < 0) { die("setsockopt MRT_INIT"); } struct vifctl vc_in; memset(&vc_in, 0, sizeof(vc_in)); vc_in.vifc_vifi = 0; vc_in.vifc_flags = VIFF_USE_IFINDEX; vc_in.vifc_lcl_ifindex = atoi(argv[1]); if (setsockopt(sock, IPPROTO_IP, MRT_ADD_VIF, &vc_in, sizeof(vc_in)) < 0) { die("setsockopt MRT_ADD_VIF 0"); } struct vifctl vc_out; memset(&vc_out, 0, sizeof(vc_out)); vc_out.vifc_vifi = 1; vc_out.vifc_flags = VIFF_USE_IFINDEX; vc_out.vifc_lcl_ifindex = atoi(argv[2]); if (setsockopt(sock, IPPROTO_IP, MRT_ADD_VIF, &vc_out, sizeof(vc_out)) < 0) { die("setsockopt MRT_ADD_VIF 1"); } struct mfcctl mfc; memset(&mfc, 0, sizeof(mfc)); mfc.mfcc_origin.s_addr = inet_addr("192.168.1.1"); mfc.mfcc_mcastgrp.s_addr = inet_addr("239.1.2.3"); mfc.mfcc_parent = 0; mfc.mfcc_ttls[1] = 1; if (setsockopt(sock, IPPROTO_IP, MRT_ADD_MFC, &mfc, sizeof(mfc)) < 0) { die("setsockopt MRT_ADD_MFC"); } printf("[C Tool] SUCCESS: VIFs and MFC entry added. Holding for 10s...\n"); sleep(10); if (setsockopt(sock, IPPROTO_IP, MRT_DEL_MFC, &mfc, sizeof(mfc)) < 0) { die("setsockopt MRT_DEL_MFC"); } if (setsockopt(sock, IPPROTO_IP, MRT_DEL_VIF, &vc_in, sizeof(vc_in)) < 0) { die("setsockopt MRT_DEL_VIF 0"); } if (setsockopt(sock, IPPROTO_IP, MRT_DEL_VIF, &vc_out, sizeof(vc_out)) < 0) { die("setsockopt MRT_DEL_VIF 1"); } if (setsockopt(sock, IPPROTO_IP, MRT_DONE, NULL, 0) < 0) { die("setsockopt MRT_DONE"); } close(sock); return 0; }