Commit graph

77 commits

Author SHA1 Message Date
Eneas U de Queiroz
97e5de157f uci: add neighbor list priority options
This adds config options to define MACSs of neighbors to be on top of
each band's neighbor list.  This is important, because some clients will
limit the number of entries they use.  iOS devices, for exmample, use
only the top 6 APs.

The neighbors_11g and neighbors_11a take a list or space-separated
string of AP BSSIDs to keep at the top of each band's neighbor report.

The list is used when the neighbor report is being assembled.  Any
listed AP that is not online will not be included in that report.  When
the next report is assembled, if the AP is back online, then they are
restored to the indicated order.

There's only one list for each band.  In case of multiple SSIDs, you can
include BSSIDs for all of them, and they will be filtered by SSID when
assembling the reports.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-08-05 21:51:44 +02:00
Eneas U de Queiroz
2b1a53cddc dawn_uci: set default values
This sets the default metric values to the ones currently used in the
openwrt package config file.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-08-05 21:51:44 +02:00
Eneas U de Queiroz
6eb747b4d4 Use separate configs for 802.11g & 802.11a bands
This changes the metrics variables that invove scores to arrays.  At the
momemnt, there are two bands implemented, 802_11a and 802_11g.
Internally, they are chosen based on the frequency of the channel being
used.  Anything < 2500 MHz is 802_11g, and everything else is 802_11a.
Dawn will issue a warning if it finds a frequency greater or equal to
5925 MHz.  The upper limit of the 802.11a band, and the start of the
next band vary by country, so this will have to be reviewed.

The UCI configuration changes.  Instead of a single metric config, there
will be a global metric config, and one for each band.  The
non-band-specific configuration will only work in the global config.
Any per-band configuration present at the global config will be applied
to all bands.  Any configuration present at the specific band will
override any global values.

The following configuration options are split into bands:
 - ap_weight
 - ht_support
 - vht_support
 - no_ht_support
 - no_vht_support
 - rssi
 - rssi_val
 - low_rssi
 - low_rssi_val
 - freq
 - chan_util
 - max_chan_util
 - chan_util_val
 - max_chan_util_val

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-08-05 21:51:44 +02:00
Eneas U de Queiroz
1e34357bdc Verify compatibility before parsing config message
This adds a verion field to the ubus configuration message, to avoid
acting upon a message from an incompatible version of dawn.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-08-05 21:51:44 +02:00
Eneas U de Queiroz
a7a830950a List all neighbors with same score when kicking
The wnm_disassoc_imminent procedure takes a list of neighbor reports to
send to the client.

Instead of picking just one AP to be sent, send all that have the same
score.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-08-05 21:51:44 +02:00
Eneas U de Queiroz
3ba0fa4947 Change beacon request fields to appropriate values
This changes the op_class, channel, and SSID fields used to send a
beacon request.  Op_class and channel were set from the UCI config file,
but they are dependent on the band being used--they define the frequency
used.  The values can be taken from the AP's own neighbor report.

The SSID was set with a blank string, which would return beacons from
any SSID.  Since we only care about our own SSID, there's no need to
waste resorces with reports from other SSIDs.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-08-05 21:51:44 +02:00
Eneas U de Queiroz
009aab9ca4 Change mode config parameter from int to string
This renames "mode" to "rrm_mode", and its type from int to string.
This way, we can set the correct mode for a probe request from the STA
reported capabilities, along with the preferred order of modes, set by
the "rrm_mode" uci config.

rrm_mode is a string of possible mode letters:
'p' = passive report
'a' = active report
'b' or 't' = beacon table report.

Setting rrm_mode='pat', will try to send passive reports, if available;
if not, it will try an active report, using a beacon table if all else
fails.

If you don't include a letter, the corresponding report type will be
disabled.  An empty string will disable beacon reports.  Unrecognized
letters are ignored, as well as repeated modes.  If the configuration is
not present, a default value of 'pat' will be used.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-07-28 14:51:42 +02:00
Eneas U de Queiroz
276ca169a7 msghandler: fix rrm array parsing
dump_rrm_table was called from dump_client with the pointer to the table
data, not the table itself.

Since only the first byte is needed, it can be fetched right away
without looping through the table values, so we can just call
dump_rrm_data passing the table data pointer.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-07-27 15:36:53 +02:00
Eneas U de Queiroz
1e4871d70a datastorage: debug rrm capabilities
This adds a debugging line showing the RRM report capabilities bits.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-07-27 15:36:53 +02:00
Rosen Penev
ec9a3a96e8 fix GCC11 compilation 2021-07-11 13:57:24 +02:00
Eneas U de Queiroz
555268b91d ubus: filter neighbors by SSID when preparing nr
Only add neighbors with the same SSID to an interface's neighbor report.
While it is possible to offer roaming to a different SSID, it is often
not desired, while at least Apple devices limit the number of entries
they will use to 6.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-07-08 16:44:04 +02:00
Eneas U de Queiroz
3db9607b14 data storage: match SSID when searching ap entry
Currenty, ap_array_get_ap returns an entry by matching just the bssid,
without checking if the SSID matches.

ap_array_find_first_entry does a binary search through the ap set
without cheking the SSID, which is bad, as the list is sorted by SSID
then by bssid_mac.

As a side effect, if you have more than one ssid, the network ap list
grows unbounded over time.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-07-08 16:44:04 +02:00
Eneas U de Queiroz
a22f5a79d6 storage: ensure SSID strings are NULL-terminated
SSID_MAX_LEN is set at 32, which is the maximum allowed size of a SSID.
The strings holding SSIDs were set at that same size, which does not
allow for proper string termination.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
2021-07-08 16:44:04 +02:00
Polynomialdivision
8ce09d64de CMakeList: fix compiling with glibc 2020-12-31 00:00:33 +01:00
Polynomialdivision
b639145ce9 ubus: fix rrm string callback function
The rrm_nr_get_own call returns an array. We need the 3rd value. We do
not need to call blobmsg_data before blobmsg_get_string to extract the
value. Additionally this causes strange behavior where an offset in the
string is accessed.
2020-09-03 03:45:25 +02:00
Polynomialdivision
c2c0009d61 datastorage: fix hearingmap not synced
The datastorage-refactoring changes an already existing entry instead
of inserting and deleting it. However, it was forgotten to adopt
some information from the new probe entry.

The ht_capabilities and vht_capabilities are now synced correctly.

RCPI and RSNI is now correctly synced.
2020-08-26 12:05:50 +02:00
Polynomialdivision
25a493c438 tcpsocket: add option to add server ip
A new config option allows to add a server ip
	option server_ip '10.0.0.2'

However, this server does not send anything back. Therefore it is not
possible to change the node configuration. This will probably be added
soon. The main goal of this commit is to allow monitoring of all nodes
in a network with DAWN, e.g. clients, channel utilization, ...

Also a network option (3) has been added which allows to use TCP but
not to announce your daemon in the broadcast domain. This allows you to
create a monitor-only node that holds only the local information and
forwards it to the central server.

A monitor-only node could be configured like
	option server_ip '10.0.0.1'
	option tcp_port '1026'
	option network_option '3'

Another possible config is
        option server_ip '10.0.0.1'
        option tcp_port '1026'
        option network_option '3'
Here, the node shares information with a central server, which can be
located outside the broadcast domain. Nevertheless, it also shares
information within its broadcast domain and can therefore perform
client steering.
2020-08-21 23:03:56 +02:00
Polynomialdivision
1da5ad5a96 dawn_uci: fix crashing when uci config is received
Before we can unload the config, we have to search the package again.
2020-08-21 18:31:23 +02:00
Ian Clowes
50d54a6253 tcpsocket: leave loop if we read 0 byte
It can happen that the callback is executed but there are 0 bytes to read. If this happens we leave the while-loop.

Ian Clowes:
- fix

Nick:
- commit message
2020-08-07 12:05:27 +02:00
Ian Clowes
dfbaa055a4 tcpsocket: fix read callback function and arbitrary memory allocations
If not all of the message was in the stream after the header was read,
the next bytes remain in the buffer and only the header is removed from
the stream. The next time the callback is called, something that is not
a header will be interpreted as a header, resulting in arbitrary memory
allocations.

Ian Clowes:
- code

Nick:
- commit message
- fix processing of messages
2020-08-06 23:57:06 +02:00
Ian Clowes
117a340b9d datastorage: fixes to linked list handling
general: fixed whitespace and typos
memory audit: on by default in build
memory audit: enhanced audit info
ubus: refactor denied_req expiry to assist datastorage testing
datastorage: fixed performance bug in handling of linked list entry expiry
datastorage: fixed SEGV in skip list handling
test_storage: added linked list memory allocation stress tests
2020-08-05 12:30:19 +02:00
Ian Clowes
34da5328f6 memory auditing: bug fixes to memory auditing and hearing map
memory auditing: refined auditing code and use in main code
hearing map: fixed bug causing it not be be built correctly
datastorage: fixed memory leak from linked list handling
2020-08-05 12:29:47 +02:00
Ian-Clowes
d56c5c4e15 general: add memory auditing
memory_utils: added to wrap memory alloc / free
general: adjusted stabdard and other memory allocs t be audited
2020-08-05 12:28:49 +02:00
Ian-Clowes
421324486f datastorage: fixed use of wrong client search 2020-08-05 12:27:51 +02:00
Ian Clowes
7262cf02d0 datastorage/test: improve scalability and performance
datastorage: convert to linked lists and optimise use of pointers
datastorage: AP, client, probe, auth entry and MAC list converted to
             linked list
datastorage: functions adjusted to take pointers as parameters
datastorage: optimised sort and search functions added
mac_utils: struct dawn_mac added and comparisons adjusted
general: adjust code to  call new datastorage functions
test_storage: large scale 100 AP, 3000 client, 70k probe added

[fix commit]
Signed-off-by: Nick Hainke <vincent@systemli.org>
2020-08-04 09:50:48 +02:00
Rosen Penev
2f585043c3 test_storage: fix compilation with musl 1.2.0
time_t is 64-bit, even under 32-bit OSes.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
2020-07-21 10:06:33 +02:00
twy_2000
32640de378 dawn_uci: no need uci_alloc_context on each uci_set_network call 2020-07-12 13:58:47 +02:00
Ian Clowes
67c3ed0d0a test_storage: extend test harness; datastorage: two bug fixes
datastorage (bug fix): deleting expired array item would fail to test next item
test_storage: extended to cover all required datastorage entry points
test_storage: added ability to read script file
test_storage: added new and revised test scripts
TESTING.md: added to describe testing approach
general: added various TODO notes on things to come back to
general: revised #includes to make each "self-compiling"
general: revised #includes to minimise usage across source files
general: moved declarations and defintions to simplify and rationalise code
datastorage: refactor to support scalability testing
datastorage: made independent of time() calls to support testing
datastorage: fixed redundant use of both SORT_NUM and SORT_LENGTH defines
datastorage: fake kicking to test clients move between access points
msghandler: new module to reduce compile time interdependencies
mshhandler: (issue #100?) fixed SEGV memcpy() in dump_client() using strncpy()
ubus: merged uface into ubus
mac_utils: new module for MAC address utilites
test_header: added target to help #include rationalisation

Tested-by: Nick Hainke <vincent@systemli.org>
2020-07-12 13:47:23 +02:00
twy_2000
0f63e00c43 tcpsocket: free con after ustream write error and make list each safe list_each is not safe against removal of list entry 2020-06-18 22:16:42 +02:00
twy_2000
a6d0ea3d1d tcpsocket: ustream_pending_data before ustream_read
according to https://github.com/yousong/osocks/blob/master/main.c#L149
and ustream source code, directly ustream_read would make many packge incomplete.
2020-06-18 12:29:29 +02:00
twy_2000
b49c5b8552 malloc: add malloc failure wrapper 2020-06-18 12:29:14 +02:00
twy_2000
b029a40b11 Revert "Revert "tcpsocket: implement client_read_cb with ustream_read my wheels are much worse than offical wheels.""
This reverts commit c2a63293d1.
2020-06-18 12:29:10 +02:00
Polynomialdivision
ada3bf3ff2 uci: fix arm64 compiling
Fixes:
https://github.com/openwrt/packages/issues/12488#issuecomment-643138068
2020-06-12 10:46:49 +02:00
Polynomialdivision
c2a63293d1 Revert "tcpsocket: implement client_read_cb with ustream_read my wheels are much worse than offical wheels."
This reverts commit f7343a053c.
2020-06-12 10:45:33 +02:00
twy_2000
f7343a053c tcpsocket: implement client_read_cb with ustream_read my wheels are much worse than offical wheels. 2020-06-12 07:12:36 +02:00
Ian Clowes
292ccb01f2 test_storage: further refactoring, added test functionality, and TESTING.md to describe testing approach 2020-06-10 12:30:43 +02:00
David Woodhouse
bd35961de8 uci: truncate hostname at first dot
Oh, and stop at the size of the target buffer too.
2020-06-10 12:17:52 +02:00
Polynomialdivision
77619e9b18 ubus: use strncpy and add backwards compatibility 2020-06-09 13:00:07 +02:00
Polynomialdivision
ffa08dbccd ubus/uci/datastorage: add iface and hostname
The network overview now displays the interface name and hostname.
2020-06-09 11:19:56 +02:00
David Woodhouse
050c1d7fed tcpsocket: use fixed size and endianness for length prefix of network messages
We can't use host-dependent endianness for network traffic.
The size of size_t also varies from host to host so stick with uint32_t.

Fixes: #92
2020-06-08 13:19:21 +02:00
Polynomialdivision
534f786616 ubus: fix wrong parsing policy 2020-06-06 09:09:09 +02:00
Polynomialdivision
2151db28ef tcpsocket: fix debug msg format
Fixes: https://github.com/openwrt/packages/issues/12410
2020-06-05 11:08:50 +02:00
twy_2000
5ce4c978c8 ubus/datastorage: don't repeatedly ask devices for beacon reports if they don't support it 2020-06-01 18:47:00 +02:00
Polynomialdivision
71536468ff uci: fix loading of config 2020-06-01 10:15:58 +02:00
twy_2000
b5043ad98e utils/ubus: fix memory leak at blobmsg_format_json 2020-05-30 17:52:17 +02:00
Polynomialdivision
f603dde7f7 ubus: add local flag to network overview 2020-05-30 08:55:52 +02:00
Polynomialdivision
26745815e8 ubus: fix network overview 2020-05-30 08:48:33 +02:00
twy_2000
653ce9fa56 network/tcpsocket: make sure every msg is complete before handle 2020-05-29 22:51:28 +02:00
Ian Clowes
50d347c233 datastorage: refactor to support scalability testing 2020-05-28 00:29:15 +02:00
Polynomialdivision
3a6ef89998 ubus: addd empty aps
It was requested that DAWN should show the whole network, even
if no client is connected to an AP.
2020-05-27 11:17:26 +02:00