从 C 中的 Contiki uip 地址构造新的 IPv6 地址

标签 c ip ipv6 multicast contiki

我对 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/

相关文章:

ubuntu - 从外部 IP 地址访问主机

c - Linux, C : IPv6 socket: write blocks

linux - 如何查询特定邻居的 IPv6 NDP(邻居发现协议(protocol))表

c - C 中的随机误差

c - 不兼容的编译错误内置函数 ‘execl’

c - Bash 脚本和 C 程序表现得很奇怪

c# - 无法使用单声道连接到在 ubuntu 上运行的自己的 IPv6 TCP 服务器应用程序

c - 如何在ubuntu中打印出 "st_blksize"的数据?

php - 正则表达式仅从文本中提取 IPv4 地址

ip - IPv6 地址的文本表示的最大长度?