|
36 | 36 | #include <Weave/DeviceLayer/ThreadStackManager.h> |
37 | 37 | #include <Weave/DeviceLayer/OpenThread/OpenThreadUtils.h> |
38 | 38 | #include <openthread/ip6.h> |
| 39 | +#if WARM_CONFIG_SUPPORT_THREAD_ROUTING |
| 40 | +#include <openthread/border_router.h> |
| 41 | +#endif // WARM_CONFIG_SUPPORT_THREAD_ROUTING |
39 | 42 | #endif // WARM_CONFIG_SUPPORT_THREAD |
40 | 43 |
|
41 | 44 |
|
@@ -358,27 +361,132 @@ PlatformResult AddRemoveThreadAddress(InterfaceType inInterfaceType, const Inet: |
358 | 361 |
|
359 | 362 | #if WARM_CONFIG_SUPPORT_THREAD_ROUTING |
360 | 363 |
|
361 | | -#error "Weave Thread router support not implemented" |
362 | | - |
363 | 364 | PlatformResult StartStopThreadAdvertisement(InterfaceType inInterfaceType, const Inet::IPPrefix &inPrefix, bool inStart) |
364 | 365 | { |
365 | | - // TODO: implement me |
| 366 | + WEAVE_ERROR err = WEAVE_NO_ERROR; |
| 367 | + otError otErr; |
| 368 | + otBorderRouterConfig brConfig; |
| 369 | + |
| 370 | + VerifyOrExit(inInterfaceType == kInterfaceTypeThread, err = WEAVE_ERROR_INVALID_ARGUMENT); |
| 371 | + VerifyOrExit((inPrefix.Length & 7) == 0, err = WEAVE_ERROR_INVALID_ADDRESS); |
| 372 | + |
| 373 | + ThreadStackMgrImpl().LockThreadStack(); |
| 374 | + |
| 375 | + brConfig.mConfigure = false; |
| 376 | + brConfig.mDefaultRoute = false; |
| 377 | + brConfig.mDhcp = false; |
| 378 | + brConfig.mOnMesh = true; |
| 379 | + brConfig.mPreference = 0; |
| 380 | + brConfig.mPreferred = true; |
| 381 | + brConfig.mPrefix.mLength = inPrefix.Length; |
| 382 | + brConfig.mRloc16 = otThreadGetRloc16(ThreadStackMgrImpl().OTInstance()); |
| 383 | + brConfig.mSlaac = false; |
| 384 | + brConfig.mStable = true; |
| 385 | + memcpy(brConfig.mPrefix.mPrefix.mFields.m8, inPrefix.IPAddr.Addr, sizeof(brConfig.mPrefix.mPrefix.mFields)); |
| 386 | + |
| 387 | + if (inStart) |
| 388 | + { |
| 389 | + otErr = otBorderRouterAddOnMeshPrefix(ThreadStackMgrImpl().OTInstance(), &brConfig); |
| 390 | + } |
| 391 | + else |
| 392 | + { |
| 393 | + otErr = otBorderRouterRemoveOnMeshPrefix(ThreadStackMgrImpl().OTInstance(), &brConfig.mPrefix); |
| 394 | + if (otErr == OT_ERROR_NOT_FOUND) |
| 395 | + { |
| 396 | + WeaveLogProgress(DeviceLayer, "otBorderRouterRemoveOnMeshPrefix: already removed"); |
| 397 | + otErr = OT_ERROR_NONE; |
| 398 | + } |
| 399 | + } |
| 400 | + |
| 401 | + ThreadStackMgrImpl().UnlockThreadStack(); |
| 402 | + |
| 403 | + err = MapOpenThreadError(otErr); |
| 404 | + |
| 405 | +exit: |
| 406 | + if (err == WEAVE_NO_ERROR) |
| 407 | + { |
| 408 | +#if WEAVE_PROGRESS_LOGGING |
| 409 | + char ipAddrStr[INET6_ADDRSTRLEN]; |
| 410 | + inPrefix.IPAddr.ToString(ipAddrStr, sizeof(ipAddrStr)); |
| 411 | + WeaveLogProgress(DeviceLayer, "OpenThread OnMesh Prefix %s: %s/%d", |
| 412 | + (inStart) ? "Added" : "Removed", |
| 413 | + ipAddrStr, inPrefix.Length); |
| 414 | +#endif // WEAVE_PROGRESS_LOGGING |
| 415 | + } |
| 416 | + else |
| 417 | + { |
| 418 | + WeaveLogError(DeviceLayer, "StartStopThreadAdvertisement() failed: %s", ::nl::ErrorStr(err)); |
| 419 | + } |
| 420 | + |
| 421 | + return (err == WEAVE_NO_ERROR) ? kPlatformResultSuccess : kPlatformResultFailure; |
366 | 422 | } |
367 | 423 |
|
368 | 424 | #endif // WARM_CONFIG_SUPPORT_THREAD_ROUTING |
369 | 425 |
|
370 | 426 | #if WARM_CONFIG_SUPPORT_BORDER_ROUTING |
371 | 427 |
|
372 | | -#error "Weave border router support not implemented" |
373 | | - |
374 | 428 | PlatformResult AddRemoveThreadRoute(InterfaceType inInterfaceType, const Inet::IPPrefix &inPrefix, RoutePriority inPriority, bool inAdd) |
375 | 429 | { |
376 | | - // TODO: implement me |
| 430 | + otError otErr; |
| 431 | + otExternalRouteConfig routeConfig; |
| 432 | + |
| 433 | + int ot_priority = OT_ROUTE_PREFERENCE_HIGH; |
| 434 | + switch (inPriority) |
| 435 | + { |
| 436 | + case kRoutePriorityLow: |
| 437 | + ot_priority = OT_ROUTE_PREFERENCE_LOW; |
| 438 | + break; |
| 439 | + case kRoutePriorityHigh: |
| 440 | + ot_priority = OT_ROUTE_PREFERENCE_HIGH; |
| 441 | + break; |
| 442 | + case kRoutePriorityMedium: |
| 443 | + // Let's set route priority to medium by default. |
| 444 | + default: |
| 445 | + ot_priority = OT_ROUTE_PREFERENCE_MED; |
| 446 | + break; |
| 447 | + } |
| 448 | + |
| 449 | + ThreadStackMgrImpl().LockThreadStack(); |
| 450 | + |
| 451 | + otBorderRouterRegister(ThreadStackMgrImpl().OTInstance()); |
| 452 | + |
| 453 | + memcpy(routeConfig.mPrefix.mPrefix.mFields.m8, inPrefix.IPAddr.Addr, sizeof(routeConfig.mPrefix.mPrefix.mFields)); |
| 454 | + routeConfig.mPrefix.mLength = inPrefix.Length; |
| 455 | + routeConfig.mStable = true; |
| 456 | + routeConfig.mPreference = ot_priority; |
| 457 | + |
| 458 | + if (inAdd) |
| 459 | + { |
| 460 | + otErr = otBorderRouterAddRoute(ThreadStackMgrImpl().OTInstance(), &routeConfig); |
| 461 | + } |
| 462 | + else |
| 463 | + { |
| 464 | + otErr = otBorderRouterRemoveRoute(ThreadStackMgrImpl().OTInstance(), &routeConfig.mPrefix); |
| 465 | + } |
| 466 | + |
| 467 | + ThreadStackMgrImpl().UnlockThreadStack(); |
| 468 | + |
| 469 | + if (otErr == OT_ERROR_NONE) |
| 470 | + { |
| 471 | +#if WEAVE_PROGRESS_LOGGING |
| 472 | + char ipAddrStr[INET6_ADDRSTRLEN]; |
| 473 | + inPrefix.IPAddr.ToString(ipAddrStr, sizeof(ipAddrStr)); |
| 474 | + WeaveLogProgress(DeviceLayer, "OpenThread Border Router Route %s: %s/%d", |
| 475 | + (inAdd) ? "Added" : "Removed", |
| 476 | + ipAddrStr, inPrefix.Length); |
| 477 | +#endif // WEAVE_PROGRESS_LOGGING |
| 478 | + } |
| 479 | + else |
| 480 | + { |
| 481 | + WeaveLogError(DeviceLayer, "AddRemoveThreadRoute() failed: %s", ::nl::ErrorStr(MapOpenThreadError(otErr))); |
| 482 | + } |
| 483 | + |
| 484 | + return (otErr == OT_ERROR_NONE) ? kPlatformResultSuccess : kPlatformResultFailure; |
377 | 485 | } |
378 | 486 |
|
379 | 487 | PlatformResult SetThreadRoutePriority(InterfaceType inInterfaceType, const Inet::IPPrefix &inPrefix, RoutePriority inPriority) |
380 | 488 | { |
381 | | - // TODO: implement me |
| 489 | + return AddRemoveThreadRoute(inInterfaceType, inPrefix, inPriority, true); |
382 | 490 | } |
383 | 491 |
|
384 | 492 | #endif // WARM_CONFIG_SUPPORT_BORDER_ROUTING |
|
0 commit comments