Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
        }
    }
}