从C中的Contiki uip地址构造新的IPv6地址
我对Contiki和C都缺乏经验,但我正在努力做到以下几点: 基本上,我得到一个结构event,它有一个类型、一个id和一个uip ip6地址 使用此事件,我想构造一个带有固定前缀(ff1e)的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
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多播意味着什么的人,而不仅仅是制造一些无效的东西!当然,除非你运气好:)