//********************************************************************************************************************** vector<string> ChimeraBellerophonCommand::setParameters(){ try { CommandParameter pfasta("fasta", "InputTypes", "", "", "none","none","none",false,true); parameters.push_back(pfasta); CommandParameter pfilter("filter", "Boolean", "", "F", "", "", "",false,false); parameters.push_back(pfilter); CommandParameter pcorrection("filter", "Boolean", "", "T", "", "", "",false,false); parameters.push_back(pcorrection); CommandParameter pwindow("window", "Number", "", "0", "", "", "",false,false); parameters.push_back(pwindow); CommandParameter pincrement("increment", "Number", "", "25", "", "", "",false,false); parameters.push_back(pincrement); CommandParameter pprocessors("processors", "Number", "", "1", "", "", "",false,false); parameters.push_back(pprocessors); CommandParameter pinputdir("inputdir", "String", "", "", "", "", "",false,false); parameters.push_back(pinputdir); CommandParameter poutputdir("outputdir", "String", "", "", "", "", "",false,false); parameters.push_back(poutputdir); vector<string> myArray; for (int i = 0; i < parameters.size(); i++) { myArray.push_back(parameters[i].name); } return myArray; } catch(exception& e) { m->errorOut(e, "ChimeraBellerophonCommand", "setParameters"); exit(1); } }
static void pftest (int test_num, char *filter, char *monitor, int expected) { int result; packet_t pp; text_color_set (DW_COLOR_DEBUG); dw_printf ("test number %d\n", test_num); pp = ax25_from_text (monitor, 1); assert (pp != NULL); result = pfilter (0, 0, filter, pp); if (result != expected) { text_color_set (DW_COLOR_ERROR); dw_printf ("Unexpected result for test number %d\n", test_num); error_count++; } ax25_delete (pp); }
//********************************************************************************************************************** vector<string> ChimeraPintailCommand::setParameters(){ try { CommandParameter ptemplate("reference", "InputTypes", "", "", "none", "none", "none","",false,true,true); parameters.push_back(ptemplate); CommandParameter pfasta("fasta", "InputTypes", "", "", "none", "none", "none","chimera-accnos",false,true,true); parameters.push_back(pfasta); CommandParameter pconservation("conservation", "InputTypes", "", "", "none", "none", "none","",false,false); parameters.push_back(pconservation); CommandParameter pquantile("quantile", "InputTypes", "", "", "none", "none", "none","",false,false); parameters.push_back(pquantile); CommandParameter pfilter("filter", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(pfilter); CommandParameter pwindow("window", "Number", "", "0", "", "", "","","",false,false); parameters.push_back(pwindow); CommandParameter pincrement("increment", "Number", "", "25", "", "", "","",false,false); parameters.push_back(pincrement); CommandParameter pmask("mask", "String", "", "", "", "", "","",false,false); parameters.push_back(pmask); CommandParameter pprocessors("processors", "Number", "", "1", "", "", "","",false,false,true); parameters.push_back(pprocessors); CommandParameter pinputdir("inputdir", "String", "", "", "", "", "","",false,false); parameters.push_back(pinputdir); CommandParameter poutputdir("outputdir", "String", "", "", "", "", "","",false,false); parameters.push_back(poutputdir); CommandParameter psave("save", "Boolean", "", "F", "", "", "","",false,false); parameters.push_back(psave); vector<string> myArray; for (int i = 0; i < parameters.size(); i++) { myArray.push_back(parameters[i].name); } return myArray; } catch(exception& e) { m->errorOut(e, "ChimeraPintailCommand", "setParameters"); exit(1); } }
static packet_t digipeat_match (int from_chan, packet_t pp, char *mycall_rec, char *mycall_xmit, regex_t *alias, regex_t *wide, int to_chan, enum preempt_e preempt, char *filter_str) { int ssid; int r; char repeater[AX25_MAX_ADDR_LEN]; int err; char err_msg[100]; /* * First check if filtering has been configured. */ if (filter_str != NULL) { if (pfilter(from_chan, to_chan, filter_str, pp) != 1) { // TODO1.2: take out debug message // Actually it turns out to be useful. // Maybe add a quiet option to suppress it although no one has complained about it yet. //#if DEBUG text_color_set(DW_COLOR_DEBUG); dw_printf ("Packet was rejected for digipeating from channel %d to %d by filter: %s\n", from_chan, to_chan, filter_str); //#endif return(NULL); } } /* * The spec says: * * The SSID in the Destination Address field of all packets is coded to specify * the APRS digipeater path. * If the Destination Address SSID is -0, the packet follows the standard AX.25 * digipeater ("VIA") path contained in the Digipeater Addresses field of the * AX.25 frame. * If the Destination Address SSID is non-zero, the packet follows one of 15 * generic APRS digipeater paths. * * * What if this is non-zero but there is also a digipeater path? * I will ignore this if there is an explicit path. * * Note that this modifies the input. But only once! * Otherwise we don't want to modify the input because this could be called multiple times. */ if (ax25_get_num_repeaters(pp) == 0 && (ssid = ax25_get_ssid(pp, AX25_DESTINATION)) > 0) { ax25_set_addr(pp, AX25_REPEATER_1, dest_ssid_path[ssid]); ax25_set_ssid(pp, AX25_DESTINATION, 0); /* Continue with general case, below. */ } /* * Find the first repeater station which doesn't have "has been repeated" set. * * r = index of the address position in the frame. */ r = ax25_get_first_not_repeated(pp); if (r < AX25_REPEATER_1) { return (NULL); } ax25_get_addr_with_ssid(pp, r, repeater); ssid = ax25_get_ssid(pp, r); #if DEBUG text_color_set(DW_COLOR_DEBUG); dw_printf ("First unused digipeater is %s, ssid=%d\n", repeater, ssid); #endif /* * First check for explicit use of my call. * In this case, we don't check the history so it would be possible * to have a loop (of limited size) if someone constructed the digipeater paths * correctly. */ if (strcmp(repeater, mycall_rec) == 0) { packet_t result; result = ax25_dup (pp); assert (result != NULL); /* If using multiple radio channels, they */ /* could have different calls. */ ax25_set_addr (result, r, mycall_xmit); ax25_set_h (result, r); return (result); } /* * Next try to avoid retransmitting redundant information. * Duplicates are detected by comparing only: * - source * - destination * - info part * - but none of the digipeaters * A history is kept for some amount of time, typically 30 seconds. * For efficiency, only a checksum, rather than the complete fields * might be kept but the result is the same. * Packets transmitted recently will not be transmitted again during * the specified time period. * */ if (dedupe_check(pp, to_chan)) { //#if DEBUG /* Might be useful if people are wondering why */ /* some are not repeated. Might also cause confusion. */ text_color_set(DW_COLOR_INFO); dw_printf ("Digipeater: Drop redundant packet to channel %d.\n", to_chan); //#endif return NULL; } /* * For the alias pattern, we unconditionally digipeat it once. * i.e. Just replace it with MYCALL don't even look at the ssid. */ err = regexec(alias,repeater,0,NULL,0); if (err == 0) { packet_t result; result = ax25_dup (pp); assert (result != NULL); ax25_set_addr (result, r, mycall_xmit); ax25_set_h (result, r); return (result); } else if (err != REG_NOMATCH) { regerror(err, alias, err_msg, sizeof(err_msg)); text_color_set (DW_COLOR_ERROR); dw_printf ("%s\n", err_msg); } /* * If preemptive digipeating is enabled, try matching my call * and aliases against all remaining unused digipeaters. */ if (preempt != PREEMPT_OFF) { int r2; for (r2 = r+1; r2 < ax25_get_num_addr(pp); r2++) { char repeater2[AX25_MAX_ADDR_LEN]; ax25_get_addr_with_ssid(pp, r2, repeater2); //text_color_set (DW_COLOR_DEBUG); //dw_printf ("test match %d %s\n", r2, repeater2); if (strcmp(repeater2, mycall_rec) == 0 || regexec(alias,repeater2,0,NULL,0) == 0) { packet_t result; result = ax25_dup (pp); assert (result != NULL); ax25_set_addr (result, r2, mycall_xmit); ax25_set_h (result, r2); switch (preempt) { case PREEMPT_DROP: /* remove all prior */ while (r2 > AX25_REPEATER_1) { ax25_remove_addr (result, r2-1); r2--; } break; case PREEMPT_MARK: r2--; while (r2 >= AX25_REPEATER_1 && ax25_get_h(result,r2) == 0) { ax25_set_h (result, r2); r2--; } break; case PREEMPT_TRACE: /* remove prior unused */ default: while (r2 > AX25_REPEATER_1 && ax25_get_h(result,r2-1) == 0) { ax25_remove_addr (result, r2-1); r2--; } break; } return (result); } } } /* * For the wide pattern, we check the ssid and decrement it. */ err = regexec(wide,repeater,0,NULL,0); if (err == 0) { /* * If ssid == 1, we simply replace the repeater with my call and * mark it as being used. * * Otherwise, if ssid in range of 2 to 7, * Decrement y and don't mark repeater as being used. * Insert own call ahead of this one for tracing if we don't already have the * maximum number of repeaters. */ if (ssid == 1) { packet_t result; result = ax25_dup (pp); assert (result != NULL); ax25_set_addr (result, r, mycall_xmit); ax25_set_h (result, r); return (result); } if (ssid >= 2 && ssid <= 7) { packet_t result; result = ax25_dup (pp); assert (result != NULL); ax25_set_ssid(result, r, ssid-1); // should be at least 1 if (ax25_get_num_repeaters(pp) < AX25_MAX_REPEATERS) { ax25_insert_addr (result, r, mycall_xmit); ax25_set_h (result, r); } return (result); } } else if (err != REG_NOMATCH) { regerror(err, wide, err_msg, sizeof(err_msg)); text_color_set (DW_COLOR_ERROR); dw_printf ("%s\n", err_msg); } /* * Don't repeat it if we get here. */ return (NULL); }
int main(int argc, char **argv) { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t *p = NULL; char *fn = NULL, *out = "out.pcap", *filt = "ip"; int c = 0; int f_wait = 0; while((c = getopt(argc, argv, "no:sW")) != -1) { switch(c) { case 'n': No_Write = 1; break; case 'o': out = optarg; break; case 's': Full_Snap_Only = 0; break; case 'W': f_wait = 1; break; case 'h': default: _usage(); exit(1); } } argc -= optind; argv += optind; if(argc < 1) { _usage(); exit(1); } fn = argv[0]; if(argc > 1) filt = copy_argv(&argv[1]); if((p = pcap_open_offline(fn, errbuf))) { if(No_Write || (D = pcap_dump_open(p, out))) { pfilter(p, "%s", filt); pcap_loop(p, -1, _arrival, (u_char*)p); } else { fmt_eprint("can't open output \"%s\"", out); exit(1); } } else { fmt_eprint("can't open file: %s\n", errbuf); exit(1); } if(D) { pcap_dump_close(D); } fmt_print("%a packets read, %a written (%.1f%%), or %.1f%% of %La total bytes\n", Read, Written, ((double)Written/(double)Read)*100, ((double)WrittenBytes/(double)ReadBytes)*100, ReadBytes); while(f_wait) /* debug */ ; exit(0); }