从 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;

以此类推