1/* 2 * Copyright (C) 2009 Johannes Berg <johannes@sipsolutions.net> 3 * 4 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; 8 * version 2.1 of the License (not later!) 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this program; if not, see <http://www.gnu.org/licenses> 17 * 18 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 */ 20#include <stdio.h> 21#include <stdlib.h> 22#include <string.h> 23 24#include "event-parse.h" 25 26#define INDENT 65 27 28static void print_string(struct trace_seq *s, struct event_format *event, 29 const char *name, const void *data) 30{ 31 struct format_field *f = pevent_find_field(event, name); 32 int offset; 33 int length; 34 35 if (!f) { 36 trace_seq_printf(s, "NOTFOUND:%s", name); 37 return; 38 } 39 40 offset = f->offset; 41 length = f->size; 42 43 if (!strncmp(f->type, "__data_loc", 10)) { 44 unsigned long long v; 45 if (pevent_read_number_field(f, data, &v)) { 46 trace_seq_printf(s, "invalid_data_loc"); 47 return; 48 } 49 offset = v & 0xffff; 50 length = v >> 16; 51 } 52 53 trace_seq_printf(s, "%.*s", length, (char *)data + offset); 54} 55 56#define SF(fn) pevent_print_num_field(s, fn ":%d", event, fn, record, 0) 57#define SFX(fn) pevent_print_num_field(s, fn ":%#x", event, fn, record, 0) 58#define SP() trace_seq_putc(s, ' ') 59 60static int drv_bss_info_changed(struct trace_seq *s, 61 struct pevent_record *record, 62 struct event_format *event, void *context) 63{ 64 void *data = record->data; 65 66 print_string(s, event, "wiphy_name", data); 67 trace_seq_printf(s, " vif:"); 68 print_string(s, event, "vif_name", data); 69 pevent_print_num_field(s, "(%d)", event, "vif_type", record, 1); 70 71 trace_seq_printf(s, "\n%*s", INDENT, ""); 72 SF("assoc"); SP(); 73 SF("aid"); SP(); 74 SF("cts"); SP(); 75 SF("shortpre"); SP(); 76 SF("shortslot"); SP(); 77 SF("dtimper"); SP(); 78 trace_seq_printf(s, "\n%*s", INDENT, ""); 79 SF("bcnint"); SP(); 80 SFX("assoc_cap"); SP(); 81 SFX("basic_rates"); SP(); 82 SF("enable_beacon"); 83 trace_seq_printf(s, "\n%*s", INDENT, ""); 84 SF("ht_operation_mode"); 85 86 return 0; 87} 88 89int PEVENT_PLUGIN_LOADER(struct pevent *pevent) 90{ 91 pevent_register_event_handler(pevent, -1, "mac80211", 92 "drv_bss_info_changed", 93 drv_bss_info_changed, NULL); 94 return 0; 95} 96 97void PEVENT_PLUGIN_UNLOADER(struct pevent *pevent) 98{ 99 pevent_unregister_event_handler(pevent, -1, "mac80211", 100 "drv_bss_info_changed", 101 drv_bss_info_changed, NULL); 102} 103