/*---------------------------------------------------------------------------*/ static void packet_input(void) { #if NETSTACK_CONF_WITH_IP64 /* If NAT64 is enabled, IPv4 & ARP packets are sent to the IP64 module */ ethernet_header_t *hdr = (ethernet_header_t *)packetbuf_hdrptr(); if (hdr->et_protlen == UIP_HTONS(ETH_PROT_IP) || hdr->et_protlen == UIP_HTONS(ETH_PROT_ARP)) { IP64_INPUT(packetbuf_hdrptr(), packetbuf_totlen()); return; } #endif /* NETSTACK_CONF_WITH_IP64 */ if(NETSTACK_0_FRAMER.parse() < 0) { PRINTF("ieee8023_mac: failed to parse %u\n", (unsigned int)packetbuf_datalen()); #if IEEE8023_MAC_ADDRESS_FILTER } else if(!linkaddr6_cmp(packetbuf_addr(PACKETBUF_ADDR_RECEIVER), &linkaddr6_node_addr) && !linkaddr6_cmp(packetbuf_addr(PACKETBUF_ADDR_RECEIVER), &linkaddr6_null)) { /*\note The framer should have done the multicast address * translation from 0x33 0x33 0xXX... to the 802.3xx null */ PRINTF("ieee8023_mac: not for us\n"); #endif /* IEEE8023_MAC_ADDRESS_FILTER */ } else { int duplicate = 0; duplicate = mac_sequence_is_duplicate(); if(duplicate && ETH_SUPPORT_DUPLICATE_DETECTION) { /* Drop the packet. */ PRINTF("ieee8023_mac: drop duplicate link layer packet %u\n", packetbuf_attr(PACKETBUF_ATTR_PACKET_ID)); } else { mac_sequence_register_seqno(); } #if DEBUG int i; uint16_t original_datalen = packetbuf_totlen(); uint8_t *original_dataptr = packetbuf_hdrptr(); PRINTF("PKT[%u]:",original_datalen); for (i=0; i<original_datalen; i++) { PRINTF("%02x ",original_dataptr[i]); } PRINTF("\n"); #endif if(!(duplicate && ETH_SUPPORT_DUPLICATE_DETECTION)) { link_if_in(NETSTACK_8023); NETSTACK_0_NETWORK.input(); link_if_in(NETSTACK_NULL); } else { PRINTF("IEEE8023_MAC: drop duplicate\n"); } } }
/*---------------------------------------------------------------------------*/ PROCESS_THREAD(ip64_tap_driver_process, ev, data) { uint16_t len; PROCESS_BEGIN(); while(1) { PROCESS_PAUSE(); len = poll(ip64_packet_buffer, ip64_packet_buffer_maxlen); if(len > 0) { IP64_INPUT(ip64_packet_buffer, len); } } PROCESS_END(); }
/*---------------------------------------------------------------------------*/ PROCESS_THREAD(enc28j60_ip64_driver_process, ev, data) { static int len; static struct etimer e; PROCESS_BEGIN(); while(1) { etimer_set(&e, 1); PROCESS_WAIT_EVENT(); len = enc28j60_read(ip64_packet_buffer, ip64_packet_buffer_maxlen); if(len > 0) { IP64_INPUT(ip64_packet_buffer, len); } } PROCESS_END(); }
/*---------------------------------------------------------------------------*/ void eth_drv_input(uint8_t *packet, uint16_t len) { LOG6LBR_PRINTF(PACKET, ETH_IN, "read: %d\n", len); LOG6LBR_DUMP_PACKET(ETH_IN, packet, len); #if CETIC_6LBR_IP64 if((nvm_data.global_flags & CETIC_GLOBAL_IP64) != 0 && (((struct uip_eth_hdr *)packet)->type != UIP_HTONS(UIP_ETHTYPE_IPV6))) { IP64_INPUT(packet, len); } else { #endif uip_len = len - UIP_LLH_LEN; memcpy(uip_buf, packet, len); eth_input(); #if CETIC_6LBR_IP64 } #endif }