2015-02-17 3 views
0

Я неопытный и с Contiki и C, но я пытаюсь сделать следующее:Создание нового адреса IPv6 из UIP адреса Contiki в C

В принципе, я получаю структуру, событие, которое имеет тип, id и uip ip6address.

Используя это событие, я хочу построить многоадресный адрес uip ipv6 с фиксированным префиксом (ff1e).

На данный момент у меня есть следующий код:

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) 
} 

Я уверен, если этот код является достойным и о том, как получить последние 64 бит адреса Src, тем более, что они не могут быть в ожидаемый формат.

Например, если исходный адрес 0: 0: 0: 0: 0, то мне просто нужна часть 0: 0: 0: 0. Если бы это было, скажем, 2001 :: a00: 27ff: fef7: 30a7, мне просто понадобилось бы a00: 27ff: fef7: 30a7.

Кроме того, есть добавленная сложность Contiki UIP ...

Кто-нибудь есть достойные идеи?

+0

Наконец-то! Кто-то, кто обращает внимание на то, что означает флаги и области действия для многоадресной рассылки IPv6, и не просто делает что-то недействительным! Если, конечно, вам просто не повезло :) –

ответ

0

Во-первых, ваши переменные 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; 

И так далее.

+0

Спасибо, я думаю, что это он! –

Смежные вопросы