从 C 中的 Contiki uip 地址构造新的 IPv6 地址
Constructing a new IPv6 address from a Contiki uip address in C
我对 Contiki 和 C 都没有经验,但我正在尝试执行以下操作:
基本上,我得到一个结构,事件,它有一个类型、一个 id 和一个 uip ip6address。
利用这个事件,我想构造一个带有固定前缀 (ff1e) 的 uip ipv6 多播地址。
目前我有以下代码:
static uip_ds6_maddr_t *
derive_mcast_addr(struct eventstruc* event)
{
int ff1e;
//Fixed multicast prefix to be used by LooCI.
uint8_t mlcPrefix = ff1e;
//Type of the event
uint8_t eventType = event->type;
//Publisher Component ID of the sender
uint8_t * srccomp = event->source_cid;
// IPv6 address of the sender
uip_ip6addr_t * srcaddr = event->source_node);
// A derived multicast address is
// mlcPrefix + ":" + eventType + ":" +srccomp + ":0:" + (last 64bits srcAddr)
}
我不确定这段代码是否合适以及如何获取 src 地址的最后 64 位,尤其是因为它们可能不是预期的格式。
例如,如果源地址是 0::0:0:0:0 那么我只需要 0:0:0:0 部分。如果是 2001::a00:27ff:fef7:30a7,我只需要 a00:27ff:fef7:30a7.
另外,Contiki uip 增加了复杂性...
有人有好主意吗?
首先,您的 uint8_t 变量可能不够宽,您可能需要:
//Fixed multicast prefix to be used by LooCI.
uint16_t mlcPrefix = 0xff1e;
我对Contiki不熟悉,但是基于此:http://dak664.github.io/contiki-doxygen/a00424_source.html uip_ip6addr_t确实是这样:
typedef union uip_ip6addr_t {
u8_t u8[16]; /* Initializer, must come first!!! */
u16_t u16[8];
} uip_ip6addr_t;
如果是这样,那么您可以通过查看以下内容来获取低 64 位:
srcaddr->u16[4]
srcaddr->u16[5]
srcaddr->u16[6]
srcaddr->u16[7]
或者它可能是索引 0-3,具体取决于内容在 uip_ip6addr_t 中的存储方式。
为了将事情放回原处,您可以将高 64 位放入 u16[0] 到 u16[3],然后将原来的低 64 位放回 u16[4] 到 u16[7]。
如果uip_ds6_maddr_t是这样的:
typedef struct uip_ds6_maddr {
uint8_t isused;
uip_ipaddr_t ipaddr;
} uip_ds6_maddr_t;
你有一个指针uip_ds6_maddr_t *dst
然后你可以这样做:
dst->ipaddr.u16[0] = mlcPrefix;
以此类推
我对 Contiki 和 C 都没有经验,但我正在尝试执行以下操作:
基本上,我得到一个结构,事件,它有一个类型、一个 id 和一个 uip ip6address。
利用这个事件,我想构造一个带有固定前缀 (ff1e) 的 uip ipv6 多播地址。
目前我有以下代码:
static uip_ds6_maddr_t *
derive_mcast_addr(struct eventstruc* event)
{
int ff1e;
//Fixed multicast prefix to be used by LooCI.
uint8_t mlcPrefix = ff1e;
//Type of the event
uint8_t eventType = event->type;
//Publisher Component ID of the sender
uint8_t * srccomp = event->source_cid;
// IPv6 address of the sender
uip_ip6addr_t * srcaddr = event->source_node);
// A derived multicast address is
// mlcPrefix + ":" + eventType + ":" +srccomp + ":0:" + (last 64bits srcAddr)
}
我不确定这段代码是否合适以及如何获取 src 地址的最后 64 位,尤其是因为它们可能不是预期的格式。
例如,如果源地址是 0::0:0:0:0 那么我只需要 0:0:0:0 部分。如果是 2001::a00:27ff:fef7:30a7,我只需要 a00:27ff:fef7:30a7.
另外,Contiki uip 增加了复杂性...
有人有好主意吗?
首先,您的 uint8_t 变量可能不够宽,您可能需要:
//Fixed multicast prefix to be used by LooCI.
uint16_t mlcPrefix = 0xff1e;
我对Contiki不熟悉,但是基于此:http://dak664.github.io/contiki-doxygen/a00424_source.html uip_ip6addr_t确实是这样:
typedef union uip_ip6addr_t {
u8_t u8[16]; /* Initializer, must come first!!! */
u16_t u16[8];
} uip_ip6addr_t;
如果是这样,那么您可以通过查看以下内容来获取低 64 位:
srcaddr->u16[4]
srcaddr->u16[5]
srcaddr->u16[6]
srcaddr->u16[7]
或者它可能是索引 0-3,具体取决于内容在 uip_ip6addr_t 中的存储方式。
为了将事情放回原处,您可以将高 64 位放入 u16[0] 到 u16[3],然后将原来的低 64 位放回 u16[4] 到 u16[7]。
如果uip_ds6_maddr_t是这样的:
typedef struct uip_ds6_maddr {
uint8_t isused;
uip_ipaddr_t ipaddr;
} uip_ds6_maddr_t;
你有一个指针uip_ds6_maddr_t *dst
然后你可以这样做:
dst->ipaddr.u16[0] = mlcPrefix;
以此类推