/* * Class: cbccore_low_Create * Method: create_passive * Signature: ()V */ JNIEXPORT void JNICALL Java_cbccore_low_Create_create_1passive(JNIEnv *env, jobject obj) { #ifdef CBC create_passive(); #else printf("Java_cbccore_low_Create_create_1passive stub\n"); #endif }
int main (int argc, char **argv) { int ch; char *progname = argv[0]; #define MIN_INTERFACES 1 #define MAX_INTERFACES 64 struct interface_config interfaces[MAX_INTERFACES]; #define MIN_SERVERS 1 #define MAX_SERVERS 64 struct server_config servers[MAX_SERVERS]; int num_interfaces = 0; int num_servers = 0; int interface_server_count = 0; int verbose = 0; int stats = 0; int tcp_stats_assigned = 0; unsigned int i; int error; struct uinet_in_addr tmpinaddr; int ifnetmap_count = 0; int ifpcap_count = 0; struct content_type *contype; memset(interfaces, 0, sizeof(interfaces)); memset(servers, 0, sizeof(servers)); for (i = 0; i < MAX_INTERFACES; i++) { interfaces[i].type = UINET_IFTYPE_NETMAP; } for (i = 0; i < MAX_SERVERS; i++) { servers[i].listen_port = -1; } while ((ch = getopt(argc, argv, "c:ehi:l:Pp:st:v")) != -1) { switch (ch) { case 'c': #ifdef ENABLE_EXTRACT if (0 == interface_server_count) { printf("No listen address specified\n"); return (1); } else if (MAX_CONTENT_TYPES == servers[num_servers - 1].num_content_types) { printf("Maximum number of content types per server is %u\n", MAX_CONTENT_TYPES); return (1); } else { contype = find_content_type(optarg, known_content_types); if (NULL == contype) { printf("Unknown content type %s\n", optarg); return (1); } servers[num_servers - 1].extract = 1; servers[num_servers - 1].content_types[servers[num_servers - 1].num_content_types] = contype; servers[num_servers - 1].num_content_types++; } #else printf("Extract mode not supported.\n"); return(1); #endif break; case 'e': #ifdef ENABLE_EXTRACT if (0 == num_interfaces) { printf("No interface specified\n"); return (1); } else { servers[num_servers - 1].extract = 1; } #else printf("Extract mode not supported.\n"); return(1); #endif break; case 'h': usage(progname); return (0); case 'i': if (MAX_INTERFACES == num_interfaces) { printf("Maximum number of interfaces is %u\n", MAX_INTERFACES); return (1); } else { interfaces[num_interfaces].ifname = optarg; interfaces[num_interfaces].cdom = num_interfaces + 1; num_interfaces++; interface_server_count = 0; } break; case 'l': if (0 == num_interfaces) { printf("No interface specified\n"); return (1); } else if (MAX_SERVERS == num_servers) { printf("Maximum number of servers is %u\n", MAX_SERVERS); return (1); } else { servers[num_servers].listen_addr = optarg; servers[num_servers].interface = &interfaces[num_interfaces - 1]; num_servers++; interface_server_count++; } break; case 'P': if (0 == num_interfaces) { printf("No interface specified\n"); return (1); } else { interfaces[num_interfaces - 1].promisc = 1; } break; case 'p': if (0 == interface_server_count) { printf("No listen address specified\n"); return (1); } else { servers[num_servers - 1].listen_port = strtoul(optarg, NULL, 10); } break; case 's': if (0 == num_interfaces) { printf("No interface specified\n"); return (1); } else { interfaces[num_interfaces - 1].stats = 1; } break; case 't': if (0 == num_interfaces) { printf("No interface specified\n"); return (1); } else if (0 == strcmp(optarg, "netmap")) { interfaces[num_interfaces - 1].type = UINET_IFTYPE_NETMAP; } else if (0 == strcmp(optarg, "pcap")) { interfaces[num_interfaces - 1].type = UINET_IFTYPE_PCAP; } else { printf("Unknown interface type %s\n", optarg); return (1); } break; case 'v': verbose++; break; default: printf("Unknown option \"%c\"\n", ch); case '?': usage(progname); return (1); } } argc -= optind; argv += optind; if (num_interfaces < MIN_INTERFACES) { printf("Specify at least %u interface%s\n", MIN_INTERFACES, MIN_INTERFACES == 1 ? "" : "s"); return (1); } if (num_servers < MIN_SERVERS) { printf("Specify at least %u listen address%s\n", MIN_SERVERS, MIN_SERVERS == 1 ? "" : "es"); return (1); } for (i = 0; i < num_servers; i++) { if (-1 == servers[i].listen_port) { printf("No listen port specified for interface %s, listen address %s\n", servers[i].interface->ifname, servers[i].listen_addr); return (1); } if (servers[i].listen_port < 0 || servers[i].listen_port > 65535) { printf("Listen port for interface %s, listen address %s is out of range [0, 65535]\n", servers[i].interface->ifname, servers[i].listen_addr); return (1); } if (0 == servers[i].listen_port) servers[i].interface->promisc = 1; if (uinet_inet_pton(UINET_AF_INET, servers[i].listen_addr, &tmpinaddr) <= 0) { printf("%s is not a valid listen address\n", servers[i].listen_addr); return (1); } if (tmpinaddr.s_addr == UINET_INADDR_ANY) { servers[i].addrany = 1; servers[i].interface->promisc = 1; } } uinet_init(1, 128*1024, 0); uinet_install_sighandlers(); for (i = 0; i < num_interfaces; i++) { switch (interfaces[i].type) { case UINET_IFTYPE_NETMAP: interfaces[i].alias_prefix = "netmap"; interfaces[i].instance = ifnetmap_count; ifnetmap_count++; break; case UINET_IFTYPE_PCAP: interfaces[i].alias_prefix = "pcap"; interfaces[i].instance = ifpcap_count; ifpcap_count++; break; default: printf("Unknown interface type %d\n", interfaces[i].type); return (1); break; } if (interfaces[i].stats && !tcp_stats_assigned) { interfaces[i].do_tcpstats = 1; tcp_stats_assigned = 1; } snprintf(interfaces[i].alias, UINET_IF_NAMESIZE, "%s%d", interfaces[i].alias_prefix, interfaces[i].instance); if (verbose) { printf("Creating interface %s, Promiscuous INET %s, cdom=%u\n", interfaces[i].alias, interfaces[i].promisc ? "enabled" : "disabled", interfaces[i].promisc ? interfaces[i].cdom : 0); } error = uinet_ifcreate(interfaces[i].type, interfaces[i].ifname, interfaces[i].alias, interfaces[i].promisc ? interfaces[i].cdom : 0, 0, NULL); if (0 != error) { printf("Failed to create interface %s (%d)\n", interfaces[i].alias, error); } interfaces[i].loop = ev_loop_new(EVFLAG_AUTO); if (NULL == interfaces[i].loop) { printf("Failed to create event loop interface %s\n", interfaces[i].alias); break; } } for (i = 0; i < num_servers; i++) { if (!servers[i].addrany) { if (verbose) { printf("Adding address %s to interface %s\n", servers[i].listen_addr, servers[i].interface->alias); } error = uinet_interface_add_alias(servers[i].interface->alias, servers[i].listen_addr, "", ""); if (error) { printf("Adding alias %s to interface %s failed (%d)\n", servers[i].listen_addr, servers[i].interface->alias, error); } } } for (i = 0; i < num_servers; i++) { if (verbose) { printf("Creating passive server at %s:%d on interface %s\n", servers[i].listen_addr, servers[i].listen_port, servers[i].interface->alias); } servers[i].verbose = verbose; servers[i].passive = create_passive(servers[i].interface->loop, &servers[i]); if (NULL == servers[i].passive) { printf("Failed to create passive server at %s:%d on interface %s\n", servers[i].listen_addr, servers[i].listen_port, servers[i].interface->alias); break; } } for (i = 0; i < num_interfaces; i++) { if (verbose) { printf("Bringing up interface %s\n", interfaces[i].alias); } error = uinet_interface_up(interfaces[i].alias, 1, interfaces[i].promisc); if (0 != error) { printf("Failed to bring up interface %s (%d)\n", interfaces[i].alias, error); } if (verbose) printf("Creating interface thread for interface %s\n", interfaces[i].alias); interfaces[i].thread_create_result = pthread_create(&interfaces[i].thread, NULL, interface_thread_start, &interfaces[i]); } for (i = 0; i < num_interfaces; i++) { if (0 == interfaces[i].thread_create_result) pthread_join(interfaces[i].thread, NULL); } uinet_shutdown(0); return (0); }