Skip to content

Commit

Permalink
merge wifi respondd modules to one wifi statistics modul
Browse files Browse the repository at this point in the history
  • Loading branch information
genofire committed Aug 8, 2018
1 parent 1e15aa6 commit 8ceea07
Show file tree
Hide file tree
Showing 17 changed files with 173 additions and 226 deletions.
39 changes: 0 additions & 39 deletions net/respondd-module-airtime/src/respondd.c

This file was deleted.

39 changes: 39 additions & 0 deletions net/respondd-module-wifi/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
include $(TOPDIR)/rules.mk

PKG_NAME:=respondd-module-wifi
PKG_VERSION:=1
PKG_RELEASE:=1

PKG_LICENSE:=BSD-2-Clause

PKG_BUILD_DEPENDS := respondd

include $(INCLUDE_DIR)/package.mk

define Package/respondd-module-wifi/Default
SECTION:=net
CATEGORY:=Network
TITLE:=Add wifi statistics to respondd
DEPENDS:=+respondd +libnl-tiny
endef

TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/libnl-tiny

define Package/respondd-module-wifi
$(call Package/respondd-module-wifi/Default)
endef

define Package/respondd-module-gluonwifi
$(call Package/respondd-module-wifi/Default)
VARIANT:=gluon
TARGET_CFLAGS += -DGLUON
endef

define Package/respondd-module-wifi/install
$(INSTALL_DIR) $(1)/usr/lib/respondd
$(CP) $(PKG_BUILD_DIR)/respondd.so $(1)/usr/lib/respondd/wifi.so
endef

Package/respondd-module-gluonwifi/install = $(Package/respondd-module-wifi/install)

$(eval $(call BuildPackage,respondd-module-wifi))
Original file line number Diff line number Diff line change
@@ -1,25 +1,43 @@
This module adds a respondd airtime usage statistics provider.
This module adds a respondd wifi usage statistics provider.
The format is the following:

```json
{
"statistics": {
"clients":{
"wifi24": 3,
"wifi5": 7
},
"wireless": [
{
"frequency": 5220,
"txpower": 1700,
"active": 366561161,
"busy": 46496566,
"rx": 808415,
"tx": 41711344,
"noise": 162
"noise": 162,
"clients": 5
},
{
"frequency": 5220,
"txpower": 1700,
"active": 366561161,
"busy": 46496566,
"rx": 808415,
"tx": 41711344,
"noise": 162,
"clients": 2
},
{
"frequency": 2437,
"txpower": 2000,
"active": 366649704,
"busy": 205221222,
"rx": 108121446,
"tx": 85453679,
"noise": 161
"noise": 161,
"clients": 3
}
]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ all: respondd.so

%.c: %.h

respondd.so: netlink.c airtime.c ifaces.c respondd.c
respondd.so: netlink.c clients.c airtime.c ifaces.c respondd.c
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -shared -fPIC -D_GNU_SOURCE -lnl-tiny -o $@ $^ $(LDLIBS)

clean:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@
* @__NL80211_SURVEY_INFO_AFTER_LAST: internal use
*/

static const char const* msg_names[NL80211_SURVEY_INFO_MAX + 1] = {
[NL80211_SURVEY_INFO_FREQUENCY] = "frequency",
static const char * msg_names[NL80211_SURVEY_INFO_MAX + 1] = {
[NL80211_SURVEY_INFO_CHANNEL_TIME] = "active",
[NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY] = "busy",
[NL80211_SURVEY_INFO_CHANNEL_TIME_RX] = "rx",
Expand All @@ -67,19 +66,13 @@ static const char const* msg_names[NL80211_SURVEY_INFO_MAX + 1] = {
};

static int survey_airtime_handler(struct nl_msg *msg, void *arg) {
struct json_object *parent_json = (struct json_object *) arg;
struct json_object *json = (struct json_object *) arg;

struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
struct nlattr *survey_info = nla_find(genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NL80211_ATTR_SURVEY_INFO);

if (!survey_info) {
fprintf(stderr, "respondd-module-airtime: survey data missing in netlink message\n");
goto abort;
}

struct json_object *freq_json = json_object_new_object();
if (!freq_json) {
fprintf(stderr, "respondd-module-airtime: failed allocating JSON object\n");
fputs("respondd-module-wifi: survey data missing in netlink message\n", stderr);
goto abort;
}

Expand All @@ -99,7 +92,6 @@ static int survey_airtime_handler(struct nl_msg *msg, void *arg) {
switch (type) {
// these are the required fields
case NL80211_SURVEY_INFO_IN_USE:
case NL80211_SURVEY_INFO_FREQUENCY:
case NL80211_SURVEY_INFO_CHANNEL_TIME:
req_fields++;
}
Expand All @@ -122,18 +114,13 @@ static int survey_airtime_handler(struct nl_msg *msg, void *arg) {
data_json = json_object_new_int(nla_get_u8(nla));
break;
default:
fprintf(stderr, "respondd-module-airtime: Unexpected NL attribute length: %d\n", nla_len(nla));
fprintf(stderr, "respondd-module-wifi: Unexpected NL attribute length: %d\n", nla_len(nla));
}

if (data_json)
json_object_object_add(freq_json, msg_names[type], data_json);
json_object_object_add(json, msg_names[type], data_json);
}

if (req_fields == 3)
json_object_array_add(parent_json, freq_json);
else
json_object_put(freq_json);

abort:
return NL_SKIP;
}
Expand Down
File renamed without changes.
16 changes: 16 additions & 0 deletions net/respondd-module-wifi/src/clients.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#include <linux/nl80211.h>
#include <netlink/genl/genl.h>

#include "netlink.h"
#include "clients.h"

static int station_client_handler(struct nl_msg *msg, void *arg) {
int *count = (int *) arg;

(*count)++;

return NL_SKIP;
}
bool get_client_counts(int *count, int ifx) {
return nl_send_dump(station_client_handler, count, NL80211_CMD_GET_STATION, ifx);
}
6 changes: 6 additions & 0 deletions net/respondd-module-wifi/src/clients.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#pragma once

#include <stdbool.h>
#include <stdint.h>

__attribute__((visibility("hidden"))) bool get_client_counts(int *count, int ifx);
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,29 @@
static int iface_dump_handler(struct nl_msg *msg, void *arg) {
struct nlattr *tb[NL80211_ATTR_MAX + 1];
struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
int wiphy;
struct iface_list **last_next;

nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);

if (!tb[NL80211_ATTR_WIPHY] || !tb[NL80211_ATTR_IFINDEX])
goto skip;

wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
for (last_next = arg; *last_next != NULL; last_next = &(*last_next)->next) {
if ((*last_next)->wiphy == wiphy)
goto skip;
}
#ifdef GLUON
if(nla_strcmp(tb[NL80211_ATTR_IFNAME], "client") == -1)
goto skip;
#endif

// TODO fix add to head list - instatt find last item
for (last_next = arg; *last_next != NULL; last_next = &(*last_next)->next) {}

*last_next = malloc(sizeof(**last_next));
if (!*last_next)
goto skip;
(*last_next)->next = NULL;
(*last_next)->wiphy = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
(*last_next)->ifx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
(*last_next)->wiphy = wiphy;
(*last_next)->frequency = nla_get_u32(tb[NL80211_ATTR_WIPHY_FREQ]);
(*last_next)->txpower = nla_get_u32(tb[NL80211_ATTR_WIPHY_TX_POWER_LEVEL]);

skip:
return NL_SKIP;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
#pragma once

struct iface_list {
int ifx;
int wiphy;
int ifx;
int frequency;
int txpower;
struct iface_list *next;
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "netlink.h"


bool nl_send_dump(nl_recvmsg_msg_cb_t cb, void *cb_arg, int cmd, uint32_t cmd_arg) {
bool ok = false;
int ret;
Expand All @@ -14,7 +15,7 @@ bool nl_send_dump(nl_recvmsg_msg_cb_t cb, void *cb_arg, int cmd, uint32_t cmd_ar
struct nl_msg *msg = NULL;


#define ERR(...) { fprintf(stderr, "respondd-module-airtime: " __VA_ARGS__); goto out; }
#define ERR(...) { fprintf(stderr, "respondd-module-wifi: " __VA_ARGS__); goto out; }

sk = nl_socket_alloc();
if (!sk)
Expand Down
File renamed without changes.
69 changes: 69 additions & 0 deletions net/respondd-module-wifi/src/respondd.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#include <string.h>
#include <stdio.h>
#include <json-c/json.h>
#include <respondd.h>

#include "airtime.h"
#include "clients.h"
#include "ifaces.h"

static struct json_object *respondd_provider_statistics(void) {
struct json_object *result, *wireless, *clients, *interface;
struct iface_list *ifaces;
int wifi24 = 0, wifi5 = 0, clients_count;

result = json_object_new_object();
if (!result)
return NULL;

wireless = json_object_new_array();
if (!wireless) {
//TODO why needed? : json_object_put(result);
return NULL;
}

clients = json_object_new_object();
if (!clients) {
return NULL;
}

ifaces = get_ifaces();
while (ifaces != NULL) {
clients_count = 0;
get_client_counts(&clients_count, ifaces->ifx);
if (ifaces->frequency < 5000)
wifi24 += clients_count;
if (ifaces->frequency > 5000)
wifi5 += clients_count;

//TODO wiphy only one radio added? (no necessary on gluon - only one ap-ssid at radio)
interface = json_object_new_object();
if (!interface) {
continue;
}
json_object_object_add(interface, "frequency", json_object_new_int(ifaces->frequency));
json_object_object_add(interface, "txpower", json_object_new_int(ifaces->txpower));
get_airtime(interface, ifaces->ifx);
//TODO remove at merge radios (one wiphy radio)
json_object_object_add(interface, "clients", json_object_new_int(clients_count));
json_object_array_add(wireless, interface);

void *freeptr = ifaces;
ifaces = ifaces->next;
free(freeptr);
}

//TODO maybe skip: if (wifi24 > 0 || wifi5 > 0) {
json_object_object_add(clients, "wifi24", json_object_new_int(wifi24));
json_object_object_add(clients, "wifi5", json_object_new_int(wifi5));
json_object_object_add(result, "clients", clients);
//}

json_object_object_add(result, "wireless", wireless);
return result;
}

const struct respondd_provider_info respondd_providers[] = {
{"statistics", respondd_provider_statistics},
{0, 0},
};
25 changes: 0 additions & 25 deletions net/respondd-module-wifisettings/Makefile

This file was deleted.

13 changes: 0 additions & 13 deletions net/respondd-module-wifisettings/README.md

This file was deleted.

Loading

0 comments on commit 8ceea07

Please sign in to comment.