Skip to content

Commit

Permalink
lwip: initialize link-local address correctly
Browse files Browse the repository at this point in the history
lwIP does some weird byte-swapping in netif_create_ip6_linklocal_address()
with non-ethernet-addresses, so I rather initialize it like in GNRC, so it is
compatible to both GNRC and emb6.
  • Loading branch information
miri64 committed Aug 2, 2016
1 parent ac4cc08 commit cc6b123
Showing 1 changed file with 27 additions and 5 deletions.
32 changes: 27 additions & 5 deletions pkg/lwip/contrib/netdev2/lwip_netdev2.c
Expand Up @@ -26,7 +26,9 @@
#include "netif/etharp.h"
#include "netif/lowpan6.h"

#include "net/eui64.h"
#include "net/ieee802154.h"
#include "net/ipv6/addr.h"
#include "net/netdev2.h"
#include "net/netopt.h"
#include "utlist.h"
Expand Down Expand Up @@ -121,12 +123,13 @@ err_t lwip_netdev2_init(struct netif *netif)
#ifdef MODULE_LWIP_SIXLOWPAN
case NETDEV2_TYPE_IEEE802154:
{
u16_t pan_id;
if (netdev->driver->get(netdev, NETOPT_NID, &pan_id,
sizeof(pan_id)) < 0) {
u16_t val;
ipv6_addr_t *addr;
if (netdev->driver->get(netdev, NETOPT_NID, &val,
sizeof(val)) < 0) {
return ERR_IF;
}
lowpan6_set_pan_id(pan_id);
lowpan6_set_pan_id(val);
netif->hwaddr_len = (u8_t)netdev->driver->get(netdev, NETOPT_ADDRESS_LONG,
netif->hwaddr, sizeof(netif->hwaddr));
if (netif->hwaddr_len > sizeof(netif->hwaddr)) {
Expand All @@ -137,7 +140,26 @@ err_t lwip_netdev2_init(struct netif *netif)
if (res != ERR_OK) {
return res;
}
netif_create_ip6_linklocal_address(netif, 0); /* 0: hwaddr is assumed to be 64-bit */
/* assure usage of long address as source address */
val = netif->hwaddr_len;
if (netdev->driver->set(netdev, NETOPT_SRC_LEN, &val, sizeof(val)) < 0) {
return ERR_IF;
}
/* netif_create_ip6_linklocal_address() does weird byte-swapping
* with full IIDs, so let's do it ourselves */
addr = (ipv6_addr_t *)&(netif->ip6_addr[0]);
if (netdev->driver->get(netdev, NETOPT_IPV6_IID, &addr->u8[8], sizeof(eui64_t)) < 0) {
return ERR_IF;
}
ipv6_addr_set_link_local_prefix(addr);
/* Set address state. */
#if LWIP_IPV6_DUP_DETECT_ATTEMPTS
/* Will perform duplicate address detection (DAD). */
netif->ip6_addr_state[0] = IP6_ADDR_TENTATIVE;
#else
/* Consider address valid. */
netif->ip6_addr_state[0] = IP6_ADDR_PREFERRED;
#endif /* LWIP_IPV6_AUTOCONFIG */
break;
}
#endif
Expand Down

0 comments on commit cc6b123

Please sign in to comment.