int border_initialize(char *if_name, const char *ip_addr, const char *tty_dev) { int res, i; char command[21 + IPV6_ADDR_LEN + IF_NAME_LEN]; char ip_addr_cpy[IPV6_ADDR_LEN]; struct in6_addr parsed_addr; strncpy(ip_addr_cpy, ip_addr, IPV6_ADDR_LEN); strtok(ip_addr_cpy, "/"); if ((res = inet_pton(AF_INET6, ip_addr_cpy, &parsed_addr)) != 1) { return res; } if ((res = init_multiplex(tty_dev)) != 0) { return res; } tun_fd = open_tun(if_name, IFF_TUN); printf("INFO: ip link set %s up\n", if_name); sprintf(command, "ip link set %s up", if_name); strncpy(tun_if_name, if_name, IF_NAME_LEN); if ((res = system(command)) != 0) { return res; } if ((res = tun_add_addr(ip_addr)) != 0) { return res; } // initialize context cache as empty. for (i = 0; i < MAXIMUM_CONTEXTS; i++) { context_cache[i].cid = 0xFF; } pthread_create(&serial_reader, NULL, serial_reader_f, NULL); hard_reset_to_user_code(); flowcontrol_init(&parsed_addr); pthread_create(&tun_reader, NULL, tun_reader_f, NULL); return 0; }
uint8_t border_initialize(transceiver_type_t trans, ipv6_addr_t *border_router_addr) { ipv6_addr_t addr; serial_reader_pid = thread_create( serial_reader_stack, READER_STACK_SIZE, PRIORITY_MAIN - 1, CREATE_STACKTEST, serial_reader_f, "serial_reader"); if(border_router_addr == NULL) { border_router_addr = &addr; addr = flowcontrol_init(); } /* only allow addresses generated accoding to * RFC 4944 (Section 6) & RFC 2464 (Section 4) from short address * -- for now */ if(border_router_addr->uint16[4] != HTONS(IEEE_802154_PAN_ID ^ 0x0200) || border_router_addr->uint16[5] != HTONS(0x00FF) || border_router_addr->uint16[6] != HTONS(0xFE00) ) { return SIXLOWERROR_ADDRESS; } /* radio-address is 8-bit so this must be tested extra */ if(border_router_addr->uint8[14] != 0) { return SIXLOWERROR_ADDRESS; } memcpy(&(abr_addr.uint8[0]), &(border_router_addr->uint8[0]), 16); sixlowpan_init(trans, border_router_addr->uint8[15], 1); ipv6_init_iface_as_router(); return SUCCESS; }