Exemplo n.º 1
0
Arquivo: ip.c Projeto: A-L-E-X/RIOT
void ipv6_net_if_get_best_src_addr(ipv6_addr_t *src, const ipv6_addr_t *dest)
{
    /* try to find best match if dest is not mcast or link local */
    int if_id = 0; // TODO: get this somehow
    uint8_t tmp = 0;
    uint8_t bmatch = 0;
    ipv6_net_if_addr_t *addr = NULL;
    ipv6_net_if_addr_t *tmp_addr = NULL;

    if (!(ipv6_addr_is_link_local(dest)) && !(ipv6_addr_is_multicast(dest))) {
        while ((addr = (ipv6_net_if_addr_t *)net_if_iter_addresses(if_id,
                       (net_if_addr_t **)&addr))) {
            if (addr->ndp_state == NDP_ADDR_STATE_PREFERRED) {
                if (!ipv6_addr_is_link_local(addr->addr_data) &&
                    !ipv6_addr_is_multicast(addr->addr_data) &&
                    !ipv6_addr_is_unique_local_unicast(addr->addr_data)) {
                    tmp = ipv6_get_addr_match(dest, addr->addr_data);

                    if (tmp >= bmatch) {
                        bmatch = tmp;
                        tmp_addr = addr;
                    }
                }
            }
        }
    }
    else {
        while ((addr = (ipv6_net_if_addr_t *)net_if_iter_addresses(if_id,
                       (net_if_addr_t **)&addr))) {
            if (addr->ndp_state == NDP_ADDR_STATE_PREFERRED &&
                ipv6_addr_is_link_local(addr->addr_data) &&
                !ipv6_addr_is_multicast(addr->addr_data)) {
                tmp_addr = addr;
            }
        }
    }

    if (tmp_addr == NULL) {
        memset(src, 0, 16);
    }
    else {
        memcpy(src, tmp_addr->addr_data, 16);
    }
}
Exemplo n.º 2
0
int sixlowpan_lowpan_border_init(int if_id)
{
    ipv6_net_if_addr_t *addr = NULL;
    uint8_t abr_addr_initialized = 0;

    serial_reader_pid = thread_create(
                            serial_reader_stack, READER_STACK_SIZE,
                            PRIORITY_MAIN - 1, CREATE_STACKTEST,
                            serial_reader_f, "serial_reader");
    ip_process_pid = thread_create(ip_process_buf, IP_PROCESS_STACKSIZE,
                                   PRIORITY_MAIN - 1, CREATE_STACKTEST,
                                   border_process_lowpan,
                                   "border_process_lowpan");

    if (ip_process_pid < 0) {
        return 0;
    }

    if (!sixlowpan_lowpan_init_interface(if_id)) {
        return 0;
    }

    while (net_if_iter_addresses(if_id, (net_if_addr_t **) &addr)) {
        if (!ipv6_addr_is_multicast(addr->addr_data) &&
            !ipv6_addr_is_link_local(addr->addr_data) &&
            !ipv6_addr_is_loopback(addr->addr_data) &&
            !ipv6_addr_is_unique_local_unicast(addr->addr_data)) {
            abr_addr_initialized = 1;
            abr_addr = addr->addr_data;
            break;
        }
    }

    if (!abr_addr_initialized) {
        DEBUG("sixlowpan_lowpan_border_init(): A prefix must be initialized to"
              "interface %d first", if_id);
        return 0;
    }

    ipv6_init_as_router();

    return 1;
}