Exemple #1
0
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;
}
Exemple #2
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;
}