Re: [OpenWrt-Devel] [PATCH 2/2] iwinfo: nl80211: add survey.

2018-07-05 Thread Daniel Danzberger
Yes, everything returned by NL80211_CMD_GET_SURVEY.
Its equivalent to: # iw wlan0 survey dump

On 07/04/2018 10:32 PM, Nick wrote:
> I wanted to add this info too. See previous emails: "iwinfo: add channel
> survey"
> I think you are making the survey for all channels?
> My attention was only a survey for the used channel.
> 
> 
> On 03.07.2018 15:32, Daniel Danzberger wrote:
>> Signed-off-by: Daniel Danzberger 
>> ---
>>  include/iwinfo.h | 11 
>>  iwinfo_nl80211.c | 69 
>>  2 files changed, 80 insertions(+)
>>
>> diff --git a/include/iwinfo.h b/include/iwinfo.h
>> index 4111205..49ee7f0 100644
>> --- a/include/iwinfo.h
>> +++ b/include/iwinfo.h
>> @@ -128,6 +128,16 @@ struct iwinfo_assoclist_entry {
>>  uint32_t thr;
>>  };
>>  
>> +struct iwinfo_survey_entry {
>> +uint64_t active_time;
>> +uint64_t busy_time;
>> +uint64_t busy_time_ext;
>> +uint64_t rxtime;
>> +uint64_t txtime;
>> +uint32_t mhz;
>> +uint8_t noise;
>> +};
>> +
>>  struct iwinfo_txpwrlist_entry {
>>  uint8_t  dbm;
>>  uint16_t mw;
>> @@ -223,6 +233,7 @@ struct iwinfo_ops {
>>  int (*scanlist)(const char *, char *, int *);
>>  int (*freqlist)(const char *, char *, int *);
>>  int (*countrylist)(const char *, char *, int *);
>> +int (*survey)(const char *, char *, int *);
>>  int (*lookup_phy)(const char *, char *);
>>  void (*close)(void);
>>  };
>> diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c
>> index 0e0206b..71465b5 100644
>> --- a/iwinfo_nl80211.c
>> +++ b/iwinfo_nl80211.c
>> @@ -1678,6 +1678,59 @@ static void nl80211_parse_rateinfo(struct nlattr **ri,
>>  re->is_40mhz = (re->mhz == 40);
>>  }
>>  
>> +static int nl80211_get_survey_cb(struct nl_msg *msg, void *arg)
>> +{
>> +struct nl80211_array_buf *arr = arg;
>> +struct iwinfo_survey_entry *e = arr->buf;
>> +struct nlattr **attr = nl80211_parse(msg);
>> +struct nlattr *sinfo[NL80211_SURVEY_INFO_MAX + 1];
>> +int rc;
>> +
>> +static struct nla_policy survey_policy[NL80211_SURVEY_INFO_MAX + 1] = {
>> +[NL80211_SURVEY_INFO_FREQUENCY] = { .type = NLA_U32 },
>> +[NL80211_SURVEY_INFO_NOISE]  = { .type = NLA_U8 },
>> +[NL80211_SURVEY_INFO_TIME] = { .type = NLA_U64   },
>> +[NL80211_SURVEY_INFO_TIME_BUSY] = { .type = NLA_U64   },
>> +[NL80211_SURVEY_INFO_TIME_EXT_BUSY] = { .type = NLA_U64   },
>> +[NL80211_SURVEY_INFO_TIME_RX] = { .type = NLA_U64   },
>> +[NL80211_SURVEY_INFO_TIME_TX] = { .type = NLA_U64   },
>> +};
>> +
>> +rc = nla_parse_nested(sinfo, NL80211_SURVEY_INFO_MAX,
>> +attr[NL80211_ATTR_SURVEY_INFO],
>> +survey_policy);
>> +if (rc)
>> +return NL_SKIP;
>> +
>> +/* advance to end of array */
>> +e += arr->count;
>> +memset(e, 0, sizeof(*e));
>> +
>> +if (sinfo[NL80211_SURVEY_INFO_FREQUENCY])
>> +e->mhz = nla_get_u32(sinfo[NL80211_SURVEY_INFO_FREQUENCY]);
>> +
>> +if (sinfo[NL80211_SURVEY_INFO_NOISE])
>> +e->noise = nla_get_u8(sinfo[NL80211_SURVEY_INFO_NOISE]);
>> +
>> +if (sinfo[NL80211_SURVEY_INFO_TIME])
>> +e->active_time = nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME]);
>> +
>> +if (sinfo[NL80211_SURVEY_INFO_TIME_BUSY])
>> +e->busy_time = 
>> nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_BUSY]);
>> +
>> +if (sinfo[NL80211_SURVEY_INFO_TIME_EXT_BUSY])
>> +e->busy_time_ext = 
>> nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_EXT_BUSY]);
>> +
>> +if (sinfo[NL80211_SURVEY_INFO_TIME_RX])
>> +e->rxtime = nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_RX]);
>> +
>> +if (sinfo[NL80211_SURVEY_INFO_TIME_TX])
>> +e->txtime = nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_TX]);
>> +
>> +arr->count++;
>> +return NL_SKIP;
>> +}
>> +
>>  static int nl80211_get_assoclist_cb(struct nl_msg *msg, void *arg)
>>  {
>>  struct nl80211_array_buf *arr = arg;
>> @@ -1812,6 +1865,21 @@ static int nl80211_get_assoclist_cb(struct nl_msg 
>> *msg, void *arg)
>>  return NL_SKIP;
>>  }
>>  
>> +static int nl80211_get_survey(const char *ifname, char *buf, int *len)
>> +{
>> +struct nl80211_array_buf arr = { .buf = buf, .count = 0 };
>> +int rc;
>> +
>> +rc = nl80211_request(ifname, NL80211_CMD_GET_SURVEY,
>> +NLM_F_DUMP, nl80211_get_survey_cb, &arr);
>> +if (!rc)
>> +*len = (arr.count * sizeof(struct iwinfo_survey_entry));
>> +else
>> +*len = 0;
>> +
>> +return 0;
>> +}
>> +
>>  static int nl80211_get_assoclist(const char *ifname, char *buf, int *len)
>>  {
>>  DIR *d;
>> @@ -2862,6 +2930,7 @@ const struct iwinfo_ops nl80211_ops = {
>>  .scanlist = nl80211_get_scanlist,
>>  .freqlist = nl80211_get_freqlist,
>>  .countrylist  = nl80211_get_cou

Re: [OpenWrt-Devel] [PATCH 2/2] iwinfo: nl80211: add survey.

2018-07-04 Thread Nick
I wanted to add this info too. See previous emails: "iwinfo: add channel
survey"
I think you are making the survey for all channels?
My attention was only a survey for the used channel.


On 03.07.2018 15:32, Daniel Danzberger wrote:
> Signed-off-by: Daniel Danzberger 
> ---
>  include/iwinfo.h | 11 
>  iwinfo_nl80211.c | 69 
>  2 files changed, 80 insertions(+)
>
> diff --git a/include/iwinfo.h b/include/iwinfo.h
> index 4111205..49ee7f0 100644
> --- a/include/iwinfo.h
> +++ b/include/iwinfo.h
> @@ -128,6 +128,16 @@ struct iwinfo_assoclist_entry {
>   uint32_t thr;
>  };
>  
> +struct iwinfo_survey_entry {
> + uint64_t active_time;
> + uint64_t busy_time;
> + uint64_t busy_time_ext;
> + uint64_t rxtime;
> + uint64_t txtime;
> + uint32_t mhz;
> + uint8_t noise;
> +};
> +
>  struct iwinfo_txpwrlist_entry {
>   uint8_t  dbm;
>   uint16_t mw;
> @@ -223,6 +233,7 @@ struct iwinfo_ops {
>   int (*scanlist)(const char *, char *, int *);
>   int (*freqlist)(const char *, char *, int *);
>   int (*countrylist)(const char *, char *, int *);
> + int (*survey)(const char *, char *, int *);
>   int (*lookup_phy)(const char *, char *);
>   void (*close)(void);
>  };
> diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c
> index 0e0206b..71465b5 100644
> --- a/iwinfo_nl80211.c
> +++ b/iwinfo_nl80211.c
> @@ -1678,6 +1678,59 @@ static void nl80211_parse_rateinfo(struct nlattr **ri,
>   re->is_40mhz = (re->mhz == 40);
>  }
>  
> +static int nl80211_get_survey_cb(struct nl_msg *msg, void *arg)
> +{
> + struct nl80211_array_buf *arr = arg;
> + struct iwinfo_survey_entry *e = arr->buf;
> + struct nlattr **attr = nl80211_parse(msg);
> + struct nlattr *sinfo[NL80211_SURVEY_INFO_MAX + 1];
> + int rc;
> +
> + static struct nla_policy survey_policy[NL80211_SURVEY_INFO_MAX + 1] = {
> + [NL80211_SURVEY_INFO_FREQUENCY] = { .type = NLA_U32 },
> + [NL80211_SURVEY_INFO_NOISE]  = { .type = NLA_U8 },
> + [NL80211_SURVEY_INFO_TIME] = { .type = NLA_U64   },
> + [NL80211_SURVEY_INFO_TIME_BUSY] = { .type = NLA_U64   },
> + [NL80211_SURVEY_INFO_TIME_EXT_BUSY] = { .type = NLA_U64   },
> + [NL80211_SURVEY_INFO_TIME_RX] = { .type = NLA_U64   },
> + [NL80211_SURVEY_INFO_TIME_TX] = { .type = NLA_U64   },
> + };
> +
> + rc = nla_parse_nested(sinfo, NL80211_SURVEY_INFO_MAX,
> + attr[NL80211_ATTR_SURVEY_INFO],
> + survey_policy);
> + if (rc)
> + return NL_SKIP;
> +
> + /* advance to end of array */
> + e += arr->count;
> + memset(e, 0, sizeof(*e));
> +
> + if (sinfo[NL80211_SURVEY_INFO_FREQUENCY])
> + e->mhz = nla_get_u32(sinfo[NL80211_SURVEY_INFO_FREQUENCY]);
> +
> +if (sinfo[NL80211_SURVEY_INFO_NOISE])
> + e->noise = nla_get_u8(sinfo[NL80211_SURVEY_INFO_NOISE]);
> +
> +if (sinfo[NL80211_SURVEY_INFO_TIME])
> + e->active_time = nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME]);
> +
> +if (sinfo[NL80211_SURVEY_INFO_TIME_BUSY])
> + e->busy_time = 
> nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_BUSY]);
> +
> +if (sinfo[NL80211_SURVEY_INFO_TIME_EXT_BUSY])
> +e->busy_time_ext = 
> nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_EXT_BUSY]);
> +
> +if (sinfo[NL80211_SURVEY_INFO_TIME_RX])
> +e->rxtime = nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_RX]);
> +
> +if (sinfo[NL80211_SURVEY_INFO_TIME_TX])
> + e->txtime = nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_TX]);
> +
> + arr->count++;
> + return NL_SKIP;
> +}
> +
>  static int nl80211_get_assoclist_cb(struct nl_msg *msg, void *arg)
>  {
>   struct nl80211_array_buf *arr = arg;
> @@ -1812,6 +1865,21 @@ static int nl80211_get_assoclist_cb(struct nl_msg 
> *msg, void *arg)
>   return NL_SKIP;
>  }
>  
> +static int nl80211_get_survey(const char *ifname, char *buf, int *len)
> +{
> + struct nl80211_array_buf arr = { .buf = buf, .count = 0 };
> + int rc;
> +
> + rc = nl80211_request(ifname, NL80211_CMD_GET_SURVEY,
> + NLM_F_DUMP, nl80211_get_survey_cb, &arr);
> + if (!rc)
> + *len = (arr.count * sizeof(struct iwinfo_survey_entry));
> + else
> + *len = 0;
> +
> + return 0;
> +}
> +
>  static int nl80211_get_assoclist(const char *ifname, char *buf, int *len)
>  {
>   DIR *d;
> @@ -2862,6 +2930,7 @@ const struct iwinfo_ops nl80211_ops = {
>   .scanlist = nl80211_get_scanlist,
>   .freqlist = nl80211_get_freqlist,
>   .countrylist  = nl80211_get_countrylist,
> + .survey   = nl80211_get_survey,
>   .lookup_phy   = nl80211_lookup_phyname,
>   .close= nl80211_close
>  };


___
ope

[OpenWrt-Devel] [PATCH 2/2] iwinfo: nl80211: add survey.

2018-07-03 Thread Daniel Danzberger
Signed-off-by: Daniel Danzberger 
---
 include/iwinfo.h | 11 
 iwinfo_nl80211.c | 69 
 2 files changed, 80 insertions(+)

diff --git a/include/iwinfo.h b/include/iwinfo.h
index 4111205..49ee7f0 100644
--- a/include/iwinfo.h
+++ b/include/iwinfo.h
@@ -128,6 +128,16 @@ struct iwinfo_assoclist_entry {
uint32_t thr;
 };
 
+struct iwinfo_survey_entry {
+   uint64_t active_time;
+   uint64_t busy_time;
+   uint64_t busy_time_ext;
+   uint64_t rxtime;
+   uint64_t txtime;
+   uint32_t mhz;
+   uint8_t noise;
+};
+
 struct iwinfo_txpwrlist_entry {
uint8_t  dbm;
uint16_t mw;
@@ -223,6 +233,7 @@ struct iwinfo_ops {
int (*scanlist)(const char *, char *, int *);
int (*freqlist)(const char *, char *, int *);
int (*countrylist)(const char *, char *, int *);
+   int (*survey)(const char *, char *, int *);
int (*lookup_phy)(const char *, char *);
void (*close)(void);
 };
diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c
index 0e0206b..71465b5 100644
--- a/iwinfo_nl80211.c
+++ b/iwinfo_nl80211.c
@@ -1678,6 +1678,59 @@ static void nl80211_parse_rateinfo(struct nlattr **ri,
re->is_40mhz = (re->mhz == 40);
 }
 
+static int nl80211_get_survey_cb(struct nl_msg *msg, void *arg)
+{
+   struct nl80211_array_buf *arr = arg;
+   struct iwinfo_survey_entry *e = arr->buf;
+   struct nlattr **attr = nl80211_parse(msg);
+   struct nlattr *sinfo[NL80211_SURVEY_INFO_MAX + 1];
+   int rc;
+
+   static struct nla_policy survey_policy[NL80211_SURVEY_INFO_MAX + 1] = {
+   [NL80211_SURVEY_INFO_FREQUENCY] = { .type = NLA_U32 },
+   [NL80211_SURVEY_INFO_NOISE]  = { .type = NLA_U8 },
+   [NL80211_SURVEY_INFO_TIME] = { .type = NLA_U64   },
+   [NL80211_SURVEY_INFO_TIME_BUSY] = { .type = NLA_U64   },
+   [NL80211_SURVEY_INFO_TIME_EXT_BUSY] = { .type = NLA_U64   },
+   [NL80211_SURVEY_INFO_TIME_RX] = { .type = NLA_U64   },
+   [NL80211_SURVEY_INFO_TIME_TX] = { .type = NLA_U64   },
+   };
+
+   rc = nla_parse_nested(sinfo, NL80211_SURVEY_INFO_MAX,
+   attr[NL80211_ATTR_SURVEY_INFO],
+   survey_policy);
+   if (rc)
+   return NL_SKIP;
+
+   /* advance to end of array */
+   e += arr->count;
+   memset(e, 0, sizeof(*e));
+
+   if (sinfo[NL80211_SURVEY_INFO_FREQUENCY])
+   e->mhz = nla_get_u32(sinfo[NL80211_SURVEY_INFO_FREQUENCY]);
+
+if (sinfo[NL80211_SURVEY_INFO_NOISE])
+   e->noise = nla_get_u8(sinfo[NL80211_SURVEY_INFO_NOISE]);
+
+if (sinfo[NL80211_SURVEY_INFO_TIME])
+   e->active_time = nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME]);
+
+if (sinfo[NL80211_SURVEY_INFO_TIME_BUSY])
+   e->busy_time = 
nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_BUSY]);
+
+if (sinfo[NL80211_SURVEY_INFO_TIME_EXT_BUSY])
+e->busy_time_ext = 
nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_EXT_BUSY]);
+
+if (sinfo[NL80211_SURVEY_INFO_TIME_RX])
+e->rxtime = nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_RX]);
+
+if (sinfo[NL80211_SURVEY_INFO_TIME_TX])
+   e->txtime = nla_get_u64(sinfo[NL80211_SURVEY_INFO_TIME_TX]);
+
+   arr->count++;
+   return NL_SKIP;
+}
+
 static int nl80211_get_assoclist_cb(struct nl_msg *msg, void *arg)
 {
struct nl80211_array_buf *arr = arg;
@@ -1812,6 +1865,21 @@ static int nl80211_get_assoclist_cb(struct nl_msg *msg, 
void *arg)
return NL_SKIP;
 }
 
+static int nl80211_get_survey(const char *ifname, char *buf, int *len)
+{
+   struct nl80211_array_buf arr = { .buf = buf, .count = 0 };
+   int rc;
+
+   rc = nl80211_request(ifname, NL80211_CMD_GET_SURVEY,
+   NLM_F_DUMP, nl80211_get_survey_cb, &arr);
+   if (!rc)
+   *len = (arr.count * sizeof(struct iwinfo_survey_entry));
+   else
+   *len = 0;
+
+   return 0;
+}
+
 static int nl80211_get_assoclist(const char *ifname, char *buf, int *len)
 {
DIR *d;
@@ -2862,6 +2930,7 @@ const struct iwinfo_ops nl80211_ops = {
.scanlist = nl80211_get_scanlist,
.freqlist = nl80211_get_freqlist,
.countrylist  = nl80211_get_countrylist,
+   .survey   = nl80211_get_survey,
.lookup_phy   = nl80211_lookup_phyname,
.close= nl80211_close
 };
-- 
2.18.0


___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel