int pktlog_start(ath_generic_softc_handle scn, int log_state) { struct pktlog_handle_t *pl_dev = get_pl_handle(scn); struct ath_pktlog_info *pl_info = pl_dev->pl_info; int error = 0; if (log_state == 0) { /* use default log_state */ log_state = ATH_PKTLOG_TX | ATH_PKTLOG_RX | ATH_PKTLOG_ANI | ATH_PKTLOG_RCFIND | ATH_PKTLOG_RCUPDATE | ATH_PKTLOG_TEXT; } if (pl_info->log_state) /* already started, do nothing */ return 0; if (pl_info->saved_state) { /* restore previous log state and log buffer */ pl_info->log_state = pl_info->saved_state; pl_info->saved_state = 0; } else { error = pktlog_enable(scn, log_state); } return error; }
main(int argc, char *argv[]) { int c; int size = -1, tail_length = -1, sack_thr = -1; int thruput_thresh = -1, per_thresh = -1, phyerr_thresh = -1, trigger_interval = -1; unsigned long filter = 0, options = 0; char fstr[24]; char ad_name[24]; char sysctl_size[128]; char sysctl_enable[128]; char sysctl_options[128]; char sysctl_sack_thr[128]; char sysctl_tail_length[128]; char sysctl_thruput_thresh[128]; char sysctl_phyerr_thresh[128]; char sysctl_per_thresh[128]; char sysctl_trigger_interval[128]; int opt_a=0, opt_d = 0, opt_e = 0, fflag=0; for (;;) { c = getopt(argc, argv, "s:e::a:d:tk:l:b:p:i:h"); if (c < 0) break; switch (c) { case 't': options |= ATH_PKTLOG_PROTO; break; case 'k': /* triggered stop after # of TCP SACK packets are seen */ options |= ATH_PKTLOG_TRIGGER_SACK; if (optarg) { sack_thr = atoi(optarg); } break; case 'l': /* # of tail packets to log after triggered stop */ if (optarg) { tail_length = atoi(optarg); } break; case 's': if (optarg) { size = atoi(optarg); } break; case 'e': if (opt_d) { usage(); exit(-1); } opt_e = 1; if (optarg) { fflag = 1; strncpy(fstr, optarg, sizeof(fstr)); fstr[sizeof(fstr) - 1] = '\0'; } break; case 'a': opt_a = 1; if (optarg) { strncpy(ad_name, optarg, sizeof(ad_name)); ad_name[sizeof(ad_name) - 1] = '\0'; printf("Option a:%s\n", ad_name); } break; case 'd': if (optarg) { strncpy(ad_name, optarg, sizeof(ad_name)); ad_name[sizeof(ad_name) - 1] = '\0'; printf("adname:%s\n", ad_name); } if (opt_e) { usage(); exit(-1); } opt_d = 1; break; case 'b': /* triggered stop after throughput drop below this threshold */ options |= ATH_PKTLOG_TRIGGER_THRUPUT; if (optarg) { thruput_thresh = atoi(optarg); } break; case 'p': /* triggered stop after PER increase over this threshold */ options |= ATH_PKTLOG_TRIGGER_PER; if (optarg) { per_thresh = atoi(optarg); } break; case 'y': /* triggered stop after # of phyerrs are seen */ options |= ATH_PKTLOG_TRIGGER_PHYERR; if (optarg) { phyerr_thresh = atoi(optarg); } break; case 'i': /* time period of counting trigger statistics */ if (optarg) { trigger_interval = atoi(optarg); } break; case 'h': usage(); exit(0); default: usage(); } } /* * This protection is needed since system wide logging is not supported yet */ if (opt_e) { if (!opt_a) { printf("Please enter the adapter\n"); usage(); exit(-1); } } if (if_nametoindex(ad_name) == 0) { printf("adname: %s is invalid\n", ad_name); usage(); exit(-1); } if (opt_a) { sprintf(sysctl_enable, "/proc/sys/" PKTLOG_PROC_DIR "/%s/enable", ad_name); sprintf(sysctl_size, "/proc/sys/" PKTLOG_PROC_DIR "/%s/size", ad_name); sprintf(sysctl_options, "/proc/sys/" PKTLOG_PROC_DIR "/%s/options", ad_name); sprintf(sysctl_sack_thr, "/proc/sys/" PKTLOG_PROC_DIR "/%s/sack_thr", ad_name); sprintf(sysctl_tail_length, "/proc/sys/" PKTLOG_PROC_DIR "/%s/tail_length", ad_name); sprintf(sysctl_thruput_thresh, "/proc/sys/" PKTLOG_PROC_DIR "/%s/thruput_thresh", ad_name); sprintf(sysctl_per_thresh, "/proc/sys/" PKTLOG_PROC_DIR "/%s/per_thresh", ad_name); sprintf(sysctl_phyerr_thresh, "/proc/sys/" PKTLOG_PROC_DIR "/%s/phyerr_thresh", ad_name); sprintf(sysctl_trigger_interval, "/proc/sys/" PKTLOG_PROC_DIR "/%s/trigger_interval", ad_name); } else { sprintf(sysctl_enable, "/proc/sys/" PKTLOG_PROC_DIR "/" PKTLOG_PROC_SYSTEM "/enable"); sprintf(sysctl_size, "/proc/sys/" PKTLOG_PROC_DIR "/" PKTLOG_PROC_SYSTEM "/size"); sprintf(sysctl_options, "/proc/sys/" PKTLOG_PROC_DIR "/" PKTLOG_PROC_SYSTEM "/options"); sprintf(sysctl_sack_thr, "/proc/sys/" PKTLOG_PROC_DIR "/" PKTLOG_PROC_SYSTEM "/sack_thr"); sprintf(sysctl_tail_length, "/proc/sys/" PKTLOG_PROC_DIR "/" PKTLOG_PROC_SYSTEM "/tail_length"); sprintf(sysctl_thruput_thresh, "/proc/sys/" PKTLOG_PROC_DIR "/" PKTLOG_PROC_SYSTEM "/thruput_thresh"); sprintf(sysctl_per_thresh, "/proc/sys/" PKTLOG_PROC_DIR "/" PKTLOG_PROC_SYSTEM "/per_thresh"); sprintf(sysctl_phyerr_thresh, "/proc/sys/" PKTLOG_PROC_DIR "/" PKTLOG_PROC_SYSTEM "/phyerr_thresh"); sprintf(sysctl_trigger_interval, "/proc/sys/" PKTLOG_PROC_DIR "/" PKTLOG_PROC_SYSTEM "/trigger_interval"); } if (opt_d) { /* * Need to be removed * Must disbale the entire system * However doing the above does not work for individual adapter logging * Needs fix */ sprintf(sysctl_enable, "/proc/sys/" PKTLOG_PROC_DIR "/%s/enable", ad_name); printf("sysctl_enable: %s\n", sysctl_options); pktlog_options(sysctl_options, 0); pktlog_enable(sysctl_enable, 0); printf("Called _pktlog_enable with parameter %d\n", (int) 0); return 0; } if (sack_thr > 0) { if (options & ATH_PKTLOG_PROTO) { if (pktlog_size(sysctl_sack_thr, sysctl_enable, sack_thr) != 0) { fprintf(stderr, "pktlogconf: log sack_thr setting failed\n"); exit(-1); } if (pktlog_size(sysctl_tail_length, sysctl_enable, tail_length) != 0) { fprintf(stderr, "pktlogconf: log tail_length setting failed\n"); exit(-1); } } else { usage(); exit(-1); } } if (thruput_thresh > 0) { if (pktlog_size(sysctl_thruput_thresh, sysctl_enable, thruput_thresh) != 0) { fprintf(stderr, "pktlogconf: log thruput_thresh setting failed\n"); exit(-1); } } if (per_thresh > 0) { if (pktlog_size(sysctl_per_thresh, sysctl_enable, per_thresh) != 0) { fprintf(stderr, "pktlogconf: log per_thresh setting failed\n"); exit(-1); } } if (phyerr_thresh > 0) { if (pktlog_size(sysctl_phyerr_thresh, sysctl_enable, phyerr_thresh) != 0) { fprintf(stderr, "pktlogconf: log phyerr_thresh setting failed\n"); exit(-1); } } if (trigger_interval > 0) { if (pktlog_size(sysctl_trigger_interval, sysctl_enable, trigger_interval) != 0) { fprintf(stderr, "pktlogconf: log trigger_interval setting failed\n"); exit(-1); } } if (fflag) { if (strstr(fstr, "rx")) filter |= ATH_PKTLOG_RX; if (strstr(fstr, "tx")) filter |= ATH_PKTLOG_TX; if (strstr(fstr, "rcf")) filter |= ATH_PKTLOG_RCFIND; if (strstr(fstr, "rcu")) filter |= ATH_PKTLOG_RCUPDATE; if (strstr(fstr, "ani")) filter |= ATH_PKTLOG_ANI; if (strstr(fstr, "text")) filter |= ATH_PKTLOG_TEXT; printf("_pktlog_filter:%d\n", filter); if (filter == 0) usage(); } else { filter = ATH_PKTLOG_ANI | ATH_PKTLOG_RCUPDATE | ATH_PKTLOG_RCFIND | ATH_PKTLOG_RX | ATH_PKTLOG_TX | ATH_PKTLOG_TEXT; printf("_pktlog_filter:%d\n", filter); } if (size >= 0) if (pktlog_size(sysctl_size, sysctl_enable, size) != 0) { fprintf(stderr, "pktlogconf: log size setting failed\n"); exit(-1); } if (opt_e) { if (pktlog_enable(sysctl_enable, filter) != 0) { fprintf(stderr, "pktlogconf: log filter setting failed\n"); exit(-1); } if (pktlog_options(sysctl_options, options) != 0) { fprintf(stderr, "pktlogconf: options setting failed\n"); exit(-1); } } }