我对 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;
等等。
关于从 C 中的 Contiki uip 地址构造新的 IPv6 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28563150/