Skip to content

Commit d673548

Browse files
author
Arto Kinnunen
authored
Merge pull request #13530 from mikaleppanen/radius_retry_timer_conf
[feature-wisun] Added configuration for RADIUS retry timer to WisunBorderRouter
2 parents e46dd97 + 417c888 commit d673548

File tree

3 files changed

+165
-6
lines changed

3 files changed

+165
-6
lines changed

features/nanostack/mbed-mesh-api/mbed-mesh-api/WisunBorderRouter.h

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,18 @@ typedef struct ws_br_route_info {
5050
uint8_t parent[8];
5151
} ws_br_route_info_t;
5252

53+
/**
54+
* \brief Struct ws_br_radius_timing_t is RADIUS timing configuration structure.
55+
*/
56+
typedef struct ws_br_radius_timing {
57+
/** RADIUS retry trickle timer Imin; in 100ms units; range 1-1200; default 20 (2 seconds) */
58+
uint16_t radius_retry_imin;
59+
/** RADIUS retry trickle timer Imax; in 100ms units; range 1-1200; default 30 (3 seconds) */
60+
uint16_t radius_retry_imax;
61+
/** RADIUS retry trickle count; default 3 */
62+
uint8_t radius_retry_count;
63+
} ws_br_radius_timing_t;
64+
5365
/** Wi-SUN Border Router class
5466
*
5567
* Class can be used to start, stop and configure Wi-SUN Border Router.
@@ -273,17 +285,55 @@ class WisunBorderRouter {
273285
* */
274286
mesh_error_t set_dns_query_result(SocketAddress *address, char *domain_name);
275287

288+
/**
289+
* \brief Set Wi-SUN RADIUS timing parameters.
290+
*
291+
* Function sets RADIUS timing parameters to Border Router. For RADIUS retry trickle timer default
292+
* settings are that the first retry is done between 1 to 3 seconds after the initial attempt and
293+
* all retries are done in maximum in 9 seconds.
294+
*
295+
* \param timing Timing parameters.
296+
* \return MESH_ERROR_NONE on success.
297+
* \return error value in case of failure.
298+
* */
299+
mesh_error_t set_radius_timing(ws_br_radius_timing_t *timing);
300+
301+
/**
302+
* \brief Get Wi-SUN RADIUS timing parameters.
303+
*
304+
* Function gets RADIUS timing parameters from Border Router.
305+
*
306+
* \param timing Timing parameters.
307+
* \return MESH_ERROR_NONE on success.
308+
* \return error value in case of failure.
309+
* */
310+
mesh_error_t get_radius_timing(ws_br_radius_timing_t *timing);
311+
312+
/**
313+
* \brief Validate Wi-SUN RADIUS timing parameters.
314+
*
315+
* Function validates RADIUS timing parameters on Border Router.
316+
*
317+
* \param timing Timing parameters.
318+
* \return MESH_ERROR_NONE on success.
319+
* \return error value in case of failure.
320+
* */
321+
mesh_error_t validate_radius_timing(ws_br_radius_timing_t *timing);
322+
276323
private:
277324
mesh_error_t configure();
278325
mesh_error_t apply_configuration(int8_t mesh_if_id);
279326
mesh_error_t set_bbr_radius_address(void);
280-
mesh_error_t set_bbr_radius_shared_secret();
327+
mesh_error_t set_bbr_radius_shared_secret(void);
328+
mesh_error_t set_bbr_radius_timing(void);
281329
char _radius_ipv6_addr[40];
330+
ws_br_radius_timing_t _radius_timing;
282331
char *_shared_secret = NULL;
283332
uint16_t _shared_secret_len = 0;
284333
int8_t _mesh_if_id = -1;
285334
bool _radius_ipv6_addr_set = false;
286335
bool _configured = false;
336+
bool _radius_timing_set = false;
287337
};
288338

289339
#endif

features/nanostack/mbed-mesh-api/mbed_lib.json

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,19 @@
207207
"radius-shared-secret-len": {
208208
"help": "RADIUS shared secret length; If length is not defined, strlen() is used to determine RADIUS shared secret length",
209209
"value": null
210-
}
210+
},
211+
"radius-retry-imin": {
212+
"help": "RADIUS retry trickle timer Imin; in 100ms units; range 1-1200; default 20 (2 seconds)",
213+
"value": 20
214+
},
215+
"radius-retry-imax": {
216+
"help": "RADIUS retry trickle timer Imax; in 100ms units; range 1-1200; default 30 (3 seconds)",
217+
"value": 30
218+
},
219+
"radius-retry-count": {
220+
"help": "RADIUS retry trickle count; default 3",
221+
"value": 3
222+
}
211223
},
212224
"target_overrides": {
213225
"KW24D": {

features/nanostack/mbed-mesh-api/source/WisunBorderRouter.cpp

Lines changed: 101 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ void WisunBorderRouter::stop()
109109

110110
mesh_error_t WisunBorderRouter::configure()
111111
{
112-
#if defined(MBED_CONF_MBED_MESH_API_RADIUS_SHARED_SECRET) || defined(MBED_CONF_MBED_MESH_API_RADIUS_SERVER_IPV6_ADDRESS)
112+
#if defined(MBED_CONF_MBED_MESH_API_RADIUS_SHARED_SECRET) || defined(MBED_CONF_MBED_MESH_API_RADIUS_SERVER_IPV6_ADDRESS) || defined(MBED_CONF_MBED_MESH_API_RADIUS_RETRY_IMIN)
113113
mesh_error_t status;
114114
#endif
115115

@@ -139,23 +139,40 @@ mesh_error_t WisunBorderRouter::configure()
139139
if (status != MESH_ERROR_NONE) {
140140
tr_error("Failed to set RADIUS server IPv6 address!");
141141
}
142+
143+
#if defined(MBED_CONF_MBED_MESH_API_RADIUS_RETRY_IMIN) || defined(MBED_CONF_MBED_MESH_API_RADIUS_RETRY_IMAX) || defined(MBED_CONF_MBED_MESH_API_RADIUS_RETRY_COUNT)
144+
ws_br_radius_timing_t timing {
145+
.radius_retry_imin = MBED_CONF_MBED_MESH_API_RADIUS_RETRY_IMIN,
146+
.radius_retry_imax = MBED_CONF_MBED_MESH_API_RADIUS_RETRY_IMAX,
147+
.radius_retry_count = MBED_CONF_MBED_MESH_API_RADIUS_RETRY_COUNT
148+
};
149+
status = set_radius_timing(&timing);
150+
if (status != MESH_ERROR_NONE) {
151+
tr_error("Failed to set RADIUS timing parameters!");
152+
}
142153
#endif
143154

155+
#endif
144156
return MESH_ERROR_NONE;
145157
}
146158

147159
mesh_error_t WisunBorderRouter::apply_configuration(int8_t mesh_if_id)
148160
{
161+
configure();
162+
149163
mesh_error_t status = set_bbr_radius_address();
150164
if (status != MESH_ERROR_NONE) {
151165
tr_error("Failed to apply RADIUS server IPv6 address!");
152-
return MESH_ERROR_PARAM;
153166
}
154167

155168
status = set_bbr_radius_shared_secret();
156169
if (status != MESH_ERROR_NONE) {
157170
tr_error("Failed to apply RADIUS server IPv6 address!");
158-
return MESH_ERROR_PARAM;
171+
}
172+
173+
status = set_bbr_radius_timing();
174+
if (status != MESH_ERROR_NONE) {
175+
tr_error("Failed to apply RADIUS timing parameters!");
159176
}
160177

161178
return MESH_ERROR_NONE;
@@ -328,7 +345,7 @@ mesh_error_t WisunBorderRouter::set_radius_shared_secret(uint16_t shared_secret_
328345
return set_bbr_radius_shared_secret();
329346
}
330347

331-
mesh_error_t WisunBorderRouter::set_bbr_radius_shared_secret()
348+
mesh_error_t WisunBorderRouter::set_bbr_radius_shared_secret(void)
332349
{
333350
if (_shared_secret_len == 0 || _shared_secret == NULL) {
334351
return MESH_ERROR_UNKNOWN;
@@ -372,3 +389,83 @@ mesh_error_t WisunBorderRouter::set_dns_query_result(SocketAddress *address, cha
372389

373390
return MESH_ERROR_UNKNOWN;
374391
}
392+
393+
mesh_error_t WisunBorderRouter::set_radius_timing(ws_br_radius_timing_t *timing)
394+
{
395+
if (timing == NULL) {
396+
return MESH_ERROR_PARAM;
397+
}
398+
399+
if (validate_radius_timing(timing) != MESH_ERROR_NONE) {
400+
return MESH_ERROR_PARAM;
401+
}
402+
403+
_radius_timing = *timing;
404+
_radius_timing_set = true;
405+
406+
return set_bbr_radius_timing();
407+
}
408+
409+
mesh_error_t WisunBorderRouter::set_bbr_radius_timing(void)
410+
{
411+
if (!_radius_timing_set) {
412+
return MESH_ERROR_NONE;
413+
}
414+
415+
bbr_radius_timing_t bbr_timing = {
416+
.radius_retry_imin = _radius_timing.radius_retry_imin,
417+
.radius_retry_imax = _radius_timing.radius_retry_imax,
418+
.radius_retry_count = _radius_timing.radius_retry_count
419+
};
420+
421+
int status = ws_bbr_radius_timing_set(_mesh_if_id, &bbr_timing);
422+
if (status != 0) {
423+
return MESH_ERROR_UNKNOWN;
424+
}
425+
426+
return MESH_ERROR_NONE;
427+
}
428+
429+
mesh_error_t WisunBorderRouter::get_radius_timing(ws_br_radius_timing_t *timing)
430+
{
431+
if (timing == NULL) {
432+
return MESH_ERROR_PARAM;
433+
}
434+
435+
if (_radius_timing_set) {
436+
*timing = _radius_timing;
437+
return MESH_ERROR_NONE;
438+
}
439+
440+
bbr_radius_timing_t bbr_timing;
441+
int status = ws_bbr_radius_timing_get(_mesh_if_id, &bbr_timing);
442+
if (status != 0) {
443+
return MESH_ERROR_UNKNOWN;
444+
}
445+
446+
timing->radius_retry_imin = bbr_timing.radius_retry_imin;
447+
timing->radius_retry_imax = bbr_timing.radius_retry_imax;
448+
timing->radius_retry_count = bbr_timing.radius_retry_count;
449+
450+
return MESH_ERROR_NONE;
451+
}
452+
453+
mesh_error_t WisunBorderRouter::validate_radius_timing(ws_br_radius_timing_t *timing)
454+
{
455+
if (timing == NULL) {
456+
return MESH_ERROR_PARAM;
457+
}
458+
459+
bbr_radius_timing_t bbr_timing = {
460+
.radius_retry_imin = timing->radius_retry_imin,
461+
.radius_retry_imax = timing->radius_retry_imax,
462+
.radius_retry_count = timing->radius_retry_count
463+
};
464+
465+
int status = ws_bbr_radius_timing_validate(_mesh_if_id, &bbr_timing);
466+
if (status != 0) {
467+
return MESH_ERROR_UNKNOWN;
468+
}
469+
470+
return MESH_ERROR_NONE;
471+
}

0 commit comments

Comments
 (0)