int main(int argc, char **argv) { int ch, mode = 0; char *arg = NULL; pid = getpid(); thiszone = gmt2local(0); while ((ch = getopt(argc, argv, "acd:f:Ii:nprstA:HPR")) != -1) switch (ch) { case 'a': case 'c': case 'p': case 'r': case 'H': case 'P': case 'R': case 's': case 'I': if (mode) { usage(); /*NOTREACHED*/ } mode = ch; arg = NULL; break; case 'f': exit(file(optarg) ? 1 : 0); case 'd': case 'i': if (mode) { usage(); /*NOTREACHED*/ } mode = ch; arg = optarg; break; case 'n': nflag = 1; break; case 't': tflag = 1; break; case 'A': if (mode) { usage(); /*NOTREACHED*/ } mode = 'a'; repeat = atoi(optarg); if (repeat < 0) { usage(); /*NOTREACHED*/ } break; default: usage(); } argc -= optind; argv += optind; switch (mode) { case 'a': case 'c': if (argc != 0) { usage(); /*NOTREACHED*/ } dump(0, mode == 'c'); break; case 'd': if (argc != 0) { usage(); /*NOTREACHED*/ } delete(arg); break; case 'I': #ifdef SIOCSDEFIFACE_IN6 /* XXX: check SIOCGDEFIFACE_IN6 as well? */ if (argc > 1) { usage(); /*NOTREACHED*/ } else if (argc == 1) { if (strcmp(*argv, "delete") == 0 || if_nametoindex(*argv)) setdefif(*argv); else errx(1, "invalid interface %s", *argv); } getdefif(); /* always call it to print the result */ break; #else errx(1, "not supported yet"); /*NOTREACHED*/ #endif case 'p': if (argc != 0) { usage(); /*NOTREACHED*/ } plist(); break; case 'i': ifinfo(arg, argc, argv); break; case 'r': if (argc != 0) { usage(); /*NOTREACHED*/ } rtrlist(); break; case 's': if (argc < 2 || argc > 4) usage(); exit(set(argc, argv) ? 1 : 0); case 'H': if (argc != 0) { usage(); /*NOTREACHED*/ } harmonize_rtr(); break; case 'P': if (argc != 0) { usage(); /*NOTREACHED*/ } pfx_flush(); break; case 'R': if (argc != 0) { usage(); /*NOTREACHED*/ } rtr_flush(); break; case 0: if (argc != 1) { usage(); /*NOTREACHED*/ } get(argv[0]); break; } exit(0); }
int main(int argc, char **argv) { int ch; int aflag = 0, dflag = 0, sflag = 0, Hflag = 0, pflag = 0, rflag = 0, Pflag = 0, Rflag = 0; pid = getpid(); thiszone = gmt2local(0); while ((ch = getopt(argc, argv, "acndfIilprstA:HPR")) != -1) switch ((char)ch) { case 'a': aflag = 1; break; case 'c': cflag = 1; break; case 'd': dflag = 1; break; case 'I': #ifdef SIOCSDEFIFACE_IN6 /* XXX: check SIOCGDEFIFACE_IN6 as well? */ if (argc > 2) setdefif(argv[2]); getdefif(); /* always call it to print the result */ exit(0); #else errx(1, "not supported yet"); /*NOTREACHED*/ #endif case 'i' : argc -= optind; argv += optind; if (argc < 1) usage(); ifinfo(argc, argv); exit(0); case 'n': nflag = 1; continue; case 'p': pflag = 1; break; case 'f' : if (argc != 3) usage(); file(argv[2]); exit(0); case 'l' : /* obsolete, ignored */ break; case 'r' : rflag = 1; break; case 's': sflag = 1; break; case 't': tflag = 1; break; case 'A': aflag = 1; repeat = atoi(optarg); if (repeat < 0) usage(); break; case 'H' : Hflag = 1; break; case 'P': Pflag = 1; break; case 'R': Rflag = 1; break; default: usage(); } argc -= optind; argv += optind; if (aflag || cflag) { dump(0); exit(0); } if (dflag) { if (argc != 1) usage(); delete(argv[0]); exit(0); } if (pflag) { plist(); exit(0); } if (rflag) { rtrlist(); exit(0); } if (sflag) { if (argc < 2 || argc > 4) usage(); exit(set(argc, argv) ? 1 : 0); } if (Hflag) { harmonize_rtr(); exit(0); } if (Pflag) { pfx_flush(); exit(0); } if (Rflag) { rtr_flush(); exit(0); } if (argc != 1) usage(); get(argv[0]); exit(0); }
int main(int argc, char **argv) { FILE *fp = stdin; int c; if (argc == 1) { usage(0); } thiszone = gmt2local(0); while ((c = getopt(argc, argv, "acdf:HlnvxDFPphVrk?")) != -1) { switch (c) { case 'c': f_mode = MODE_STDIN; #ifdef HAVE_READLINE /* disable filename completion */ rl_bind_key('\t', rl_insert); #endif break; case 'f': f_mode = MODE_SCRIPT; if (strcmp(optarg, "-") == 0) { fp = stdin; } else if ((fp = fopen(optarg, "r")) == NULL) { err(1, "Can't open `%s'", optarg); } break; case 'D': f_mode = MODE_CMDDUMP; break; case 'F': f_mode = MODE_CMDFLUSH; break; case 'a': f_all = 1; break; case 'l': f_forever = 1; break; case 'n': f_notreally = 1; break; #ifdef __NetBSD__ case 'h': #endif case 'H': f_hexdump = 1; break; case 'x': f_mode = MODE_PROMISC; f_tflag++; break; case 'P': f_policy = 1; break; case 'p': f_withports = 1; break; case 'v': f_verbose = 1; break; case 'r': #ifdef HAVE_POLICY_FWD f_rfcmode = 1; #else rkwarn(); #endif break; case 'k': #ifdef HAVE_POLICY_FWD f_rfcmode = 0; #else rkwarn(); #endif break; case 'V': usage(1); break; #ifndef __NetBSD__ case 'h': #endif case '?': default: usage(0); } } argc -= optind; argv += optind; if (argc > 0) { while (argc--) { if (fileproc(*argv++) < 0) { err(1, "%s", argv[-1]); } } exit(0); } so = pfkey_open(); if (so < 0) { perror("pfkey_open"); exit(1); } switch (f_mode) { case MODE_CMDDUMP: sendkeyshort(f_policy ? SADB_X_SPDDUMP : SADB_DUMP); break; case MODE_CMDFLUSH: sendkeyshort(f_policy ? SADB_X_SPDFLUSH: SADB_FLUSH); break; case MODE_SCRIPT: if (get_supported() < 0) { errx(1, "%s", ipsec_strerror()); } if (parse(&fp)) exit(1); break; case MODE_STDIN: if (get_supported() < 0) { errx(1, "%s", ipsec_strerror()); } stdin_loop(); break; case MODE_PROMISC: promisc(); /* NOTREACHED */ default: usage(0); } exit(0); }
int main(int argc, char* argv[]) { char *device = NULL, c, *bind_mask = NULL; int snaplen = DEFAULT_SNAPLEN, rc, watermark = 0, rehash_rss = 0; packet_direction direction = rx_only_direction; long i; u_int16_t cpu_percentage = 0, poll_duration = 0; u_int32_t version; u_int32_t flags = 0; startTime.tv_sec = 0; thiszone = gmt2local(0); numCPU = sysconf( _SC_NPROCESSORS_ONLN ); memset(thread_core_affinity, -1, sizeof(thread_core_affinity)); while((c = getopt(argc,argv,"hi:l:mvae:w:b:rp:g:")) != -1) { switch(c) { case 'h': printHelp(); return(0); break; case 'a': wait_for_packet = 0; break; case 'e': switch(atoi(optarg)) { case rx_and_tx_direction: case rx_only_direction: case tx_only_direction: direction = atoi(optarg); break; } break; case 'l': snaplen = atoi(optarg); break; case 'i': device = strdup(optarg); break; case 'm': use_extended_pkt_header = 1; break; case 'v': verbose = 1; break; case 'w': watermark = atoi(optarg); break; case 'b': cpu_percentage = atoi(optarg); break; case 'r': rehash_rss = 1; break; case 'p': poll_duration = atoi(optarg); break; case 'g': bind_mask = strdup(optarg); break; } } if(verbose) watermark = 1; if(device == NULL) device = DEFAULT_DEVICE; printf("Capturing from %s\n", device); flags |= PF_RING_PROMISC; /* hardcode: promisc=1 */ #if 0 flags |= PF_RING_DNA_FIXED_RSS_Q_0; #else flags |= PF_RING_DNA_SYMMETRIC_RSS; /* Note that symmetric RSS is ignored by non-DNA drivers */ #endif if(use_extended_pkt_header) flags |= PF_RING_LONG_HEADER; num_channels = pfring_open_multichannel(device, snaplen, flags, ring); if(num_channels <= 0) { fprintf(stderr, "pfring_open_multichannel() returned %d [%s]\n", num_channels, strerror(errno)); return(-1); } if (num_channels > MAX_NUM_THREADS) { printf("WARNING: Too many channels (%d), using %d channels\n", num_channels, MAX_NUM_THREADS); num_channels = MAX_NUM_THREADS; } else if (num_channels > numCPU) { printf("WARNING: More channels (%d) than available cores (%d), using %d channels\n", num_channels, numCPU, numCPU); num_channels = numCPU; } else { printf("Found %d channels\n", num_channels); } if(bind_mask != NULL) { char *id = strtok(bind_mask, ":"); int idx = 0; while(id != NULL) { thread_core_affinity[idx++] = atoi(id) % numCPU; if(idx >= num_channels) break; id = strtok(NULL, ":"); } } pfring_version(ring[0], &version); printf("Using PF_RING v.%d.%d.%d\n", (version & 0xFFFF0000) >> 16, (version & 0x0000FF00) >> 8, version & 0x000000FF); for(i=0; i<num_channels; i++) { char buf[32]; snprintf(buf, sizeof(buf), "pfcount_multichannel-thread %ld", i); pfring_set_application_name(ring[i], buf); if((rc = pfring_set_direction(ring[i], direction)) != 0) fprintf(stderr, "pfring_set_direction returned %d [direction=%d] (you can't capture TX with DNA)\n", rc, direction); if((rc = pfring_set_socket_mode(ring[i], recv_only_mode)) != 0) fprintf(stderr, "pfring_set_socket_mode returned [rc=%d]\n", rc); if(watermark > 0) { if((rc = pfring_set_poll_watermark(ring[i], watermark)) != 0) fprintf(stderr, "pfring_set_poll_watermark returned [rc=%d][watermark=%d]\n", rc, watermark); } #if 0 setup_steering(ring[0], "192.168.30.207", -1); /* UTDF */ setup_steering(ring[0], "224.0.1.92", 1); setup_steering(ring[0], "224.0.1.94", 1); setup_steering(ring[0], "224.0.1.96", 1); /* BATS */ setup_steering(ring[0], "224.0.62.2", 2); /* default: should go to channel 0 */ #endif if(rehash_rss) pfring_enable_rss_rehash(ring[i]); if(poll_duration > 0) pfring_set_poll_duration(ring[i], poll_duration); pfring_enable_ring(ring[i]); pthread_create(&pd_thread[i], NULL, packet_consumer_thread, (void*)i); usleep(500); } if(cpu_percentage > 0) { if(cpu_percentage > 99) cpu_percentage = 99; pfring_config(cpu_percentage); } signal(SIGINT, sigproc); signal(SIGTERM, sigproc); signal(SIGINT, sigproc); if(!verbose) { signal(SIGALRM, my_sigalarm); alarm(ALARM_SLEEP); } for(i=0; i<num_channels; i++) { pthread_join(pd_thread[i], NULL); pfring_close(ring[i]); } return(0); }
int main(int argc, char **argv) { register int cnt, op, i; bpf_u_int32 localnet, netmask; register char *cp, *infile, *cmdbuf, *device, *RFileName, *WFileName; pcap_handler printer; struct bpf_program fcode; RETSIGTYPE (*oldhandler)(int); u_char *pcap_userdata; char ebuf[PCAP_ERRBUF_SIZE]; cnt = -1; device = NULL; infile = NULL; RFileName = NULL; WFileName = NULL; if ((cp = strrchr(argv[0], '/')) != NULL) program_name = cp + 1; else program_name = argv[0]; if (abort_on_misalignment(ebuf) < 0) error("%s", ebuf); opterr = 0; while ( (op = getopt(argc, argv, "ac:defF:i:lnNOpqr:s:StT:vw:xY")) != EOF) switch (op) { case 'a': ++aflag; break; case 'c': cnt = atoi(optarg); if (cnt <= 0) error("invalid packet count %s", optarg); break; case 'd': ++dflag; break; case 'e': ++eflag; break; case 'f': ++fflag; break; case 'F': infile = optarg; break; case 'i': device = optarg; break; case 'l': #ifdef HAVE_SETLINEBUF setlinebuf(stdout); #else setvbuf(stdout, NULL, _IOLBF, 0); #endif break; case 'n': ++nflag; break; case 'N': ++Nflag; break; case 'O': Oflag = 0; break; case 'p': ++pflag; break; case 'q': ++qflag; break; case 'r': RFileName = optarg; break; case 's': snaplen = atoi(optarg); if (snaplen <= 0) error("invalid snaplen %s", optarg); break; case 'S': ++Sflag; break; case 't': --tflag; break; case 'T': if (strcasecmp(optarg, "vat") == 0) packettype = PT_VAT; else if (strcasecmp(optarg, "wb") == 0) packettype = PT_WB; else if (strcasecmp(optarg, "rpc") == 0) packettype = PT_RPC; else if (strcasecmp(optarg, "rtp") == 0) packettype = PT_RTP; else if (strcasecmp(optarg, "rtcp") == 0) packettype = PT_RTCP; else error("unknown packet type `%s'", optarg); break; case 'v': ++vflag; break; case 'w': WFileName = optarg; break; #ifdef YYDEBUG case 'Y': { /* Undocumented flag */ extern int yydebug; yydebug = 1; } break; #endif case 'x': ++xflag; break; default: usage(); /* NOTREACHED */ } if (aflag && nflag) error("-a and -n options are incompatible"); if (tflag > 0) thiszone = gmt2local(0); if (RFileName != NULL) { /* * We don't need network access, so set it back to the user id. * Also, this prevents the user from reading anyone's * trace file. */ setuid(getuid()); pd = pcap_open_offline(RFileName, ebuf); if (pd == NULL) error("%s", ebuf); localnet = 0; netmask = 0; if (fflag != 0) error("-f and -r options are incompatible"); } else { if (device == NULL) { device = pcap_lookupdev(ebuf); if (device == NULL) error("%s", ebuf); } pd = pcap_open_live(device, snaplen, !pflag, 1000, ebuf); if (pd == NULL) error("%s", ebuf); i = pcap_snapshot(pd); if (snaplen < i) { warning("snaplen raised from %d to %d", snaplen, i); snaplen = i; } if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) { localnet = 0; netmask = 0; warning("%s", ebuf); } /* * Let user own process after socket has been opened. */ setuid(getuid()); } if (infile) cmdbuf = read_infile(infile); else cmdbuf = copy_argv(&argv[optind]); if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0) error("%s", pcap_geterr(pd)); if (dflag) { bpf_dump(&fcode, dflag); exit(0); } init_addrtoname(localnet, netmask); (void)setsignal(SIGTERM, cleanup); (void)setsignal(SIGINT, cleanup); /* Cooperate with nohup(1) */ if ((oldhandler = setsignal(SIGHUP, cleanup)) != SIG_DFL) (void)setsignal(SIGHUP, oldhandler); if (pcap_setfilter(pd, &fcode) < 0) error("%s", pcap_geterr(pd)); if (WFileName) { pcap_dumper_t *p = pcap_dump_open(pd, WFileName); if (p == NULL) error("%s", pcap_geterr(pd)); printer = pcap_dump; pcap_userdata = (u_char *)p; } else { printer = lookup_printer(pcap_datalink(pd)); pcap_userdata = 0; } if (RFileName == NULL) { (void)fprintf(stderr, "%s: listening on %s\n", program_name, device); (void)fflush(stderr); } if (pcap_loop(pd, cnt, printer, pcap_userdata) < 0) { (void)fprintf(stderr, "%s: pcap_loop: %s\n", program_name, pcap_geterr(pd)); exit(1); } pcap_close(pd); exit(0); }