bool first = true;
if (!simple_mode)
- fprintf(stderr, "\n");
+ fprintf(stdout, "\n");
wprobe_request_data(dev, NULL);
list_for_each_entry(attr, &dev->global_attr, list) {
if (simple_mode) {
fprintf(stdout, "[global]\n");
fprintf(stdout, "%s=%s\n", attr->name, wprobe_dump_value(attr));
} else {
- fprintf(stderr, (first ?
+ fprintf(stdout, (first ?
"Global: %s=%s\n" :
" %s=%s\n"),
attr->name,
wprobe_request_data(dev, link->addr);
list_for_each_entry(attr, &dev->link_attr, list) {
if (first) {
- fprintf((simple_mode ? stdout : stderr),
- (simple_mode ?
+ fprintf(stdout,
+ (simple_mode ?
"[%02x:%02x:%02x:%02x:%02x:%02x]\n%s=%s\n" :
"%02x:%02x:%02x:%02x:%02x:%02x: %s=%s\n"),
link->addr[0], link->addr[1], link->addr[2],
wprobe_dump_value(attr));
first = false;
} else {
- fprintf((simple_mode ? stdout : stderr),
+ fprintf(stdout,
(simple_mode ? "%s=%s\n" :
" %s=%s\n"),
attr->name,
static int usage(const char *prog)
{
fprintf(stderr,
-#ifndef NO_LOCAL_ACCESS
+#ifndef NO_LOCAL_ACCESS
"Usage: %s <interface>|<host>:<device>|-P [options]\n"
#else
"Usage: %s <host>:<device> [options]\n"
#endif
"\n"
"Options:\n"
+ " -a: Print attributes\n"
" -c: Only apply configuration\n"
" -d: Delay between measurement dumps (in milliseconds, default: 1000)\n"
+ " A value of 0 (zero) prints once and exits; useful for scripts\n"
" -f: Dump contents of layer 2 filter counters during measurement\n"
" -F <file>: Apply layer 2 filters from <file>\n"
" -h: This help text\n"
" -i <interval>: Set measurement interval\n"
" -m: Run measurement loop\n"
" -p: Set the TCP port for server/client (default: 17990)\n"
-#ifndef NO_LOCAL_ACCESS
+#ifndef NO_LOCAL_ACCESS
" -P: Run in proxy mode (listen on network)\n"
#endif
"\n"
if (simple_mode)
return;
list_for_each_entry(attr, &dev->global_attr, list) {
- fprintf(stderr, "Global attribute: '%s' (%s)\n",
+ fprintf(stdout, "Global attribute: '%s' (%s)\n",
attr->name, attr_typestr[attr->type]);
}
list_for_each_entry(attr, &dev->link_attr, list) {
- fprintf(stderr, "Link attribute: '%s' (%s)\n",
+ fprintf(stdout, "Link attribute: '%s' (%s)\n",
attr->name, attr_typestr[attr->type]);
}
}
static void show_filter(void *arg, const char *group, struct wprobe_filter_item *items, int n_items)
{
int i;
- fprintf(stderr, "Filter group: '%s' (tx/rx)\n", group);
+ fprintf(stdout, "Filter group: '%s' (tx/rx)\n", group);
for (i = 0; i < n_items; i++) {
- fprintf(stderr, " - %s (%lld/%lld)\n",
+ fprintf(stdout, " - %s (%lld/%lld)\n",
items[i].name, items[i].tx, items[i].rx);
}
}
static void loop_measurement(struct wprobe_iface *dev, bool print_filters, unsigned long delay)
{
- while (1) {
- usleep(delay * 1000);
+ do {
wprobe_update_links(dev);
wprobe_dump_data(dev);
if (print_filters)
wprobe_dump_filters(dev, simple_mode ? show_filter_simple : show_filter, NULL);
+ usleep(delay * 1000);
}
+ while (delay);
}
static void set_filter(struct wprobe_iface *dev, const char *filename)
return 1;
}
while(1) {
- unsigned int addrlen;
+ unsigned int addrlen = sizeof(struct sockaddr_in);
int ret, c;
c = accept(s, (struct sockaddr *)&sa, &addrlen);
CMD_PROXY,
} cmd = CMD_NONE;
const char *filter = NULL;
+ bool print_attributes = false;
bool print_filters = false;
unsigned long delay = 1000;
int interval = -1;
if (argc < 2)
return usage(prog);
-#ifndef NO_LOCAL_ACCESS
+#ifndef NO_LOCAL_ACCESS
if (!strcmp(argv[1], "-P")) {
while ((ch = getopt(argc - 1, argv + 1, "p:")) != -1) {
switch(ch) {
argv++;
argc--;
- while ((ch = getopt(argc, argv, "cd:fF:hi:msp:")) != -1) {
+ while ((ch = getopt(argc, argv, "acd:fF:hi:msp:")) != -1) {
switch(ch) {
+ case 'a':
+ print_attributes = true;
+ break;
case 'c':
cmd = CMD_CONFIG;
break;
if (!dev || (list_empty(&dev->global_attr) &&
list_empty(&dev->link_attr))) {
if (err)
- fprintf(stderr, "%s\n", err);
+ fprintf(stdout, "%s\n", err);
else
fprintf(stderr, "Interface '%s' not found\n", ifname);
return 1;
wprobe_apply_config(dev);
}
- if (cmd != CMD_CONFIG)
- show_attributes(dev);
+ if (cmd != CMD_CONFIG) {
+ if (print_attributes)
+ show_attributes(dev);
+ }
if (cmd == CMD_MEASURE)
loop_measurement(dev, print_filters, delay);