Skip to content

Commit

Permalink
Check if source address is not illegal source address.
Browse files Browse the repository at this point in the history
Check if source address is not multicast or unique local unicast (for
non-local destinations.

Fixes issue RIOT-OS#78
  • Loading branch information
miri64 committed Aug 14, 2013
1 parent 7966be8 commit c3fecbe
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
14 changes: 14 additions & 0 deletions sys/net/sixlowpan/include/sixlowpan/ip.h
Expand Up @@ -264,6 +264,20 @@ int ipv6_addr_is_unspecified(const ipv6_addr_t *ipv6_addr);
*/
int ipv6_addr_is_link_local(const ipv6_addr_t *ipv6_addr);

/**
* @brief Check if *ipv6_addr* is unique local unicast address.
*
* @see <a href="http://tools.ietf.org/html/rfc4193">
* RFC 4193
* </a>
*
* @param[in] ipv6_addr An IPv6 address.
*
* @return 1 if *ipv6_addr* is unique local unicast address,
* 0 otherwise.
*/
int ipv6_addr_is_unique_local_unicast(const ipv6_addr_t *addr);

/**
* @brief Check if *ipv6_addr* is a multicast address.
*
Expand Down
12 changes: 10 additions & 2 deletions sys/net/sixlowpan/ip.c
Expand Up @@ -483,7 +483,9 @@ void ipv6_iface_get_best_src_addr(ipv6_addr_t *src, const ipv6_addr_t *dest)
if (!(ipv6_addr_is_link_local(dest)) && !(ipv6_addr_is_multicast(dest))) {
for (int i = 0; i < IFACE_ADDR_LIST_LEN; i++) {
if (iface.addr_list[i].state == NDP_ADDR_STATE_PREFERRED) {
if (!(ipv6_addr_is_link_local(&(iface.addr_list[i].addr)))) {
if (!ipv6_addr_is_link_local(&(iface.addr_list[i].addr)) &&
!ipv6_addr_is_multicast(&(iface.addr_list[i].addr)) &&
!ipv6_addr_is_unique_local_unicast(&(iface.addr_list[i].addr))) {
tmp = ipv6_get_addr_match(dest, &(iface.addr_list[i].addr));

if (tmp >= bmatch) {
Expand All @@ -497,7 +499,8 @@ void ipv6_iface_get_best_src_addr(ipv6_addr_t *src, const ipv6_addr_t *dest)
else {
for (int j = 0; j < IFACE_ADDR_LIST_LEN; j++) {
if ((iface.addr_list[j].state == NDP_ADDR_STATE_PREFERRED) &&
ipv6_addr_is_link_local(&(iface.addr_list[j].addr))) {
ipv6_addr_is_link_local(&(iface.addr_list[j].addr)) &&
!ipv6_addr_is_multicast(&(iface.addr_list[j].addr))) {
itmp = j;
}
}
Expand Down Expand Up @@ -543,6 +546,11 @@ int ipv6_addr_is_link_local(const ipv6_addr_t *addr)
return addr->uint8[0] == 0xfe && addr->uint8[0] == 0x80;
}

int ipv6_addr_is_unique_local_unicast(const ipv6_addr_t *addr)
{
return addr->uint8[0] == 0xfc || addr->uint8[0] == 0xfd;
}

int ipv6_addr_is_multicast(const ipv6_addr_t *addr)
{
return addr->uint8[0] == 0xff;
Expand Down

0 comments on commit c3fecbe

Please sign in to comment.