Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C中的Contiki uip地址构造新的IPv6地址_C_Ip_Ipv6_Multicast_Contiki - Fatal编程技术网

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

从C中的Contiki uip地址构造新的IPv6地址,c,ip,ipv6,multicast,contiki,C,Ip,Ipv6,Multicast,Contiki,我对Contiki和C都缺乏经验,但我正在努力做到以下几点: 基本上,我得到一个结构event,它有一个类型、一个id和一个uip ip6地址 使用此事件,我想构造一个带有固定前缀(ff1e)的uip ipv6多播地址 目前,我有以下代码: static uip_ds6_maddr_t * derive_mcast_addr(struct eventstruc* event) { int ff1e; //Fixed multicast prefix to be used by L

我对Contiki和C都缺乏经验,但我正在努力做到以下几点:

基本上,我得到一个结构event,它有一个类型、一个id和一个uip ip6地址

使用此事件,我想构造一个带有固定前缀(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,但基于此: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;
如果你有一个指针,那么你可以:

 dst->ipaddr.u16[0] = mlcPrefix;

等等。

谢谢,我想就是这个了!最后关注标志和作用域对于IPv6多播意味着什么的人,而不仅仅是制造一些无效的东西!当然,除非你运气好:)