您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ uip_is_addr_mcast函数代码示例

51自学网 2021-06-03 09:08:19
  C++
这篇教程C++ uip_is_addr_mcast函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中uip_is_addr_mcast函数的典型用法代码示例。如果您正苦于以下问题:C++ uip_is_addr_mcast函数的具体用法?C++ uip_is_addr_mcast怎么用?C++ uip_is_addr_mcast使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了uip_is_addr_mcast函数的22个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: node_config_allowed_node_hook

int node_config_allowed_node_hook(rpl_dag_t *dag, uip_ipaddr_t *prefix, int prefix_len){  /* Test if MAC of incoming node is allowed. */  int allowed = 0;  if(dag != NULL) {    if(node_config_find_by_ip(prefix) == NULL) {      LOG6LBR_6ADDR(INFO, prefix, "Node has been rejected : ");    } else {      LOG6LBR_6ADDR(DEBUG, prefix, "Node has been accepted : ");      allowed = 1;    }  } else {    if(uip_is_addr_mcast(prefix) || uip_is_addr_linklocal(prefix) || uip_ds6_is_my_addr(prefix) || uip_ds6_is_my_aaddr(prefix) ||      node_config_find_by_ip(prefix)) {      allowed = 1;    }  }#if CETIC_6LBR_NODE_INFO  if(dag != NULL && allowed) {    //As control traffic is always allowed, set the flag only when it's coming from RPL    node_info_clear_flags(prefix, NODE_INFO_REJECTED);  }  if(!allowed) {    node_info_set_flags(prefix, NODE_INFO_REJECTED);  }#endif  return allowed;}
开发者ID:kamejoko80,项目名称:6lbr,代码行数:28,


示例2: uip_ds6_select_src

/*---------------------------------------------------------------------------*/voiduip_ds6_select_src(uip_ipaddr_t *src, uip_ipaddr_t *dst){  uint8_t best = 0;             /* number of bit in common with best match */  uint8_t n = 0;  uip_ds6_addr_t *matchaddr = NULL;  if(!uip_is_addr_link_local(dst) &&		  (!uip_is_addr_mcast(dst) || uip_is_addr_routable_mcast(dst))) {    /* find longest match */    for(locaddr = uip_ds6_if.addr_list;        locaddr < uip_ds6_if.addr_list + UIP_DS6_ADDR_NB; locaddr++) {      /* Only preferred global (not link-local) addresses */      if(locaddr->isused && locaddr->state == ADDR_PREFERRED &&         !uip_is_addr_link_local(&locaddr->ipaddr)) {        n = get_match_length(dst, &locaddr->ipaddr);        if(n >= best) {          best = n;          matchaddr = locaddr;        }      }    }  } else {    matchaddr = uip_ds6_get_link_local(ADDR_PREFERRED);  }  /* use the :: (unspecified address) as source if no match found */  if(matchaddr == NULL) {    uip_create_unspecified(src);  } else {    uip_ipaddr_copy(src, &matchaddr->ipaddr);  }}
开发者ID:ChristianKniep,项目名称:hexabus,代码行数:34,


示例3: rpl_insert_header

/*---------------------------------------------------------------------------*/voidrpl_insert_header(void){  if(default_instance != NULL && !uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {    rpl_update_header_empty();  }}
开发者ID:200018171,项目名称:contiki,代码行数:8,


示例4: rpl_insert_header

/*---------------------------------------------------------------------------*/voidrpl_insert_header(void){#if RPL_INSERT_HBH_OPTION  if(default_instance != NULL && !uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {    rpl_update_header_empty();  }#endif}
开发者ID:Ayesha-N,项目名称:6lbr,代码行数:10,


示例5: uip_icmp6_echo_request_input

/*---------------------------------------------------------------------------*/voiduip_icmp6_echo_request_input(void){#if UIP_CONF_IPV6_RPL  u8_t temp_ext_len;#endif /* UIP_CONF_IPV6_RPL */  /*   * we send an echo reply. It is trivial if there was no extension   * headers in the request otherwise we need to remove the extension   * headers and change a few fields   */  PRINTF("Received Echo Request from");  PRINT6ADDR(&UIP_IP_BUF->srcipaddr);  PRINTF("to");  PRINT6ADDR(&UIP_IP_BUF->destipaddr);  PRINTF("/n");  /* IP header */  UIP_IP_BUF->ttl = uip_ds6_if.cur_hop_limit;  if(uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)){    uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, &UIP_IP_BUF->srcipaddr);    uip_ds6_select_src(&UIP_IP_BUF->srcipaddr, &UIP_IP_BUF->destipaddr);  } else {    uip_ipaddr_copy(&tmp_ipaddr, &UIP_IP_BUF->srcipaddr);    uip_ipaddr_copy(&UIP_IP_BUF->srcipaddr, &UIP_IP_BUF->destipaddr);    uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, &tmp_ipaddr);  }  if(uip_ext_len > 0) {#if UIP_CONF_IPV6_RPL    if ((temp_ext_len=rpl_invert_header())) {      /* If there were other extension headers*/      UIP_FIRST_EXT_BUF->next = UIP_PROTO_ICMP6;      if (uip_ext_len != temp_ext_len) {        uip_len -= (uip_ext_len - temp_ext_len);        UIP_IP_BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);        UIP_IP_BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);        /* move the echo request payload (starting after the icmp header)         * to the new location in the reply.         * The shift is equal to the length of the remaining extension headers present         * Note: UIP_ICMP_BUF still points to the echo request at this stage         */      memmove((uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN - (uip_ext_len - temp_ext_len),              (uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN,              (uip_len - UIP_IPH_LEN - temp_ext_len - UIP_ICMPH_LEN));      }      uip_ext_len=temp_ext_len;    } else {
开发者ID:iainwp,项目名称:contiki-sensinode,代码行数:50,


示例6: uip_icmp6_echo_request_input

voiduip_icmp6_echo_request_input(void){  /*   * we send an echo reply. It is trivial if there was no extension   * headers in the request otherwise we need to remove the extension   * headers and change a few fields   */  PRINTF("Received Echo Request from");  PRINT6ADDR(&UIP_IP_BUF->srcipaddr);  PRINTF("to");  PRINT6ADDR(&UIP_IP_BUF->destipaddr);  PRINTF("/n");  /* IP header */  UIP_IP_BUF->ttl = uip_netif_physical_if[interface_number].cur_hop_limit;  if(uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)){    uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, &UIP_IP_BUF->srcipaddr);    uip_netif_select_src(&UIP_IP_BUF->srcipaddr, &UIP_IP_BUF->destipaddr);  } else {    uip_ipaddr_copy(&tmp_ipaddr, &UIP_IP_BUF->srcipaddr);    uip_ipaddr_copy(&UIP_IP_BUF->srcipaddr, &UIP_IP_BUF->destipaddr);    uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, &tmp_ipaddr);  }  if(uip_ext_len > 0) {    /* If there were extension headers*/    UIP_IP_BUF->proto = UIP_PROTO_ICMP6;    uip_len -= uip_ext_len;    UIP_IP_BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);    UIP_IP_BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);    /* move the echo request payload (starting after the icmp header)     * to the new location in the reply.     * The shift is equal to the length of the extension headers present     * Note: UIP_ICMP_BUF still points to the echo request at this stage     */#ifdef RB    memmove(((void *)UIP_ICMP_BUF + (void *)( UIP_ICMPH_LEN - uip_ext_len)),            (((void *)UIP_ICMP_BUF) +( (void *)UIP_ICMPH_LEN)),            ((uip_len - UIP_IPH_LEN) - UIP_ICMPH_LEN));#endif 	   memmove(((void *) (UIP_ICMP_BUF + (( UIP_ICMPH_LEN - uip_ext_len)))),               ((void *) (UIP_ICMP_BUF + (UIP_ICMPH_LEN))),               ((uip_len - UIP_IPH_LEN) - UIP_ICMPH_LEN));  }
开发者ID:roland-wilhelm,项目名称:iot,代码行数:47,


示例7: echo_request_input

/*---------------------------------------------------------------------------*/static voidecho_request_input(void){  /*   * we send an echo reply. It is trivial if there was no extension   * headers in the request otherwise we need to remove the extension   * headers and change a few fields   */  PRINTF("Received Echo Request from ");  PRINT6ADDR(&UIP_IP_BUF->srcipaddr);  PRINTF(" to ");  PRINT6ADDR(&UIP_IP_BUF->destipaddr);  PRINTF("/n");  /* IP header */  UIP_IP_BUF->ttl = uip_ds6_if.cur_hop_limit;  if(uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)){    uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, &UIP_IP_BUF->srcipaddr);    uip_ds6_select_src(&UIP_IP_BUF->srcipaddr, &UIP_IP_BUF->destipaddr);  } else {    uip_ipaddr_copy(&tmp_ipaddr, &UIP_IP_BUF->srcipaddr);    uip_ipaddr_copy(&UIP_IP_BUF->srcipaddr, &UIP_IP_BUF->destipaddr);    uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, &tmp_ipaddr);  }  if(uip_ext_len > 0) {    /* Remove extension headers if any */    UIP_IP_BUF->proto = UIP_PROTO_ICMP6;    uip_len -= uip_ext_len;    UIP_IP_BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);    UIP_IP_BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);    /* move the echo request payload (starting after the icmp header)     * to the new location in the reply.     * The shift is equal to the length of the extension headers present     * Note: UIP_ICMP_BUF still points to the echo request at this stage     */    memmove((uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN - uip_ext_len,        (uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN,        (uip_len - UIP_IPH_LEN - UIP_ICMPH_LEN));    uip_ext_len = 0;  }
开发者ID:PureEngineering,项目名称:contiki,代码行数:43,


示例8: uip_netif_select_src

/*---------------------------------------------------------------------------*/voiduip_netif_select_src(uip_ipaddr_t *src, uip_ipaddr_t *dst){     u8_t best = 0; /* number of bit in common with best match*/  u8_t n = 0;  u8_t index = 0;    if(!uip_is_addr_link_local(dst) && !uip_is_addr_mcast(dst)) {    for(i = 1; i < UIP_CONF_NETIF_MAX_ADDRESSES; ++i) {      if(uip_netif_physical_if.addresses[i].state == PREFERRED){        n = get_match_length(dst, &(uip_netif_physical_if.addresses[i].ipaddr));        if(n >= best){          best = n;          index = i;        }      }    }  }  uip_ipaddr_copy(src, &(uip_netif_physical_if.addresses[index].ipaddr));  return;}
开发者ID:EDAyele,项目名称:ptunes,代码行数:23,


示例9: tcpip_ipv6_output

voidtcpip_ipv6_output(void){  struct uip_nd6_neighbor *nbc = NULL;  struct uip_nd6_defrouter *dr = NULL;    if(uip_len == 0)    return;  if(uip_len > UIP_LINK_MTU){    UIP_LOG("tcpip_ipv6_output: Packet to big");    uip_len = 0;    return;  }  if(uip_is_addr_unspecified(&UIP_IP_BUF->destipaddr)){    UIP_LOG("tcpip_ipv6_output: Destination address unspecified");    uip_len = 0;    return;  }  if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {    /*If destination is on link */    nbc = NULL;    if(uip_nd6_is_addr_onlink(&UIP_IP_BUF->destipaddr)){      nbc = uip_nd6_nbrcache_lookup(&UIP_IP_BUF->destipaddr);    } else {#if UIP_CONF_ROUTER      /*destination is not on link*/      uip_ipaddr_t ipaddr;      uip_ipaddr_t *next_hop;      /* Try to find the next hop address in the local routing table. */      next_hop = uip_router != NULL ?        uip_router->lookup(&UIP_IP_BUF->destipaddr, &ipaddr) : NULL;      if(next_hop != NULL) {        /* Look for the next hop of the route in the neighbor cache.           Add a cache entry if we can't find it. */        nbc = uip_nd6_nbrcache_lookup(next_hop);        if(nbc == NULL) {          nbc = uip_nd6_nbrcache_add(next_hop, NULL, 1, NO_STATE);        }      } else {#endif /* UIP_CONF_ROUTER */        /* No route found, check if a default router exists and use it then. */        dr = uip_nd6_choose_defrouter();        if(dr != NULL){          nbc = dr->nb;        } else {          /* shall we send a icmp error message destination unreachable ?*/          UIP_LOG("tcpip_ipv6_output: Destination off-link but no router");          uip_len = 0;          return;        }#if UIP_CONF_ROUTER      }#endif /* UIP_CONF_ROUTER */    }    /* there are two cases where the entry logically does not exist:     * 1 it really does not exist. 2 it is in the NO_STATE state */    if (nbc == NULL || nbc->state == NO_STATE) {      if (nbc == NULL) {        /* create neighbor cache entry, original packet is replaced by NS*/        nbc = uip_nd6_nbrcache_add(&UIP_IP_BUF->destipaddr, NULL, 0, INCOMPLETE);      } else {        nbc->state = INCOMPLETE;      }#if UIP_CONF_IPV6_QUEUE_PKT      /* copy outgoing pkt in the queuing buffer for later transmmit */      memcpy(nbc->queue_buf, UIP_IP_BUF, uip_len);      nbc->queue_buf_len = uip_len;#endif      /* RFC4861, 7.2.2:       * "If the source address of the packet prompting the solicitation is the       * same as one of the addresses assigned to the outgoing interface, that       * address SHOULD be placed in the IP Source Address of the outgoing       * solicitation.  Otherwise, any one of the addresses assigned to the       * interface should be used."*/      if(uip_netif_is_addr_my_unicast(&UIP_IP_BUF->srcipaddr)){        uip_nd6_io_ns_output(&UIP_IP_BUF->srcipaddr, NULL, &nbc->ipaddr);      } else {        uip_nd6_io_ns_output(NULL, NULL, &nbc->ipaddr);      }      stimer_set(&(nbc->last_send),                uip_netif_physical_if.retrans_timer / 1000);      nbc->count_send = 1;    } else {      if (nbc->state == INCOMPLETE){        PRINTF("tcpip_ipv6_output: neighbor cache entry incomplete/n");#if UIP_CONF_IPV6_QUEUE_PKT        /* copy outgoing pkt in the queuing buffer for later transmmit and set           the destination neighbor to nbc */        memcpy(nbc->queue_buf, UIP_IP_BUF, uip_len);        nbc->queue_buf_len = uip_len;        uip_len = 0;#endif /*UIP_CONF_IPV6_QUEUE_PKT*/        return;      }      /* if running NUD (nbc->state == STALE, DELAY, or PROBE ) keep         sending in parallel see rfc 4861 Node behavior in section 7.7.3*/	 //.........这里部分代码省略.........
开发者ID:EDAyele,项目名称:ptunes,代码行数:101,


示例10: sizeof

struct net_context *net_context_get(enum ip_protocol ip_proto,					const struct net_addr *remote_addr,					uint16_t remote_port,					struct net_addr *local_addr,					uint16_t local_port){#ifdef CONFIG_NETWORKING_WITH_IPV6	const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;	const uip_ds6_addr_t *uip_addr;	uip_ipaddr_t ipaddr;#endif	int i;	struct net_context *context = NULL;	/* User must provide storage for the local address. */	if (!local_addr) {		return NULL;	}#ifdef CONFIG_NETWORKING_WITH_IPV6	if (memcmp(&local_addr->in6_addr, &in6addr_any,				  sizeof(in6addr_any)) == 0) {		uip_addr = uip_ds6_get_global(-1);		if (!uip_addr) {			uip_addr = uip_ds6_get_link_local(-1);		}		if (!uip_addr) {			return NULL;		}		memcpy(&local_addr->in6_addr, &uip_addr->ipaddr,		       sizeof(struct in6_addr));	}#else	if (local_addr->in_addr.s_addr == INADDR_ANY) {		uip_gethostaddr((uip_ipaddr_t *)&local_addr->in_addr);	}#endif	nano_sem_take(&contexts_lock, TICKS_UNLIMITED);	if (local_port) {		if (context_port_used(ip_proto, local_port, local_addr) < 0) {			return NULL;		}	} else {		do {			local_port = random_rand() | 0x8000;		} while (context_port_used(ip_proto, local_port,					   local_addr) == -EEXIST);	}	for (i = 0; i < NET_MAX_CONTEXT; i++) {		if (!contexts[i].tuple.ip_proto) {			contexts[i].tuple.ip_proto = ip_proto;			contexts[i].tuple.remote_addr = (struct net_addr *)remote_addr;			contexts[i].tuple.remote_port = remote_port;			contexts[i].tuple.local_addr = (struct net_addr *)local_addr;			contexts[i].tuple.local_port = local_port;			context = &contexts[i];			break;		}	}	context_sem_give(&contexts_lock);	/* Set our local address */#ifdef CONFIG_NETWORKING_WITH_IPV6	memcpy(&ipaddr.u8, local_addr->in6_addr.s6_addr, sizeof(ipaddr.u8));	if (uip_is_addr_mcast(&ipaddr)) {		uip_ds6_maddr_add(&ipaddr);	} else {		uip_ds6_addr_add(&ipaddr, 0, ADDR_MANUAL);	}#endif	return context;}
开发者ID:32bitmicro,项目名称:zephyr,代码行数:78,


示例11: tcpip_ipv6_output

voidtcpip_ipv6_output(void){    uip_ds6_nbr_t *nbr = NULL;    uip_ipaddr_t *nexthop;    if(uip_len == 0) {        return;    }    if(uip_len > UIP_LINK_MTU) {        UIP_LOG("tcpip_ipv6_output: Packet to big");        uip_len = 0;        return;    }    if(uip_is_addr_unspecified(&UIP_IP_BUF->destipaddr)) {        UIP_LOG("tcpip_ipv6_output: Destination address unspecified");        uip_len = 0;        return;    }    if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {        /* Next hop determination */        nbr = NULL;        if(uip_ds6_is_addr_onlink(&UIP_IP_BUF->destipaddr)) {            nexthop = &UIP_IP_BUF->destipaddr;        } else {            uip_ds6_route_t* locrt;            locrt = uip_ds6_route_lookup(&UIP_IP_BUF->destipaddr);            if(locrt == NULL) {                if((nexthop = uip_ds6_defrt_choose()) == NULL) {#ifdef UIP_FALLBACK_INTERFACE                    PRINTF("FALLBACK: removing ext hdrs & setting proto %d %d/n",                           uip_ext_len, *((uint8_t *)UIP_IP_BUF + 40));                    if(uip_ext_len > 0) {                        extern void remove_ext_hdr(void);                        uint8_t proto = *((uint8_t *)UIP_IP_BUF + 40);                        remove_ext_hdr();                        /* This should be copied from the ext header... */                        UIP_IP_BUF->proto = proto;                    }                    UIP_FALLBACK_INTERFACE.output();#else                    PRINTF("tcpip_ipv6_output: Destination off-link but no route/n");#endif /* !UIP_FALLBACK_INTERFACE */                    uip_len = 0;                    return;                }            } else {                nexthop = &locrt->nexthop;            }#if TCPIP_CONF_ANNOTATE_TRANSMISSIONS            if(nexthop != NULL) {                printf("#L %u 1; red/n", nexthop->u8[sizeof(uip_ipaddr_t) - 1]);            }#endif /* TCPIP_CONF_ANNOTATE_TRANSMISSIONS */        }        /* End of next hop determination */#if UIP_CONF_IPV6_RPL        if(rpl_update_header_final(nexthop)) {            uip_len = 0;            return;        }#endif /* UIP_CONF_IPV6_RPL */        if((nbr = uip_ds6_nbr_lookup(nexthop)) == NULL) {#if UIP_ND6_SEND_NA            if((nbr = uip_ds6_nbr_add(nexthop, NULL, 0, NBR_INCOMPLETE)) == NULL) {                uip_len = 0;                return;            } else {#if UIP_CONF_IPV6_QUEUE_PKT                /* Copy outgoing pkt in the queuing buffer for later transmit. */                if(uip_packetqueue_alloc(&nbr->packethandle, UIP_DS6_NBR_PACKET_LIFETIME) != NULL) {                    memcpy(uip_packetqueue_buf(&nbr->packethandle), UIP_IP_BUF, uip_len);                    uip_packetqueue_set_buflen(&nbr->packethandle, uip_len);                }#endif                /* RFC4861, 7.2.2:                 * "If the source address of the packet prompting the solicitation is the                 * same as one of the addresses assigned to the outgoing interface, that                 * address SHOULD be placed in the IP Source Address of the outgoing                 * solicitation.  Otherwise, any one of the addresses assigned to the                 * interface should be used."*/                if(uip_ds6_is_my_addr(&UIP_IP_BUF->srcipaddr)) {                    uip_nd6_ns_output(&UIP_IP_BUF->srcipaddr, NULL, &nbr->ipaddr);                } else {                    uip_nd6_ns_output(NULL, NULL, &nbr->ipaddr);                }                stimer_set(&nbr->sendns, uip_ds6_if.retrans_timer / 1000);                nbr->nscount = 1;            }#endif /* UIP_ND6_SEND_NA */        } else {#if UIP_ND6_SEND_NA            if(nbr->state == NBR_INCOMPLETE) {                PRINTF("tcpip_ipv6_output: nbr cache entry incomplete/n");#if UIP_CONF_IPV6_QUEUE_PKT                /* Copy outgoing pkt in the queuing buffer for later transmit and set//.........这里部分代码省略.........
开发者ID:kenog,项目名称:contiki-inga,代码行数:101,


示例12: ext_hdr_options_process

/** * /brief Process the options in Destination and Hop By Hop extension headers */static u8_text_hdr_options_process() { /*  * Length field in the extension header: length of th eheader in units of  * 8 bytes, excluding the first 8 bytes  * length field in an option : the length of data in the option  */  uip_ext_opt_offset = 2;  while(uip_ext_opt_offset  < ((UIP_EXT_BUF->len << 3) + 8)) {    switch (UIP_EXT_HDR_OPT_BUF->type) {      /*       * for now we do not support any options except padding ones       * PAD1 does not make sense as the header must be 8bytes aligned,       * hence we can only have       */      case UIP_EXT_HDR_OPT_PAD1:        PRINTF("Processing PAD1 option/n");        uip_ext_opt_offset += 1;        break;      case UIP_EXT_HDR_OPT_PADN:        PRINTF("Processing PADN option/n");        uip_ext_opt_offset += UIP_EXT_HDR_OPT_PADN_BUF->opt_len + 2;        break;      case UIP_EXT_HDR_OPT_RPL:        PRINTF("Processing RPL option/n");        if (rpl_verify_header(uip_ext_opt_offset)) {          PRINTF("RPL Option Error : Dropping Packet");          return 1;        }        uip_ext_opt_offset += (UIP_EXT_HDR_OPT_RPL_BUF->opt_len) + 2;        return 0;      default:        /*         * check the two highest order bits of the option         * - 00 skip over this option and continue processing the header.         * - 01 discard the packet.         * - 10 discard the packet and, regardless of whether or not the         *   packet's Destination Address was a multicast address, send an         *   ICMP Parameter Problem, Code 2, message to the packet's         *   Source Address, pointing to the unrecognized Option Type.         * - 11 discard the packet and, only if the packet's Destination         *   Address was not a multicast address, send an ICMP Parameter         *   Problem, Code 2, message to the packet's Source Address,         *   pointing to the unrecognized Option Type.         */        PRINTF("MSB %x/n", UIP_EXT_HDR_OPT_BUF->type);        switch(UIP_EXT_HDR_OPT_BUF->type & 0xC0) {          case 0:            break;          case 0x40:            return 1;          case 0xC0:            if(uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {              return 1;            }          case 0x80:            uip_icmp6_error_output(ICMP6_PARAM_PROB, ICMP6_PARAMPROB_OPTION,                             (u32_t)UIP_IPH_LEN + uip_ext_len + uip_ext_opt_offset);            return 2;        }        /* in the cases were we did not discard, update ext_opt* */        uip_ext_opt_offset += UIP_EXT_HDR_OPT_BUF->len + 2;        break;    }  }  return 0;}
开发者ID:Feandil,项目名称:RPL_Gateway,代码行数:70,


示例13: tcpip_ipv6_output

voidtcpip_ipv6_output(void){  uip_ds6_nbr_t *nbr = NULL;  uip_ipaddr_t* nexthop;    if(uip_len == 0) {    return;  }    if(uip_len > UIP_LINK_MTU) {    UIP_LOG("tcpip_ipv6_output: Packet to big");    uip_len = 0;    return;  }  if(uip_is_addr_unspecified(&UIP_IP_BUF->destipaddr)){    UIP_LOG("tcpip_ipv6_output: Destination address unspecified");    uip_len = 0;    return;  }  if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {    /* Next hop determination */    nbr = NULL;    if(uip_ds6_is_addr_onlink(&UIP_IP_BUF->destipaddr)){      nexthop = &UIP_IP_BUF->destipaddr;    } else {      uip_ds6_route_t* locrt;      locrt = uip_ds6_route_lookup(&UIP_IP_BUF->destipaddr);      if(locrt == NULL) {        if((nexthop = uip_ds6_defrt_choose()) == NULL) {#ifdef UIP_FALLBACK_INTERFACE	  UIP_FALLBACK_INTERFACE.output();#else          PRINTF("tcpip_ipv6_output: Destination off-link but no route/n");#endif          uip_len = 0;          return;        }      } else {        nexthop = &locrt->nexthop;      }    }    /* end of next hop determination */   // if((nbr = uip_ds6_nbr_lookup(nexthop)) == NULL) {	if(0){	/* 	 * I-D.ietf.6lowpan-nd 5.7: As all prefixes but the link-local prefix are	 * always assumed to be off-link, multicast-based address resolution between	 * neighbors is not needed.	 * In addition, there are neither INCOMPLETE, STALE, DELAY, nor PROBE NCEs 	 * in 6LoWPAN-ND.	 */			return;    } else {    	tcpip_output(&(nbr->lladdr));      uip_len = 0;      return;    }  }     /*multicast IP destination address */  tcpip_output(NULL);  uip_len = 0;  uip_ext_len = 0;   }
开发者ID:serflosa,项目名称:torrija_gateway,代码行数:66,


示例14: tcpip_ipv6_output

voidtcpip_ipv6_output(void){  uip_ds6_nbr_t *nbr = NULL;  uip_ipaddr_t *nexthop;  if(uip_len == 0) {    return;  }  if(uip_len > UIP_LINK_MTU) {    UIP_LOG("tcpip_ipv6_output: Packet to big");    uip_clear_buf();    return;  }  if(uip_is_addr_unspecified(&UIP_IP_BUF->destipaddr)){    UIP_LOG("tcpip_ipv6_output: Destination address unspecified");    uip_clear_buf();    return;  }  if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {    /* Next hop determination */    nbr = NULL;    /* We first check if the destination address is on our immediate       link. If so, we simply use the destination address as our       nexthop address. */    if(uip_ds6_is_addr_onlink(&UIP_IP_BUF->destipaddr)){      nexthop = &UIP_IP_BUF->destipaddr;    } else {      uip_ds6_route_t *route;      /* Check if we have a route to the destination address. */      route = uip_ds6_route_lookup(&UIP_IP_BUF->destipaddr);      /* No route was found - we send to the default route instead. */      if(route == NULL) {        PRINTF("tcpip_ipv6_output: no route found, using default route/n");        nexthop = uip_ds6_defrt_choose();        if(nexthop == NULL) {#ifdef UIP_FALLBACK_INTERFACE	  PRINTF("FALLBACK: removing ext hdrs & setting proto %d %d/n", 		 uip_ext_len, *((uint8_t *)UIP_IP_BUF + 40));	  if(uip_ext_len > 0) {	    extern void remove_ext_hdr(void);	    uint8_t proto = *((uint8_t *)UIP_IP_BUF + 40);	    remove_ext_hdr();	    /* This should be copied from the ext header... */	    UIP_IP_BUF->proto = proto;	  }	  /* Inform the other end that the destination is not reachable. If it's	   * not informed routes might get lost unexpectedly until there's a need	   * to send a new packet to the peer */	  if(UIP_FALLBACK_INTERFACE.output() < 0) {	    PRINTF("FALLBACK: output error. Reporting DST UNREACH/n");	    uip_icmp6_error_output(ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_ADDR, 0);	    uip_flags = 0;	    tcpip_ipv6_output();	    return;	  }#else          PRINTF("tcpip_ipv6_output: Destination off-link but no route/n");#endif /* !UIP_FALLBACK_INTERFACE */          uip_clear_buf();          return;        }      } else {        /* A route was found, so we look up the nexthop neighbor for           the route. */        nexthop = uip_ds6_route_nexthop(route);        /* If the nexthop is dead, for example because the neighbor           never responded to link-layer acks, we drop its route. */        if(nexthop == NULL) {#if UIP_CONF_IPV6_RPL          /* If we are running RPL, and if we are the root of the             network, we'll trigger a global repair berfore we remove             the route. */          rpl_dag_t *dag;          rpl_instance_t *instance;          dag = (rpl_dag_t *)route->state.dag;          if(dag != NULL) {            instance = dag->instance;            rpl_repair_root(instance->instance_id);          }#endif /* UIP_CONF_IPV6_RPL */          uip_ds6_route_rm(route);          /* We don't have a nexthop to send the packet to, so we drop             it. */          return;        }      }#if TCPIP_CONF_ANNOTATE_TRANSMISSIONS      if(nexthop != NULL) {        static uint8_t annotate_last;//.........这里部分代码省略.........
开发者ID:1847123212,项目名称:ampm_contiki_wisun,代码行数:101,


示例15: uip_process

/*---------------------------------------------------------------------------*/voiduip_process(){  PRINTF("NEW packet/n");  /* Check validity of the IP header. */  if((UIP_IP_BUF->vtc & 0xf0) != 0x60)  { /* IP version and header length. */    PRINTF("Wrong IP Version/n");    goto drop;  }  /*   * Check the size of the packet. If the size reported to us in   * uip_len is smaller the size reported in the IP header, we assume   * that the packet has been corrupted in transit. If the size of   * uip_len is larger than the size reported in the IP packet header,   * the packet has been padded and we set uip_len to the correct   * value..   */  if((UIP_IP_BUF->len[0] << 8) + UIP_IP_BUF->len[1] <= uip_len) {    uip_len = (UIP_IP_BUF->len[0] << 8) + UIP_IP_BUF->len[1] + UIP_IPH_LEN;    /*     * The length reported in the IPv6 header is the     * length of the payload that follows the     * header. However, uIP uses the uip_len variable     * for holding the size of the entire packet,     * including the IP header. For IPv4 this is not a     * problem as the length field in the IPv4 header     * contains the length of the entire packet. But     * for IPv6 we need to add the size of the IPv6     * header (40 bytes).     */  } else {    PRINTF("Wrong Length/n");    goto drop;  }    PRINTF("IPv6 packet received from ");  PRINT6ADDR(&UIP_IP_BUF->srcipaddr);  PRINTF(" to ");  PRINT6ADDR(&UIP_IP_BUF->destipaddr);  PRINTF("/n");  if(uip_is_addr_mcast(&UIP_IP_BUF->srcipaddr)){    PRINTF("Dropping packet, src is mcast/n");    goto drop;  }  /*   * Next header field processing. In IPv6, we can have extension headers,   * if present, the Hop-by-Hop Option must be processed before forwarding   * the packet.   */  uip_next_hdr = &UIP_IP_BUF->proto;  uip_ext_len = 0;  uip_ext_bitmap = 0;  if (*uip_next_hdr == UIP_PROTO_HBHO) {#if UIP_CONF_IPV6_CHECKS    uip_ext_bitmap |= UIP_EXT_HDR_BITMAP_HBHO;#endif /*UIP_CONF_IPV6_CHECKS*/    switch(ext_hdr_options_process()) {      case 0:        /*continue*/        uip_next_hdr = &UIP_EXT_BUF->next;        uip_ext_len += (UIP_EXT_BUF->len << 3) + 8;        break;      case 1:        /*silently discard*/        goto drop;      case 2:        /* send icmp error message (created in ext_hdr_options_process)         * and discard*/        goto send;    }  }  /* TBD Some Parameter problem messages */  if(!uip_ds6_is_my_addr(&UIP_IP_BUF->destipaddr) &&     !uip_ds6_is_my_maddr(&UIP_IP_BUF->destipaddr)) {    if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr) &&       !uip_is_addr_link_local(&UIP_IP_BUF->destipaddr) &&       !uip_is_addr_link_local(&UIP_IP_BUF->srcipaddr) &&       !uip_is_addr_unspecified(&UIP_IP_BUF->srcipaddr) &&       !uip_is_addr_loopback(&UIP_IP_BUF->destipaddr)) {      /* Check MTU */      if(uip_len > UIP_LINK_MTU) {        uip_icmp6_error_output(ICMP6_PACKET_TOO_BIG, 0, UIP_LINK_MTU);        goto send;      }      /* Check Hop Limit */      if(UIP_IP_BUF->ttl <= 1) {        uip_icmp6_error_output(ICMP6_TIME_EXCEEDED,                               ICMP6_TIME_EXCEED_TRANSIT, 0);        goto send;      }//.........这里部分代码省略.........
开发者ID:Feandil,项目名称:RPL_Gateway,代码行数:101,


示例16: ns_input

static voidns_input(void){    uint8_t flags;#if CETIC_6LBR_SMARTBRIDGE    uip_ds6_route_t * route;#endif    uip_ipaddr_t tgtipaddr;    PRINTF("Received NS from ");    PRINT6ADDR(&UIP_IP_BUF->srcipaddr);    PRINTF(" to ");    PRINT6ADDR(&UIP_IP_BUF->destipaddr);    PRINTF(" with target address");    PRINT6ADDR((uip_ipaddr_t *) (&UIP_ND6_NS_BUF->tgtipaddr));    PRINTF("/n");    UIP_STAT(++uip_stat.nd6.recv);#if UIP_CONF_IPV6_CHECKS    if((UIP_IP_BUF->ttl != UIP_ND6_HOP_LIMIT) ||            (uip_is_addr_mcast(&UIP_ND6_NS_BUF->tgtipaddr)) ||            (UIP_ICMP_BUF->icode != 0)) {        PRINTF("NS received is bad/n");        goto discard;    }#endif /* UIP_CONF_IPV6_CHECKS */    /* Options processing */    nd6_opt_llao = NULL;    nd6_opt_offset = UIP_ND6_NS_LEN;    while(uip_l3_icmp_hdr_len + nd6_opt_offset < uip_len) {#if UIP_CONF_IPV6_CHECKS        if(UIP_ND6_OPT_HDR_BUF->len == 0) {            PRINTF("NS received is bad/n");            goto discard;        }#endif /* UIP_CONF_IPV6_CHECKS */        switch (UIP_ND6_OPT_HDR_BUF->type) {        case UIP_ND6_OPT_SLLAO:            nd6_opt_llao = &uip_buf[uip_l2_l3_icmp_hdr_len + nd6_opt_offset];#if UIP_CONF_IPV6_CHECKS            /* There must be NO option in a DAD NS */            if(uip_is_addr_unspecified(&UIP_IP_BUF->srcipaddr)) {                PRINTF("NS received is bad/n");                goto discard;            } else {#endif /*UIP_CONF_IPV6_CHECKS */                nbr = uip_ds6_nbr_lookup(&UIP_IP_BUF->srcipaddr);                if(nbr == NULL) {                    /* Copy link address to a uip_lladdr_t first                     * to ensure the second argument to uip_ds6_nbr_add is word-aligned */                    uip_lladdr_t lladdr;                    memcpy(&lladdr, &nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET], UIP_LLADDR_LEN);                    uip_ds6_nbr_add(&UIP_IP_BUF->srcipaddr, &lladdr, 0, NBR_STALE);                } else {                    uip_lladdr_t *lladdr = (uip_lladdr_t *)uip_ds6_nbr_get_ll(nbr);                    if(memcmp(&nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET],                              lladdr, UIP_LLADDR_LEN) != 0) {                        memcpy(lladdr, &nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET], UIP_LLADDR_LEN);                        nbr->state = NBR_STALE;                    } else {                        if(nbr->state == NBR_INCOMPLETE) {                            nbr->state = NBR_STALE;                        }                    }                }#if UIP_CONF_IPV6_CHECKS            }#endif /*UIP_CONF_IPV6_CHECKS */            break;        default:            PRINTF("ND option not supported in NS");            break;        }        nd6_opt_offset += (UIP_ND6_OPT_HDR_BUF->len << 3);    }    memcpy(&tgtipaddr, &UIP_ND6_NS_BUF->tgtipaddr, sizeof(tgtipaddr));    addr = uip_ds6_addr_lookup(&tgtipaddr);#if CETIC_6LBR_SMARTBRIDGE    //ND Proxy implementation    if ( addr == NULL ) {        if ( (route = uip_ds6_route_lookup(&tgtipaddr)) != NULL ) {            if(uip_is_addr_unspecified(&UIP_IP_BUF->srcipaddr)) {                /* DAD CASE */                uip_create_linklocal_allnodes_mcast(&tgtipaddr);                uip_ipaddr_copy(&UIP_IP_BUF->srcipaddr, &tgtipaddr);                flags = UIP_ND6_NA_FLAG_OVERRIDE;                goto create_na;            } else {                uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, &UIP_IP_BUF->srcipaddr);                uip_ipaddr_copy(&UIP_IP_BUF->srcipaddr, &tgtipaddr);                flags = UIP_ND6_NA_FLAG_SOLICITED | UIP_ND6_NA_FLAG_OVERRIDE;                goto create_na;            }        }    }#endif    if(addr != NULL) {#if UIP_ND6_DEF_MAXDADNS > 0//.........这里部分代码省略.........
开发者ID:drandreas,项目名称:6lbr,代码行数:101,


示例17: na_input

/** * Neighbor Advertisement Processing * * we might have to send a pkt that had been buffered while address * resolution was performed (if we support buffering, see UIP_CONF_QUEUE_PKT) * * As per RFC 4861, on link layer that have addresses, TLLAO options MUST be * included when responding to multicast solicitations, SHOULD be included in * response to unicast (here we assume it is for now) * * NA can be received after sending NS for DAD, Address resolution or NUD. Can * be unsolicited as well. * It can trigger update of the state of the neighbor in the neighbor cache, * router in the router list. * If the NS was for DAD, it means DAD failed * */static voidna_input(void){#if CETIC_6LBR_SMARTBRIDGE    uip_ds6_route_t * route;#endif    uint8_t is_llchange;    uint8_t is_router;    uint8_t is_solicited;    uint8_t is_override;    PRINTF("Received NA from");    PRINT6ADDR(&UIP_IP_BUF->srcipaddr);    PRINTF("to");    PRINT6ADDR(&UIP_IP_BUF->destipaddr);    PRINTF("with target address");    PRINT6ADDR((uip_ipaddr_t *) (&UIP_ND6_NA_BUF->tgtipaddr));    PRINTF("/n");    UIP_STAT(++uip_stat.nd6.recv);    /*     * booleans. the three last one are not 0 or 1 but 0 or 0x80, 0x40, 0x20     * but it works. Be careful though, do not use tests such as is_router == 1     */    is_llchange = 0;    is_router = ((UIP_ND6_NA_BUF->flagsreserved & UIP_ND6_NA_FLAG_ROUTER));    is_solicited =        ((UIP_ND6_NA_BUF->flagsreserved & UIP_ND6_NA_FLAG_SOLICITED));    is_override =        ((UIP_ND6_NA_BUF->flagsreserved & UIP_ND6_NA_FLAG_OVERRIDE));#if UIP_CONF_IPV6_CHECKS    if((UIP_IP_BUF->ttl != UIP_ND6_HOP_LIMIT) ||            (UIP_ICMP_BUF->icode != 0) ||            (uip_is_addr_mcast(&UIP_ND6_NA_BUF->tgtipaddr)) ||            (is_solicited && uip_is_addr_mcast(&UIP_IP_BUF->destipaddr))) {        PRINTF("NA received is bad/n");        goto discard;    }#endif /*UIP_CONF_IPV6_CHECKS */    /* Options processing: we handle TLLAO, and must ignore others */    nd6_opt_offset = UIP_ND6_NA_LEN;    nd6_opt_llao = NULL;    while(uip_l3_icmp_hdr_len + nd6_opt_offset < uip_len) {#if UIP_CONF_IPV6_CHECKS        if(UIP_ND6_OPT_HDR_BUF->len == 0) {            PRINTF("NA received is bad/n");            goto discard;        }#endif /*UIP_CONF_IPV6_CHECKS */        switch (UIP_ND6_OPT_HDR_BUF->type) {        case UIP_ND6_OPT_TLLAO:            nd6_opt_llao = (uint8_t *)UIP_ND6_OPT_HDR_BUF;            break;        default:            PRINTF("ND option not supported in NA/n");            break;        }        nd6_opt_offset += (UIP_ND6_OPT_HDR_BUF->len << 3);    }#if CETIC_6LBR_SMARTBRIDGE    /* Address Advertisement */    if ( (nvm_data.mode & CETIC_MODE_SMART_MULTI_BR) != 0 ) {        if (uip_is_addr_mcast(&UIP_IP_BUF->destipaddr) && uip_is_mcast_group_id_all_nodes(&UIP_IP_BUF->destipaddr)) {            LOG6LBR_6ADDR(INFO, &UIP_ND6_NA_BUF->tgtipaddr, "Received purge NA for ");#if CETIC_NODE_INFO            node_info_rm_by_addr(&UIP_ND6_NA_BUF->tgtipaddr);#endif            route = uip_ds6_route_lookup(&UIP_ND6_NA_BUF->tgtipaddr);            if (route != NULL ) {                uip_ds6_route_rm(route);            }            goto discard;        }    }#endif    addr = uip_ds6_addr_lookup(&UIP_ND6_NA_BUF->tgtipaddr);    /* Message processing, including TLLAO if any */    if(addr != NULL) {#if UIP_ND6_DEF_MAXDADNS > 0        if(addr->state == ADDR_TENTATIVE) {            uip_ds6_dad_failed(addr);//.........这里部分代码省略.........
开发者ID:drandreas,项目名称:6lbr,代码行数:101,


示例18: tcpip_ipv6_output

voidtcpip_ipv6_output(void){    static uip_ds6_nbr_t *nbr = NULL;    static uip_ipaddr_t* nexthop;    if(uip_len == 0) {        return;    }    if(uip_len > UIP_LINK_MTU) {        UIP_LOG("tcpip_ipv6_output: Packet to big");        uip_len = 0;        return;    }    if(uip_is_addr_unspecified(&UIP_IP_BUF->destipaddr)) {        UIP_LOG("tcpip_ipv6_output: Destination address unspecified");        uip_len = 0;        return;    }    if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {        /* Next hop determination */        nbr = NULL;        if(uip_ds6_is_addr_onlink(&UIP_IP_BUF->destipaddr)) {            nexthop = &UIP_IP_BUF->destipaddr;        } else {            uip_ds6_route_t* locrt;            locrt = uip_ds6_route_lookup(&UIP_IP_BUF->destipaddr);            if(locrt == NULL) {                if((nexthop = uip_ds6_defrt_choose()) == NULL) {#ifdef UIP_FALLBACK_INTERFACE                    UIP_FALLBACK_INTERFACE.output();#else                    PRINTF("tcpip_ipv6_output: Destination off-link but no route/n");#endif                    uip_len = 0;                    return;                }            } else {                nexthop = &locrt->nexthop;            }        }        /* end of next hop determination */        if((nbr = uip_ds6_nbr_lookup(nexthop)) == NULL) {            //      printf("add1 %d/n", nexthop->u8[15]);            if((nbr = uip_ds6_nbr_add(nexthop, NULL, 0, NBR_INCOMPLETE)) == NULL) {                //        printf("add n/n");                uip_len = 0;                return;            } else {#if UIP_CONF_IPV6_QUEUE_PKT                /* copy outgoing pkt in the queuing buffer for later transmmit */                if(uip_packetqueue_alloc(&nbr->packethandle, UIP_DS6_NBR_PACKET_LIFETIME) != NULL) {                    memcpy(uip_packetqueue_buf(&nbr->packethandle), UIP_IP_BUF, uip_len);                    uip_packetqueue_set_buflen(&nbr->packethandle, uip_len);                }#endif                /* RFC4861, 7.2.2:                 * "If the source address of the packet prompting the solicitation is the                 * same as one of the addresses assigned to the outgoing interface, that                 * address SHOULD be placed in the IP Source Address of the outgoing                 * solicitation.  Otherwise, any one of the addresses assigned to the                 * interface should be used."*/                if(uip_ds6_is_my_addr(&UIP_IP_BUF->srcipaddr)) {                    uip_nd6_ns_output(&UIP_IP_BUF->srcipaddr, NULL, &nbr->ipaddr);                } else {                    uip_nd6_ns_output(NULL, NULL, &nbr->ipaddr);                }                stimer_set(&(nbr->sendns), uip_ds6_if.retrans_timer / 1000);                nbr->nscount = 1;            }        } else {            if(nbr->state == NBR_INCOMPLETE) {                PRINTF("tcpip_ipv6_output: nbr cache entry incomplete/n");#if UIP_CONF_IPV6_QUEUE_PKT                /* copy outgoing pkt in the queuing buffer for later transmmit and set                   the destination nbr to nbr */                if(uip_packetqueue_alloc(&nbr->packethandle, UIP_DS6_NBR_PACKET_LIFETIME) != NULL) {                    memcpy(uip_packetqueue_buf(&nbr->packethandle), UIP_IP_BUF, uip_len);                    uip_packetqueue_set_buflen(&nbr->packethandle, uip_len);                }                /*        memcpy(nbr->queue_buf, UIP_IP_BUF, uip_len);                          nbr->queue_buf_len = uip_len;*/                uip_len = 0;#endif /*UIP_CONF_IPV6_QUEUE_PKT*/                return;            }            /* if running NUD (nbc->state == STALE, DELAY, or PROBE ) keep               sending in parallel see rfc 4861 Node behavior in section 7.7.3*/            if(nbr->state == NBR_STALE) {                nbr->state = NBR_DELAY;                stimer_set(&(nbr->reachable),                           UIP_ND6_DELAY_FIRST_PROBE_TIME);                nbr->nscount = 0;                PRINTF("tcpip_ipv6_output: nbr cache entry stale moving to delay/n");            }            stimer_set(&(nbr->sendns),//.........这里部分代码省略.........
开发者ID:brycel,项目名称:ContikiCC2530Port,代码行数:101,


示例19: uip_nd6_ns_input

voiduip_nd6_ns_input(void){  u8_t flags;  PRINTF("Received NS from");  PRINT6ADDR(&UIP_IP_BUF->srcipaddr);  PRINTF("to");  PRINT6ADDR(&UIP_IP_BUF->destipaddr);  PRINTF("with target address");  PRINT6ADDR((uip_ipaddr_t *) (&UIP_ND6_NS_BUF->tgtipaddr));  PRINTF("/n");  UIP_STAT(++uip_stat.nd6.recv);#if UIP_CONF_IPV6_CHECKS  if((UIP_IP_BUF->ttl != UIP_ND6_HOP_LIMIT) ||     (uip_is_addr_mcast(&UIP_ND6_NS_BUF->tgtipaddr)) ||     (UIP_ICMP_BUF->icode != 0)) {    PRINTF("NS received is bad/n");    goto discard;  }#endif /* UIP_CONF_IPV6_CHECKS */  /* Options processing */  nd6_opt_llao = NULL;  nd6_opt_offset = UIP_ND6_NS_LEN;  while(uip_l3_icmp_hdr_len + nd6_opt_offset < uip_len) {#if UIP_CONF_IPV6_CHECKS    if(UIP_ND6_OPT_HDR_BUF->len == 0) {      PRINTF("NS received is bad/n");      goto discard;    }#endif /* UIP_CONF_IPV6_CHECKS */    switch (UIP_ND6_OPT_HDR_BUF->type) {    case UIP_ND6_OPT_SLLAO:      nd6_opt_llao = &uip_buf[uip_l2_l3_icmp_hdr_len + nd6_opt_offset];#if UIP_CONF_IPV6_CHECKS      /* There must be NO option in a DAD NS */      if(uip_is_addr_unspecified(&UIP_IP_BUF->srcipaddr)) {        PRINTF("NS received is bad/n");        goto discard;      } else {#endif /*UIP_CONF_IPV6_CHECKS */        nbr = uip_ds6_nbr_lookup(&UIP_IP_BUF->srcipaddr);        if(nbr == NULL) {          uip_ds6_nbr_add(&UIP_IP_BUF->srcipaddr,			  (uip_lladdr_t *)&nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET],			  0, NBR_STALE);        } else {          if(memcmp(&nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET],		    &nbr->lladdr, UIP_LLADDR_LEN) != 0) {            memcpy(&nbr->lladdr, &nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET],		   UIP_LLADDR_LEN);            nbr->state = NBR_STALE;          } else {            if(nbr->state == NBR_INCOMPLETE) {              nbr->state = NBR_STALE;            }          }        }#if UIP_CONF_IPV6_CHECKS      }#endif /*UIP_CONF_IPV6_CHECKS */      break;    default:      PRINTF("ND option not supported in NS");      break;    }    nd6_opt_offset += (UIP_ND6_OPT_HDR_BUF->len << 3);  }  addr = uip_ds6_addr_lookup(&UIP_ND6_NS_BUF->tgtipaddr);  if(addr != NULL) {    if(uip_is_addr_unspecified(&UIP_IP_BUF->srcipaddr)) {      /* DAD CASE */#if UIP_CONF_IPV6_CHECKS      if(!uip_is_addr_solicited_node(&UIP_IP_BUF->destipaddr)) {        PRINTF("NS received is bad/n");        goto discard;      }#endif /* UIP_CONF_IPV6_CHECKS */      if(addr->state != ADDR_TENTATIVE) {        uip_create_linklocal_allnodes_mcast(&UIP_IP_BUF->destipaddr);        uip_ds6_select_src(&UIP_IP_BUF->srcipaddr, &UIP_IP_BUF->destipaddr);        flags = UIP_ND6_NA_FLAG_OVERRIDE;        goto create_na;      } else {          /** /todo if I sent a NS before him, I win */        uip_ds6_dad_failed(addr);        goto discard;      }    }#if UIP_CONF_IPV6_CHECKS    if(uip_ds6_is_my_addr(&UIP_IP_BUF->srcipaddr)) {        /**         * /NOTE do we do something here? we both are using the same address.         * If we are doing dad, we could cancel it, though we should receive a         * NA in response of DAD NS we sent, hence DAD will fail anyway. If we         * were not doing DAD, it means there is a duplicate in the network!         */      PRINTF("NS received is bad/n");//.........这里部分代码省略.........
开发者ID:EmuxEvans,项目名称:ContikiCC2530Port,代码行数:101,


示例20: tcpip_ipv6_output

voidtcpip_ipv6_output(void){  uip_ds6_nbr_t *nbr = NULL;  uip_ipaddr_t *nexthop;  uip_ds6_route_t *route = NULL;  if(uip_len == 0) {    return;  }  PRINTF("IPv6 packet send from ");  PRINT6ADDR(&UIP_IP_BUF->srcipaddr);  PRINTF(" to ");  PRINT6ADDR(&UIP_IP_BUF->destipaddr);  PRINTF("/n");  if(uip_len > UIP_LINK_MTU) {    UIP_LOG("tcpip_ipv6_output: Packet to big");    uip_clear_buf();    return;  }  if(uip_is_addr_unspecified(&UIP_IP_BUF->destipaddr)){    UIP_LOG("tcpip_ipv6_output: Destination address unspecified");    uip_clear_buf();    return;  }  if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {    /* Next hop determination */    nbr = NULL;    /* We first check if the destination address is on our immediate       link. If so, we simply use the destination address as our       nexthop address. */    if(uip_ds6_is_addr_onlink(&UIP_IP_BUF->destipaddr)){      nexthop = &UIP_IP_BUF->destipaddr;    } else {      /* Check if we have a route to the destination address. */      route = uip_ds6_route_lookup(&UIP_IP_BUF->destipaddr);      /* No route was found - we send to the default route instead. */      if(route == NULL) {#if CETIC_6LBR_SMARTBRIDGE        if (uip_ipaddr_prefixcmp(&wsn_net_prefix, &UIP_IP_BUF->destipaddr, 64)) {          /* In smart-bridge mode, there is no route towards hosts on the Ethernet side          Therefore we have to check the destination and assume the host is on-link */          nexthop = &UIP_IP_BUF->destipaddr;        } else#endif#if CETIC_6LBR_ROUTER && UIP_CONF_IPV6_RPL        if (is_dodag_root() && uip_ipaddr_prefixcmp(&wsn_net_prefix, &UIP_IP_BUF->destipaddr, 64)) {          //In router mode, we drop packets towards unknown mote          PRINTF("Dropping wsn packet with no route/n");          uip_len = 0;          return;        } else#endif#if CETIC_6LBR_IP64        if(ip64_addr_is_ip64(&UIP_IP_BUF->destipaddr)) {#if UIP_CONF_IPV6_RPL          rpl_remove_header();#endif          IP64_CONF_UIP_FALLBACK_INTERFACE.output();          uip_len = 0;          uip_ext_len = 0;          return;        }        else#endif        {          PRINTF("tcpip_ipv6_output: no route found, using default route/n");          nexthop = uip_ds6_defrt_choose();        }        if(nexthop == NULL) {#ifdef UIP_FALLBACK_INTERFACE	  PRINTF("FALLBACK: removing ext hdrs & setting proto %d %d/n", 		 uip_ext_len, *((uint8_t *)UIP_IP_BUF + 40));	  if(uip_ext_len > 0) {	    extern void remove_ext_hdr(void);	    uint8_t proto = *((uint8_t *)UIP_IP_BUF + 40);	    remove_ext_hdr();	    /* This should be copied from the ext header... */	    UIP_IP_BUF->proto = proto;	  }	  UIP_FALLBACK_INTERFACE.output();#else          PRINTF("tcpip_ipv6_output: Destination off-link but no route/n");#endif /* !UIP_FALLBACK_INTERFACE */          uip_clear_buf();          return;        }      } else {        /* A route was found, so we look up the nexthop neighbor for           the route. */        nexthop = uip_ds6_route_nexthop(route);        /* If the nexthop is dead, for example because the neighbor//.........这里部分代码省略.........
开发者ID:adutze,项目名称:6lbr,代码行数:101,


示例21: uip_nd6_io_ns_input

/*------------------------------------------------------------------*/void uip_nd6_io_ns_input(void){  PRINTF("Received NS from");  PRINT6ADDR(&UIP_IP_BUF->srcipaddr);  PRINTF("to");  PRINT6ADDR(&UIP_IP_BUF->destipaddr);  PRINTF("with target address");  PRINT6ADDR((uip_ipaddr_t *)(&UIP_ND6_NS_BUF->tgtipaddr));  PRINTF("/n");  UIP_STAT(++uip_stat.nd6.recv);   u8_t flags; #if UIP_CONF_IPV6_CHECKS  if((UIP_IP_BUF->ttl != UIP_ND6_HOP_LIMIT) ||     (uip_is_addr_mcast(&UIP_ND6_NS_BUF->tgtipaddr)) ||     (UIP_ICMP_BUF->icode != 0))  {    goto badpkt;  }#endif /* UIP_CONF_IPV6_CHECKS */     /* Options reading: we handle only SLLAO for now */  nd6_opt_llao = NULL;  nd6_opt_offset = UIP_ND6_NS_LEN;  while(uip_l3_icmp_hdr_len + nd6_opt_offset < uip_len) {#if UIP_CONF_IPV6_CHECKS    if(UIP_ND6_OPT_HDR_BUF->len == 0) {      goto badpkt;    }#endif /* UIP_CONF_IPV6_CHECKS */     switch(UIP_ND6_OPT_HDR_BUF->type) {      case UIP_ND6_OPT_SLLAO:        nd6_opt_llao = (struct uip_nd6_opt_llao *)UIP_ND6_OPT_HDR_BUF;        break;      default:        UIP_LOG("ND option not supported in NS");        break;    }    nd6_opt_offset += (UIP_ND6_OPT_HDR_BUF->len << 3);  }  /* Options processing: only SLLAO */  if(nd6_opt_llao != NULL) {#if UIP_CONF_IPV6_CHECKS    /* There must be NO option in a DAD NS */    if(uip_is_addr_unspecified(&UIP_IP_BUF->srcipaddr)) {      goto badpkt;    } else {#endif /*UIP_CONF_IPV6_CHECKS*/      neighbor = uip_nd6_nbrcache_lookup(&UIP_IP_BUF->srcipaddr);      if(neighbor == NULL) {        /* we need to add the neighbor*/        uip_nd6_nbrcache_add(&UIP_IP_BUF->srcipaddr,                             &nd6_opt_llao->addr, 0, STALE);      } else {        /* If LL address changed, set neighbor state to stale */        if(memcmp(&nd6_opt_llao->addr, &neighbor->lladdr, UIP_LLADDR_LEN) != 0) {          memcpy(&neighbor->lladdr, &nd6_opt_llao->addr, UIP_LLADDR_LEN);          neighbor->state = STALE;        } else {          /* If neighbor state is INCOMPLETE, set to STALE */          if(neighbor->state == INCOMPLETE) {            neighbor->state = STALE;          }        }      }#if UIP_CONF_IPV6_CHECKS    }   #endif /*UIP_CONF_IPV6_CHECKS*/  }  /*    * Rest of NS processing: Depends on the purpose of the NS: NUD or DAD or   * Address Resolution    */  /** /note we use ifaddr to remember the target address */  ifaddr = uip_netif_addr_lookup(&UIP_ND6_NS_BUF->tgtipaddr, 128, 0);  if(ifaddr != NULL) {    if(uip_is_addr_unspecified(&UIP_IP_BUF->srcipaddr)){      /* DAD CASE */#if UIP_CONF_IPV6_CHECKS       /* Dst address must be solicited node mcast address */      if(!uip_netif_is_addr_my_solicited(&UIP_IP_BUF->destipaddr)){        goto badpkt;      }#endif /* UIP_CONF_IPV6_CHECKS */       /*       * If my address is not tentative, then send a NA to all nodes with       * TLLAO flags are: override = yes.       */        if(ifaddr->state!=TENTATIVE) {          /*          * we need to send a NA, we set the src, dest, flags. tgt remains the         * same and the rest is done at "create_na"          */        uip_create_linklocal_allnodes_mcast(&UIP_IP_BUF->destipaddr);        uip_netif_select_src(&UIP_IP_BUF->srcipaddr, &UIP_IP_BUF->destipaddr);//.........这里部分代码省略.........
开发者ID:EDAyele,项目名称:ptunes,代码行数:101,


示例22: na_input

/** * Neighbor Advertisement Processing * * we might have to send a pkt that had been buffered while address * resolution was performed (if we support buffering, see UIP_CONF_QUEUE_PKT) * * As per RFC 4861, on link layer that have addresses, TLLAO options MUST be * included when responding to multicast solicitations, SHOULD be included in * response to unicast (here we assume it is for now) * * NA can be received after sending NS for DAD, Address resolution or NUD. Can * be unsolicited as well. * It can trigger update of the state of the neighbor in the neighbor cache, * router in the router list. * If the NS was for DAD, it means DAD failed * */static voidna_input(void){  uint8_t is_llchange;  uint8_t is_router;  uint8_t is_solicited;  uint8_t is_override;  uip_lladdr_t lladdr_aligned;  PRINTF("Received NA from ");  PRINT6ADDR(&UIP_IP_BUF->srcipaddr);  PRINTF(" to ");  PRINT6ADDR(&UIP_IP_BUF->destipaddr);  PRINTF(" with target address ");  PRINT6ADDR((uip_ipaddr_t *) (&UIP_ND6_NA_BUF->tgtipaddr));  PRINTF("/n");  UIP_STAT(++uip_stat.nd6.recv);  /*   * booleans. the three last one are not 0 or 1 but 0 or 0x80, 0x40, 0x20   * but it works. Be careful though, do not use tests such as is_router == 1   */  is_llchange = 0;  is_router = ((UIP_ND6_NA_BUF->flagsreserved & UIP_ND6_NA_FLAG_ROUTER));  is_solicited =    ((UIP_ND6_NA_BUF->flagsreserved & UIP_ND6_NA_FLAG_SOLICITED));  is_override =    ((UIP_ND6_NA_BUF->flagsreserved & UIP_ND6_NA_FLAG_OVERRIDE));#if UIP_CONF_IPV6_CHECKS  if((UIP_IP_BUF->ttl != UIP_ND6_HOP_LIMIT) ||     (UIP_ICMP_BUF->icode != 0) ||     (uip_is_addr_mcast(&UIP_ND6_NA_BUF->tgtipaddr)) ||     (is_solicited && uip_is_addr_mcast(&UIP_IP_BUF->destipaddr))) {    PRINTF("NA received is bad/n");    goto discard;  }#endif /*UIP_CONF_IPV6_CHECKS */  /* Options processing: we handle TLLAO, and must ignore others */  nd6_opt_offset = UIP_ND6_NA_LEN;  nd6_opt_llao = NULL;  while(uip_l3_icmp_hdr_len + nd6_opt_offset < uip_len) {#if UIP_CONF_IPV6_CHECKS    if(UIP_ND6_OPT_HDR_BUF->len == 0) {      PRINTF("NA received is bad/n");      goto discard;    }#endif /*UIP_CONF_IPV6_CHECKS */    switch (UIP_ND6_OPT_HDR_BUF->type) {    case UIP_ND6_OPT_TLLAO:      nd6_opt_llao = (uint8_t *)UIP_ND6_OPT_HDR_BUF;      break;    default:      PRINTF("ND option not supported in NA/n");      break;    }    nd6_opt_offset += (UIP_ND6_OPT_HDR_BUF->len << 3);  }  addr = uip_ds6_addr_lookup(&UIP_ND6_NA_BUF->tgtipaddr);  /* Message processing, including TLLAO if any */  if(addr != NULL) {#if UIP_ND6_DEF_MAXDADNS > 0    if(addr->state == ADDR_TENTATIVE) {      uip_ds6_dad_failed(addr);    }#endif /*UIP_ND6_DEF_MAXDADNS > 0 */    PRINTF("NA received is bad/n");    goto discard;  } else {    const uip_lladdr_t *lladdr;    nbr = uip_ds6_nbr_lookup(&UIP_ND6_NA_BUF->tgtipaddr);    if(nbr == NULL) {      goto discard;    }    lladdr = uip_ds6_nbr_get_ll(nbr);    if(lladdr == NULL) {      goto discard;    }    if(nd6_opt_llao != NULL) {      is_llchange =        memcmp(&nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET], lladdr,               UIP_LLADDR_LEN);//.........这里部分代码省略.........
开发者ID:Conrad2210,项目名称:DEWI-Nimbus-Contiki,代码行数:101,



注:本文中的uip_is_addr_mcast函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ uip_is_addr_unspecified函数代码示例
C++ uip_is_addr_link_local函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。