int main(int argc, char** argv) { if (argc != 2) { puts("Usage: sendpkt <iface>"); exit(1); } int sock = NEWSOCKET(); if (sock < 0) { perror("socket"); exit(1); } int sz = read_upto(0, pkt, sizeof(pkt)); if(sz < 0) { perror("read"); exit(1); } struct sockaddr sa; strncpy(sa.sa_data, argv[1], sizeof(sa.sa_data)); /* device to send it over */ int err = sendto(sock, pkt, sz, 0, &sa, sizeof(sa)); if (err < 0) { perror("sendto"); exit(1); } exit(0); }
CAResult_t CAIPStartServer(const ca_thread_pool_t threadPool) { CAResult_t res = CA_STATUS_OK; if (caglobals.ip.started) { return res; } if (!IPv4MulticastAddress.s_addr) { (void)inet_aton(IPv4_MULTICAST, &IPv4MulticastAddress); (void)inet_pton(AF_INET6, IPv6_MULTICAST_INT, &IPv6MulticastAddressInt); (void)inet_pton(AF_INET6, IPv6_MULTICAST_LNK, &IPv6MulticastAddressLnk); (void)inet_pton(AF_INET6, IPv6_MULTICAST_RLM, &IPv6MulticastAddressRlm); (void)inet_pton(AF_INET6, IPv6_MULTICAST_ADM, &IPv6MulticastAddressAdm); (void)inet_pton(AF_INET6, IPv6_MULTICAST_SIT, &IPv6MulticastAddressSit); (void)inet_pton(AF_INET6, IPv6_MULTICAST_ORG, &IPv6MulticastAddressOrg); (void)inet_pton(AF_INET6, IPv6_MULTICAST_GLB, &IPv6MulticastAddressGlb); } if (!caglobals.ip.ipv6enabled && !caglobals.ip.ipv4enabled) { caglobals.ip.ipv4enabled = true; // only needed to run CA tests } if (caglobals.ip.ipv6enabled) { NEWSOCKET(AF_INET6, u6) NEWSOCKET(AF_INET6, u6s) NEWSOCKET(AF_INET6, m6) NEWSOCKET(AF_INET6, m6s) OIC_LOG_V(INFO, TAG, "IPv6 unicast port: %u", caglobals.ip.u6.port); } if (caglobals.ip.ipv4enabled) { NEWSOCKET(AF_INET, u4) NEWSOCKET(AF_INET, u4s) NEWSOCKET(AF_INET, m4) NEWSOCKET(AF_INET, m4s) OIC_LOG_V(INFO, TAG, "IPv4 unicast port: %u", caglobals.ip.u4.port); } OIC_LOG_V(DEBUG, TAG, "socket summary: u6=%d, u6s=%d, u4=%d, u4s=%d, m6=%d, m6s=%d, m4=%d, m4s=%d", caglobals.ip.u6.fd, caglobals.ip.u6s.fd, caglobals.ip.u4.fd, caglobals.ip.u4s.fd, caglobals.ip.m6.fd, caglobals.ip.m6s.fd, caglobals.ip.m4.fd, caglobals.ip.m4s.fd); // create pipe for fast shutdown CAInitializePipe(); CHECKFD(caglobals.ip.shutdownFds[0]); CHECKFD(caglobals.ip.shutdownFds[1]); // create source of network interface change notifications CAInitializeNetlink(); caglobals.ip.selectTimeout = CAGetPollingInterval(caglobals.ip.selectTimeout); CAApplyInterfaces(); caglobals.ip.terminate = false; res = ca_thread_pool_add_task(threadPool, CAReceiveHandler, NULL); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "thread_pool_add_task failed"); return res; } OIC_LOG(DEBUG, TAG, "CAReceiveHandler thread started successfully."); caglobals.ip.started = true; return CA_STATUS_OK; }
int main(int argc, char** argv) { unsigned long my_ip, my_netmask, my_prefix, network_len, cur_ip; int my_index; struct sockaddr sa; int sock; u_char hwaddr[MAC_ADDR_LEN]; char *ifname, *ifsend, *cindex; char ch; if (argc < 2) { print_usage(usage); } while ((ch = getopt(argc, argv, "d")) != -1) { switch(ch) { case 'd': opt_d = 1; break; case '?': default: goto args; } } args: argc -= optind; argv += optind; if (opt_d && !argc) { print_usage(usage); } // Sockets sock = NEWSOCKET(); ioctl_sock = NEWSOCKET(); // Recv timeout struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 1; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); if ((sock < 0) || (ioctl_sock < 0)) { perror("Unable to create socket"); exit(1); } if (!(ifname = strdup(*argv)) || !(ifsend = strdup(*argv))) die("Cannot duplicate interface name\n"); /* * For an alias interface we use its data but we send * the actual packet on corresponding real interface */ if ((cindex = strchr(ifsend, ':'))) *cindex = '\0'; if (opt_d) { printf("Interface: %s\n", ifname); } sa.sa_family = AF_INET; strcpy(sa.sa_data, ifsend); get_hw_addr(hwaddr, ifname); my_ip = get_ip_addr(ifname); my_netmask = get_ip_mask(ifname); my_index = get_interface_index(ifname); my_prefix = my_ip & my_netmask; network_len = my_netmask ^ 0xffffffff; if (opt_d) { printf("Prefix: %lu\n", my_prefix); printf("Network length: %lu\n", network_len); } for (cur_ip = my_prefix + 1; cur_ip <= my_prefix + network_len; cur_ip++) { if (cur_ip == my_ip) continue; // Skip gratuitous ARP send_arp(sock, my_index, cur_ip, my_ip, hwaddr); detect_sonos(sock); } exit(0); }