Update Valid Prefix Set configuration and Border Router TLV. (#316)

This commit is contained in:
Jonathan Hui
2016-08-02 09:42:52 -07:00
committed by GitHub
parent 252f0e06fa
commit 6879e829a7
26 changed files with 147 additions and 108 deletions
+10 -5
View File
@@ -311,7 +311,7 @@ typedef struct otIp6Prefix
typedef struct otBorderRouterConfig
{
/**
* TRUE, if this border router is a DHCPv6 Agent that supplies other configuration data. FALSE, otherwise.
* The IPv6 prefix.
*/
otIp6Prefix mPrefix;
@@ -321,14 +321,14 @@ typedef struct otBorderRouterConfig
int mPreference : 2;
/**
* TRUE, if @p mPrefix is preferred and should e used for address autoconfiguration. FALSE, otherwise.
* TRUE, if @p mPrefix is preferred. FALSE, otherwise.
*/
bool mSlaacPreferred : 1;
bool mPreferred : 1;
/**
* TRUE, if @p mPrefix is valid and should be used for address autoconfiguration. FALSE, otherwise.
* TRUE, if @p mPrefix should be used for address autoconfiguration. FALSE, otherwise.
*/
bool mSlaacValid : 1;
bool mSlaac : 1;
/**
* TRUE, if this border router is a DHCPv6 Agent that supplies IPv6 address configuration. FALSE, otherwise.
@@ -345,6 +345,11 @@ typedef struct otBorderRouterConfig
*/
bool mDefaultRoute : 1;
/**
* TRUE, if this prefix is considered on-mesh. FALSE, otherwise.
*/
bool mOnMesh : 1;
/**
* TRUE, if this configuration is considered Stable Network Data. FALSE, otherwise.
*/
+6 -5
View File
@@ -432,16 +432,17 @@ Send an ICMPv6 Echo Request.
Add a valid prefix to the Network Data.
* p: Stateless IPv6 Address Autoconfiguration Preferred flag
* v: Stateless IPv6 Address Autoconfiguration Valid flag
* p: Preferred flag
* a: Stateless IPv6 Address Autoconfiguration flag
* d: DHCPv6 IPv6 Address Configuration flag
* c: DHCPv6 Other Configuration flag
* s: Stable flag
* r: Default Route flag
* o: On Mesh flag
* s: Stable flag
* prf: Default router preference, which may be 'high', 'med', or 'low'.
```bash
> prefix add 2001:dead:beef:cafe::/64 pvsr 0
> prefix add 2001:dead:beef:cafe::/64 paros med
Done
```
@@ -479,7 +480,7 @@ Add a valid prefix to the Network Data.
* prf: Default Router Preference, which may be: 'high', 'med', or 'low'.
```bash
> route add 2001:dead:beef:cafe::/64 pvsr 0
> route add 2001:dead:beef:cafe::/64 s med
Done
```
+43 -39
View File
@@ -865,43 +865,9 @@ ThreadError Interpreter::ProcessPrefixAdd(int argc, char *argv[])
ExitNow(error = kThreadError_Parse);
}
if (++argcur < argc)
{
for (char *arg = argv[argcur]; *arg != '\0'; arg++)
{
switch (*arg)
{
case 'p':
config.mSlaacPreferred = true;
break;
argcur++;
case 'v':
config.mSlaacValid = true;
break;
case 'd':
config.mDhcp = true;
break;
case 'c':
config.mConfigure = true;
break;
case 'r':
config.mDefaultRoute = true;
break;
case 's':
config.mStable = true;
break;
default:
ExitNow();
}
}
}
if (++argcur < argc)
for (; argcur < argc; argcur++)
{
if (strcmp(argv[argcur], "high") == 0)
{
@@ -917,7 +883,42 @@ ThreadError Interpreter::ProcessPrefixAdd(int argc, char *argv[])
}
else
{
ExitNow(error = kThreadError_Parse);
for (char *arg = argv[argcur]; *arg != '\0'; arg++)
{
switch (*arg)
{
case 'p':
config.mPreferred = true;
break;
case 'a':
config.mSlaac = true;
break;
case 'd':
config.mDhcp = true;
break;
case 'c':
config.mConfigure = true;
break;
case 'r':
config.mDefaultRoute = true;
break;
case 'o':
config.mOnMesh = true;
break;
case 's':
config.mStable = true;
break;
default:
ExitNow(error = kThreadError_Parse);
}
}
}
}
@@ -1035,13 +1036,16 @@ ThreadError Interpreter::ProcessRouteAdd(int argc, char *argv[])
ExitNow(error = kThreadError_Parse);
}
if (++argcur < argc)
argcur++;
for (; argcur < argc; argcur++)
{
if (strcmp(argv[argcur], "s") == 0)
{
config.mStable = true;
}
else if (strcmp(argv[argcur], "high") == 0)
if (strcmp(argv[argcur], "high") == 0)
{
config.mPreference = 1;
}
+8 -3
View File
@@ -294,14 +294,14 @@ ThreadError otAddBorderRouter(const otBorderRouterConfig *aConfig)
{
uint8_t flags = 0;
if (aConfig->mSlaacPreferred)
if (aConfig->mPreferred)
{
flags |= NetworkData::BorderRouterEntry::kPreferredFlag;
}
if (aConfig->mSlaacValid)
if (aConfig->mSlaac)
{
flags |= NetworkData::BorderRouterEntry::kValidFlag;
flags |= NetworkData::BorderRouterEntry::kSlaacFlag;
}
if (aConfig->mDhcp)
@@ -319,6 +319,11 @@ ThreadError otAddBorderRouter(const otBorderRouterConfig *aConfig)
flags |= NetworkData::BorderRouterEntry::kDefaultRouteFlag;
}
if (aConfig->mOnMesh)
{
flags |= NetworkData::BorderRouterEntry::kOnMeshFlag;
}
return sThreadNetif->GetNetworkDataLocal().AddOnMeshPrefix(aConfig->mPrefix.mPrefix.mFields.m8,
aConfig->mPrefix.mLength,
aConfig->mPreference, flags, aConfig->mStable);
+2 -2
View File
@@ -241,9 +241,9 @@ ThreadError Leader::ConfigureAddress(PrefixTlv &aPrefix)
ExitNow();
}
// check if Valid flag is set
// check if SLAAC flag is set
if ((entry = borderRouter->GetEntry(0)) == NULL ||
entry->IsValid() == false)
entry->IsSlaac() == false)
{
ExitNow();
}
+31 -9
View File
@@ -349,10 +349,11 @@ public:
kPreferenceOffset = 6,
kPreferenceMask = 3 << kPreferenceOffset,
kPreferredFlag = 1 << 5,
kValidFlag = 1 << 4,
kSlaacFlag = 1 << 4,
kDhcpFlag = 1 << 3,
kConfigureFlag = 1 << 2,
kDefaultRouteFlag = 1 << 1,
kOnMeshFlag = 1 << 0,
};
/**
@@ -430,25 +431,25 @@ public:
void SetPreferred() { mFlags |= kPreferredFlag; }
/**
* This method indicates whether or not the Valid flag is set.
* This method indicates whether or not the SLAAC flag is set.
*
* @retval TRUE If the Valid flag is set.
* @retval FALSE If the Valid flag is not set.
* @retval TRUE If the SLAAC flag is set.
* @retval FALSE If the SLAAC flag is not set.
*
*/
bool IsValid() const { return (mFlags & kValidFlag) != 0; }
bool IsSlaac() const { return (mFlags & kSlaacFlag) != 0; }
/**
* This method clears the Valid flag.
* This method clears the SLAAC flag.
*
*/
void ClearValid() { mFlags &= ~kValidFlag; }
void ClearSlaac() { mFlags &= ~kSlaacFlag; }
/**
* This method sets the Valid flag.
* This method sets the SLAAC flag.
*
*/
void SetValid() { mFlags |= kValidFlag; }
void SetSlaac() { mFlags |= kSlaacFlag; }
/**
* This method indicates whether or not the DHCP flag is set.
@@ -513,6 +514,27 @@ public:
*/
void SetDefaultRoute() { mFlags |= kDefaultRouteFlag; }
/**
* This method indicates whether or not the On-Mesh flag is set.
*
* @retval TRUE If the On-Mesh flag is set.
* @retval FALSE If the On-Mesh flag is not set.
*
*/
bool IsOnMesh() const { return (mFlags & kOnMeshFlag) != 0; }
/**
* This method clears the On-Mesh flag.
*
*/
void ClearOnMesh() { mFlags &= ~kOnMeshFlag; }
/**
* This method sets the On-Mesh flag.
*
*/
void SetOnMesh() { mFlags |= kOnMeshFlag; }
private:
uint16_t mRloc;
uint8_t mFlags;
+5 -3
View File
@@ -3020,10 +3020,11 @@ void NcpBase::InsertPropertyHandler_THREAD_ON_MESH_NETS(uint8_t header, spinel_p
const static int kPreferenceOffset = 6;
const static int kPreferenceMask = 3 << kPreferenceOffset;
const static int kPreferredFlag = 1 << 5;
const static int kValidFlag = 1 << 4;
const static int kSlaacFlag = 1 << 4;
const static int kDhcpFlag = 1 << 3;
const static int kConfigureFlag = 1 << 2;
const static int kDefaultRouteFlag = 1 << 1;
const static int kOnMeshFlag = 1 << 0;
spinel_ssize_t parsedLength;
ThreadError errorCode = kThreadError_None;
@@ -3055,11 +3056,12 @@ void NcpBase::InsertPropertyHandler_THREAD_ON_MESH_NETS(uint8_t header, spinel_p
border_router_config.mPrefix.mPrefix = *addr_ptr;
border_router_config.mStable = stable;
border_router_config.mPreference = ((flags & kPreferenceMask) >> kPreferenceOffset);
border_router_config.mSlaacPreferred = ((flags & kPreferredFlag) == kPreferredFlag);
border_router_config.mSlaacValid = ((flags & kValidFlag) == kValidFlag);
border_router_config.mPreferred = ((flags & kPreferredFlag) == kPreferredFlag);
border_router_config.mSlaac = ((flags & kSlaacFlag) == kSlaacFlag);
border_router_config.mDhcp = ((flags & kDhcpFlag) == kDhcpFlag);
border_router_config.mConfigure = ((flags & kConfigureFlag) == kConfigureFlag);
border_router_config.mDefaultRoute = ((flags & kDefaultRouteFlag) == kDefaultRouteFlag);
border_router_config.mOnMesh = ((flags & kOnMeshFlag) == kOnMeshFlag);
errorCode = otAddBorderRouter(&border_router_config);
@@ -104,8 +104,8 @@ class Cert_5_2_5_AddressQuery(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[BR1].get_state(), 'router')
self.nodes[BR1].add_prefix('2003::/64', 'pvcrs')
self.nodes[BR1].add_prefix('2004::/64', 'pvcrs')
self.nodes[BR1].add_prefix('2003::/64', 'paros')
self.nodes[BR1].add_prefix('2004::/64', 'paros')
self.nodes[BR1].register_netdata()
self.nodes[ED1].start()
@@ -90,8 +90,8 @@ class Cert_5_3_3_AddressQuery(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[BR].get_state(), 'router')
self.nodes[BR].add_prefix('2003::/64', 'pvcrs')
self.nodes[BR].add_prefix('2004::/64', 'pvcrs')
self.nodes[BR].add_prefix('2003::/64', 'paros')
self.nodes[BR].add_prefix('2004::/64', 'paros')
self.nodes[BR].register_netdata()
self.nodes[ROUTER2].start()
@@ -110,7 +110,7 @@ class Cert_5_3_7_DuplicateAddress(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[ED3].get_state(), 'child')
self.nodes[ROUTER2].add_prefix('2001::/64', 'pvcrs')
self.nodes[ROUTER2].add_prefix('2001::/64', 'paros')
self.nodes[ROUTER2].register_netdata()
self.nodes[ED1].add_ipaddr('2001::1')
@@ -89,8 +89,8 @@ class Cert_5_3_9_AddressQuery(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[BR].get_state(), 'router')
self.nodes[BR].add_prefix('2003::/64', 'pvcrs')
self.nodes[BR].add_prefix('2004::/64', 'pvcrs')
self.nodes[BR].add_prefix('2003::/64', 'paros')
self.nodes[BR].add_prefix('2004::/64', 'paros')
self.nodes[BR].register_netdata()
self.nodes[ROUTER2].start()
@@ -77,8 +77,8 @@ class Cert_5_6_1_NetworkDataLeaderAsBr(unittest.TestCase):
self.nodes[LEADER].set_state('leader')
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[LEADER].add_prefix('2001::/64', 'pvcrs')
self.nodes[LEADER].add_prefix('2002::/64', 'pvcr')
self.nodes[LEADER].add_prefix('2001::/64', 'paros')
self.nodes[LEADER].add_prefix('2002::/64', 'paro')
self.nodes[LEADER].register_netdata()
self.nodes[ROUTER].start()
@@ -81,8 +81,8 @@ class Cert_5_6_2_NetworkDataRouterAsBr(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ROUTER].add_prefix('2001::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2002::/64', 'pvcr')
self.nodes[ROUTER].add_prefix('2001::/64', 'paros')
self.nodes[ROUTER].add_prefix('2002::/64', 'paro')
self.nodes[ROUTER].register_netdata()
self.nodes[ED1].start()
@@ -89,8 +89,8 @@ class Cert_5_6_3_NetworkDataRegisterAfterAttachLeader(unittest.TestCase):
time.sleep(5)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
self.nodes[LEADER].add_prefix('2001::/64', 'pvcrs')
self.nodes[LEADER].add_prefix('2002::/64', 'pvcr')
self.nodes[LEADER].add_prefix('2001::/64', 'paros')
self.nodes[LEADER].add_prefix('2002::/64', 'paro')
self.nodes[LEADER].register_netdata()
time.sleep(10)
@@ -89,8 +89,8 @@ class Cert_5_6_4_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2002::/64', 'pvcr')
self.nodes[ROUTER].add_prefix('2001::/64', 'paros')
self.nodes[ROUTER].add_prefix('2002::/64', 'paro')
self.nodes[ROUTER].register_netdata()
time.sleep(10)
@@ -89,8 +89,8 @@ class Cert_5_6_5_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2002::/64', 'pvcr')
self.nodes[ROUTER].add_prefix('2001::/64', 'paros')
self.nodes[ROUTER].add_prefix('2002::/64', 'paro')
self.nodes[ROUTER].register_netdata()
time.sleep(10)
@@ -105,7 +105,7 @@ class Cert_5_6_5_NetworkDataRegisterAfterAttachRouter(unittest.TestCase):
if addr[0:3] == '200':
self.nodes[LEADER].ping(addr)
self.nodes[ROUTER].add_prefix('2003::/64', 'pvcs')
self.nodes[ROUTER].add_prefix('2003::/64', 'pacs')
self.nodes[ROUTER].register_netdata()
time.sleep(10)
@@ -89,8 +89,8 @@ class Cert_5_6_6_NetworkDataExpiration(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[SED1].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2002::/64', 'pvcr')
self.nodes[ROUTER].add_prefix('2001::/64', 'paros')
self.nodes[ROUTER].add_prefix('2002::/64', 'paro')
self.nodes[ROUTER].register_netdata()
time.sleep(10)
@@ -105,7 +105,7 @@ class Cert_5_6_6_NetworkDataExpiration(unittest.TestCase):
if addr[0:3] == '200':
self.nodes[LEADER].ping(addr)
self.nodes[ROUTER].add_prefix('2003::/64', 'pvcs')
self.nodes[ROUTER].add_prefix('2003::/64', 'pacs')
self.nodes[ROUTER].register_netdata()
time.sleep(10)
@@ -81,7 +81,7 @@ class Cert_5_6_7_NetworkDataRequestREED(unittest.TestCase):
self.nodes[LEADER].remove_whitelist(self.nodes[REED].get_addr64())
self.nodes[REED].remove_whitelist(self.nodes[LEADER].get_addr64())
self.nodes[ROUTER].add_prefix('2003::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2003::/64', 'paros')
self.nodes[ROUTER].register_netdata()
time.sleep(2)
@@ -78,7 +78,7 @@ class Cert_5_6_8_ContextManagement(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2001::/64', 'paros')
self.nodes[ROUTER].register_netdata()
time.sleep(2)
@@ -96,7 +96,7 @@ class Cert_5_6_8_ContextManagement(unittest.TestCase):
if addr[0:3] == '200':
self.nodes[ED].ping(addr)
self.nodes[ROUTER].add_prefix('2002::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2002::/64', 'paros')
self.nodes[ROUTER].register_netdata()
time.sleep(5)
@@ -106,7 +106,7 @@ class Cert_5_6_8_ContextManagement(unittest.TestCase):
self.nodes[ED].ping(addr)
time.sleep(5)
self.nodes[ROUTER].add_prefix('2003::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2003::/64', 'paros')
self.nodes[ROUTER].register_netdata()
time.sleep(5)
@@ -100,12 +100,12 @@ class Cert_5_6_9_NetworkDataForwarding(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[SED].get_state(), 'child')
self.nodes[LEADER].add_prefix('2001::/64', 'pvcrs', 'med')
self.nodes[LEADER].add_prefix('2001::/64', 'paros', 'med')
self.nodes[LEADER].add_route('2002::/64', 'med')
self.nodes[LEADER].register_netdata()
time.sleep(10)
self.nodes[ROUTER2].add_prefix('2001::/64', 'pvcrs', 'low')
self.nodes[ROUTER2].add_prefix('2001::/64', 'paros', 'low')
self.nodes[ROUTER2].add_route('2002::/64', 'high')
self.nodes[ROUTER2].register_netdata()
time.sleep(10)
@@ -121,7 +121,7 @@ class Cert_5_6_9_NetworkDataForwarding(unittest.TestCase):
pass
self.nodes[ROUTER2].remove_prefix('2001::/64')
self.nodes[ROUTER2].add_prefix('2001::/64', 'pvcrs', 'high')
self.nodes[ROUTER2].add_prefix('2001::/64', 'paros', 'high')
self.nodes[ROUTER2].register_netdata()
time.sleep(10)
@@ -131,7 +131,7 @@ class Cert_5_6_9_NetworkDataForwarding(unittest.TestCase):
pass
self.nodes[ROUTER2].remove_prefix('2001::/64')
self.nodes[ROUTER2].add_prefix('2001::/64', 'pvcrs', 'med')
self.nodes[ROUTER2].add_prefix('2001::/64', 'paros', 'med')
self.nodes[ROUTER2].register_netdata()
time.sleep(10)
@@ -67,7 +67,7 @@ class Cert_5_6_2_NetworkDataUpdate(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[ED].get_state(), 'child')
self.nodes[LEADER].add_prefix('2001::/64', 'pvcrs')
self.nodes[LEADER].add_prefix('2001::/64', 'paros')
self.nodes[LEADER].register_netdata()
time.sleep(3)
@@ -79,7 +79,7 @@ class Cert_5_6_2_NetworkDataUpdate(unittest.TestCase):
self.nodes[LEADER].remove_whitelist(self.nodes[ED].get_addr64())
self.nodes[ED].remove_whitelist(self.nodes[LEADER].get_addr64())
self.nodes[LEADER].add_prefix('2002::/64', 'pvcrs')
self.nodes[LEADER].add_prefix('2002::/64', 'paros')
self.nodes[LEADER].register_netdata()
time.sleep(3)
@@ -77,8 +77,8 @@ class Cert_7_1_1_BorderRouterAsLeader(unittest.TestCase):
self.nodes[LEADER].set_state('leader')
self.assertEqual(self.nodes[LEADER].get_state(), 'leader')
self.nodes[LEADER].add_prefix('2001::/64', 'pvcrs')
self.nodes[LEADER].add_prefix('2002::/64', 'pvcr')
self.nodes[LEADER].add_prefix('2001::/64', 'paros')
self.nodes[LEADER].add_prefix('2002::/64', 'paro')
self.nodes[LEADER].register_netdata()
self.nodes[ROUTER].start()
@@ -81,8 +81,8 @@ class Cert_7_1_2_BorderRouterAsRouter(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[ROUTER].get_state(), 'router')
self.nodes[ROUTER].add_prefix('2001::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2002::/64', 'pvcr')
self.nodes[ROUTER].add_prefix('2001::/64', 'paros')
self.nodes[ROUTER].add_prefix('2002::/64', 'paro')
self.nodes[ROUTER].register_netdata()
self.nodes[ED2].start()
@@ -89,8 +89,8 @@ class Cert_7_1_3_BorderRouterAsLeader(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[ED1].get_state(), 'child')
self.nodes[LEADER].add_prefix('2001::/64', 'pvcrs')
self.nodes[LEADER].add_prefix('2002::/64', 'pvcr')
self.nodes[LEADER].add_prefix('2001::/64', 'paros')
self.nodes[LEADER].add_prefix('2002::/64', 'paro')
self.nodes[LEADER].register_netdata()
time.sleep(3)
@@ -89,8 +89,8 @@ class Cert_7_1_4_BorderRouterAsRouter(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[SED2].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2002::/64', 'pvcr')
self.nodes[ROUTER].add_prefix('2001::/64', 'paros')
self.nodes[ROUTER].add_prefix('2002::/64', 'paro')
self.nodes[ROUTER].register_netdata()
time.sleep(3)
@@ -89,8 +89,8 @@ class Cert_7_1_5_BorderRouterAsRouter(unittest.TestCase):
time.sleep(3)
self.assertEqual(self.nodes[SED2].get_state(), 'child')
self.nodes[ROUTER].add_prefix('2001::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2002::/64', 'pvcr')
self.nodes[ROUTER].add_prefix('2001::/64', 'paros')
self.nodes[ROUTER].add_prefix('2002::/64', 'paro')
self.nodes[ROUTER].register_netdata()
time.sleep(3)
@@ -104,7 +104,7 @@ class Cert_7_1_5_BorderRouterAsRouter(unittest.TestCase):
if addr[0:4] == '2001' or addr[0:4] == '2002':
self.nodes[LEADER].ping(addr)
self.nodes[ROUTER].add_prefix('2003::/64', 'pvcrs')
self.nodes[ROUTER].add_prefix('2003::/64', 'paros')
self.nodes[ROUTER].register_netdata()
time.sleep(3)