mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-10-05 22:29:49 +00:00
lowpan6.c: move netif-specific data to a common struct
This commit is contained in:
parent
c28aa02820
commit
a022590f40
@ -2,6 +2,9 @@
|
||||
* @file
|
||||
*
|
||||
* 6LowPAN output for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units.
|
||||
*
|
||||
* This implementation aims to conform to IEEE 802.15.4(-2015), RFC 4994 and RFC 6282.
|
||||
* @todo: RFC 6775.
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -77,13 +80,20 @@ struct lowpan6_reass_helper {
|
||||
u16_t datagram_tag;
|
||||
};
|
||||
|
||||
static struct lowpan6_reass_helper *reass_list;
|
||||
|
||||
/** This struct keeps track of per-netif state */
|
||||
struct lowpan6_ieee802154_data {
|
||||
/** fragment reassembly list */
|
||||
struct lowpan6_reass_helper *reass_list;
|
||||
#if LWIP_6LOWPAN_NUM_CONTEXTS > 0
|
||||
static ip6_addr_t lowpan6_context[LWIP_6LOWPAN_NUM_CONTEXTS];
|
||||
/** address context for compression */
|
||||
ip6_addr_t lowpan6_context[LWIP_6LOWPAN_NUM_CONTEXTS];
|
||||
#endif
|
||||
/** local PAN ID */
|
||||
u16_t ieee_802154_pan_id;
|
||||
};
|
||||
|
||||
static u16_t ieee_802154_pan_id;
|
||||
/** Currently, this state is global, since there's only one 6LoWPAN netif */
|
||||
static struct lowpan6_ieee802154_data lowpan6_data;
|
||||
|
||||
static const struct ieee_802154_addr ieee_802154_broadcast = {2, {0xff, 0xff}};
|
||||
|
||||
@ -103,7 +113,7 @@ lowpan6_tmr(void)
|
||||
{
|
||||
struct lowpan6_reass_helper *lrh, *lrh_temp;
|
||||
|
||||
lrh = reass_list;
|
||||
lrh = lowpan6_data.reass_list;
|
||||
while (lrh != NULL) {
|
||||
lrh_temp = lrh->next_packet;
|
||||
if ((--lrh->timer) == 0) {
|
||||
@ -123,10 +133,10 @@ dequeue_datagram(struct lowpan6_reass_helper *lrh)
|
||||
{
|
||||
struct lowpan6_reass_helper *lrh_temp;
|
||||
|
||||
if (reass_list == lrh) {
|
||||
reass_list = reass_list->next_packet;
|
||||
if (lowpan6_data.reass_list == lrh) {
|
||||
lowpan6_data.reass_list = lowpan6_data.reass_list->next_packet;
|
||||
} else {
|
||||
lrh_temp = reass_list;
|
||||
lrh_temp = lowpan6_data.reass_list;
|
||||
while (lrh_temp != NULL) {
|
||||
if (lrh_temp->next_packet == lrh) {
|
||||
lrh_temp->next_packet = lrh->next_packet;
|
||||
@ -146,7 +156,7 @@ lowpan6_context_lookup(const ip6_addr_t *ip6addr)
|
||||
s8_t i;
|
||||
|
||||
for (i = 0; i < LWIP_6LOWPAN_NUM_CONTEXTS; i++) {
|
||||
if (ip6_addr_netcmp(&lowpan6_context[i], ip6addr)) {
|
||||
if (ip6_addr_netcmp(&lowpan6_data.lowpan6_context[i], ip6addr)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
@ -247,15 +257,15 @@ lowpan6_frag(struct netif *netif, struct pbuf *p, const struct ieee_802154_addr
|
||||
ieee_header_len++;
|
||||
buffer[ieee_header_len++] = frame_seq_num++;
|
||||
|
||||
buffer[ieee_header_len++] = ieee_802154_pan_id & 0xff; /* pan id */
|
||||
buffer[ieee_header_len++] = (ieee_802154_pan_id >> 8) & 0xff; /* pan id */
|
||||
buffer[ieee_header_len++] = lowpan6_data.ieee_802154_pan_id & 0xff; /* pan id */
|
||||
buffer[ieee_header_len++] = (lowpan6_data.ieee_802154_pan_id >> 8) & 0xff; /* pan id */
|
||||
i = dst->addr_len;
|
||||
while (i-- > 0) {
|
||||
buffer[ieee_header_len++] = dst->addr[i];
|
||||
}
|
||||
|
||||
buffer[ieee_header_len++] = ieee_802154_pan_id & 0xff; /* pan id */
|
||||
buffer[ieee_header_len++] = (ieee_802154_pan_id >> 8) & 0xff; /* pan id */
|
||||
buffer[ieee_header_len++] = lowpan6_data.ieee_802154_pan_id & 0xff; /* pan id */
|
||||
buffer[ieee_header_len++] = (lowpan6_data.ieee_802154_pan_id >> 8) & 0xff; /* pan id */
|
||||
i = src->addr_len;
|
||||
while (i-- > 0) {
|
||||
buffer[ieee_header_len++] = src->addr[i];
|
||||
@ -590,7 +600,7 @@ lowpan6_set_context(u8_t idx, const ip6_addr_t *context)
|
||||
|
||||
IP6_ADDR_ZONECHECK(context);
|
||||
|
||||
ip6_addr_set(&lowpan6_context[idx], context);
|
||||
ip6_addr_set(&lowpan6_data.lowpan6_context[idx], context);
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
@ -826,8 +836,8 @@ lowpan6_decompress(struct pbuf *p, struct ieee_802154_addr *src, struct ieee_802
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ip6hdr->src.addr[0] = lowpan6_context[i].addr[0];
|
||||
ip6hdr->src.addr[1] = lowpan6_context[i].addr[1];
|
||||
ip6hdr->src.addr[0] = lowpan6_data.lowpan6_context[i].addr[0];
|
||||
ip6hdr->src.addr[1] = lowpan6_data.lowpan6_context[i].addr[1];
|
||||
}
|
||||
|
||||
if ((lowpan6_buffer[1] & 0x30) == 0x10) {
|
||||
@ -897,8 +907,8 @@ lowpan6_decompress(struct pbuf *p, struct ieee_802154_addr *src, struct ieee_802
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ip6hdr->dest.addr[0] = lowpan6_context[i].addr[0];
|
||||
ip6hdr->dest.addr[1] = lowpan6_context[i].addr[1];
|
||||
ip6hdr->dest.addr[0] = lowpan6_data.lowpan6_context[i].addr[0];
|
||||
ip6hdr->dest.addr[1] = lowpan6_data.lowpan6_context[i].addr[1];
|
||||
} else {
|
||||
/* Link local address compression */
|
||||
ip6hdr->dest.addr[0] = PP_HTONL(0xfe800000UL);
|
||||
@ -1055,7 +1065,7 @@ lowpan6_input(struct pbuf *p, struct netif *netif)
|
||||
datagram_tag = ((u16_t)puc[2] << 8) | (u16_t)puc[3];
|
||||
|
||||
/* check for duplicate */
|
||||
lrh = reass_list;
|
||||
lrh = lowpan6_data.reass_list;
|
||||
while (lrh != NULL) {
|
||||
if ((lrh->sender_addr.addr_len == src.addr_len) &&
|
||||
(memcmp(lrh->sender_addr.addr, src.addr, src.addr_len) == 0)) {
|
||||
@ -1097,9 +1107,9 @@ lowpan6_input(struct pbuf *p, struct netif *netif)
|
||||
lrh->datagram_size = datagram_size;
|
||||
lrh->datagram_tag = datagram_tag;
|
||||
lrh->pbuf = p;
|
||||
lrh->next_packet = reass_list;
|
||||
lrh->next_packet = lowpan6_data.reass_list;
|
||||
lrh->timer = 2;
|
||||
reass_list = lrh;
|
||||
lowpan6_data.reass_list = lrh;
|
||||
|
||||
return ERR_OK;
|
||||
} else if ((*puc & 0xf8) == 0xe0) {
|
||||
@ -1109,7 +1119,7 @@ lowpan6_input(struct pbuf *p, struct netif *netif)
|
||||
datagram_offset = (u16_t)puc[4] << 3;
|
||||
pbuf_remove_header(p, 5); /* hide frag1 dispatch */
|
||||
|
||||
for (lrh = reass_list; lrh != NULL; lrh = lrh->next_packet) {
|
||||
for (lrh = lowpan6_data.reass_list; lrh != NULL; lrh = lrh->next_packet) {
|
||||
if ((lrh->sender_addr.addr_len == src.addr_len) &&
|
||||
(memcmp(lrh->sender_addr.addr, src.addr, src.addr_len) == 0) &&
|
||||
(datagram_tag == lrh->datagram_tag) &&
|
||||
@ -1215,7 +1225,7 @@ lowpan6_if_init(struct netif *netif)
|
||||
err_t
|
||||
lowpan6_set_pan_id(u16_t pan_id)
|
||||
{
|
||||
ieee_802154_pan_id = pan_id;
|
||||
lowpan6_data.ieee_802154_pan_id = pan_id;
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user