u8_t wpcap_output(void) { uip_arp_out(); wpcap_send(); return 0; }
/*---------------------------------------------------------------------------*/ PROCESS_THREAD(ethernode_uip_process, ev, data) { PROCESS_BEGIN(); while(1) { process_poll(ðernode_uip_process); PROCESS_WAIT_EVENT(); /* Poll Ethernet device to see if there is a frame avaliable. */ uip_len = ethernode_read(uip_buf, UIP_BUFSIZE); if(uip_len > 0) { /* printf("%d: new packet len %d\n", node_id, uip_len);*/ /* if((random_rand() % drop) <= drop / 2) { printf("Bropp\n"); } else*/ { uip_len = hc_inflate(&uip_buf[UIP_LLH_LEN], uip_len); #ifdef __CYGWIN__ wpcap_send(); #else /* __CYGWIN__ */ tapdev_send(); #endif /* __CYGWIN__ */ /* if(uip_fw_forward() == UIP_FW_LOCAL)*/ { /* A frame was avaliable (and is now read into the uip_buf), so we process it. */ tcpip_input(); } } } } PROCESS_END(); }
void serial_to_wpcap(FILE *inslip) { uint16_t buf_aligned[BUF_SIZE/2 + 42]; //extra for possible eth_hdr and ip_process expansion uint8_t *buf = (uint8_t *)buf_aligned; static int inbufptr = 0, issensiblestring=1; int ret; unsigned char c; unsigned char * inpktbuf; if(tun){ inpktbuf = buf + sizeof(struct uip_eth_hdr); } else { inpktbuf = buf; } read_more: if(inbufptr >= BUF_SIZE) { inbufptr = 0; } ret = fread(&c, 1, 1, inslip); if(ret == -1) { err(1, "serial_to_tun: read"); } if(ret == 0) { clearerr(inslip); return; if (timestamp) stamptime(); fprintf(stderr, "serial_to_tun: EOF\n"); exit(1); } /* fprintf(stderr, ".");*/ switch(c) { case SLIP_END: if(inbufptr > 0) { if(inpktbuf[0] == '!') { if (inpktbuf[1] == 'M' && inbufptr == 18) { /* Read gateway MAC address and autoconfigure tap0 interface */ char macs64[24], macs48[18]; int addr_bytes[8]; int i, pos; for(i = 0, pos = 0; i < 16; i++) { macs64[pos++] = inpktbuf[2 + i]; if ((i & 1) == 1 && i < 14) { macs64[pos++] = '-'; } } macs64[pos] = '\0'; if (timestamp) stamptime(); fprintf(stderr, "*** Gateway's MAC address: %s\n", macs64); mac_received = true; sscanf(macs64, "%2X-%2X-%2X-%2X-%2X-%2X-%2X-%2X", &addr_bytes[0], &addr_bytes[1], &addr_bytes[2], &addr_bytes[3], &addr_bytes[4], &addr_bytes[5], &addr_bytes[6], &addr_bytes[7]); /* Form a fictitious MAC address for the attached device from its EUI-64 (2 middle bytes elided) */ addr_bytes[0] |= 0x02; for(i=0;i<3;i++){ dev_eth_addr.addr[i] = addr_bytes[i]; } for(i=3;i<6;i++){ dev_eth_addr.addr[i] = addr_bytes[i+2]; } sprintf(macs48,"%02X-%02X-%02X-%02X-%02X-%02X", dev_eth_addr.addr[0], dev_eth_addr.addr[1], dev_eth_addr.addr[2], dev_eth_addr.addr[3], dev_eth_addr.addr[4], dev_eth_addr.addr[5]); if (timestamp) stamptime(); fprintf(stderr,"Fictitious MAC-48: %s\n", macs48); if(autoconf){ if(IPAddrFromPrefix(autoconf_addr, ipprefix, macs64)!=0){ if (timestamp) stamptime(); fprintf(stderr, "Invalid IPv6 address.\n"); exit(1); } local_ipaddr = autoconf_addr; addAddress(if_name,local_ipaddr); } if(br_prefix != NULL){ /* RPL Border Router mode. Add route towards LoWPAN. */ if(IPAddrFromPrefix(rem_ipaddr, br_prefix, macs64)!=0){ if (timestamp) stamptime(); fprintf(stderr, "Invalid IPv6 address.\n"); exit(1); } addLoWPANRoute(if_name, br_prefix, rem_ipaddr); addNeighbor(if_name, rem_ipaddr, macs48); } } #define DEBUG_LINE_MARKER '\r' } else if(inpktbuf[0] == '?') { if (inpktbuf[1] == 'M') { /* Send our MAC address. */ send_mac = true; set_sniffer_mode = true; set_channel = true; } else if (inpktbuf[1] == 'P') { /* Send LoWPAN network prefix to the border router. */ send_prefix = true; } } else if(inpktbuf[0] == DEBUG_LINE_MARKER) { /* Dont insert timestamp on wireshark packet dumps starting with 0000 */ if (timestamp) { if (inpktbuf[0]!='0' || inpktbuf[1]!=0 || inpktbuf[2]!=0 || inpktbuf[3]!=0) stamptime(); } fwrite(inpktbuf + 1, inbufptr - 1, 1, stderr); issensiblestring=1; } #if 0 else if(is_sensible_string(inpktbuf, inbufptr)) { /* Dont insert timestamp on wireshark packet dumps starting with 0000 */ if (timestamp) { if (inpktbuf[0]!='0' || inpktbuf[1]!=0 || inpktbuf[2]!=0 || inpktbuf[3]!=0) stamptime(); } fwrite(inpktbuf, inbufptr, 1, stderr); } #else else if(issensiblestring) { /* Dont insert timestamp on wireshark packet dumps starting with 0000 */ if (timestamp) { if (inpktbuf[0]!='0' || inpktbuf[1]!=0 || inpktbuf[2]!=0 || inpktbuf[3]!=0) stamptime(); } fwrite(inpktbuf, inbufptr, 1, stderr); } #endif else { PRINTF("Sending to wpcap\n"); if(tun){ //Ethernet header to be inserted before IP packet struct uip_eth_hdr * eth_hdr = (struct uip_eth_hdr *)buf; memcpy(ð_hdr->dest, &adapter_eth_addr, sizeof(struct uip_eth_addr)); memcpy(ð_hdr->src, &dev_eth_addr, sizeof(struct uip_eth_addr)); eth_hdr->type = htons(UIP_ETHTYPE_IPV6); inbufptr += sizeof(struct uip_eth_hdr); // Process incoming packets to transform link layer addresses inside ICMP packets. // Try to do processing if we did not succeed to add the neighbor. if(clean_neighb == false){ inbufptr = ip_process(buf, inbufptr); } } //print_packet(inpktbuf, inbufptr); wpcap_send(buf, inbufptr); /* printf("After sending to wpcap\n");*/ } inbufptr = 0; issensiblestring=1; } break; case SLIP_ESC: if(fread(&c, 1, 1, inslip) != 1) { clearerr(inslip); /* Put ESC back and give up! */ ungetc(SLIP_ESC, inslip); return; } switch(c) { case SLIP_ESC_END: c = SLIP_END; break; case SLIP_ESC_ESC: c = SLIP_ESC; break; } /* FALLTHROUGH */ default: inpktbuf[inbufptr++] = c; if (issensiblestring) { if(c == '\n') { /* Dont insert timestamp on wireshark packet dumps starting with 0000 */ if (timestamp) { if (inpktbuf[0]!='0' || inpktbuf[1]!=0 || inpktbuf[2]!=0 || inpktbuf[3]!=0) stamptime(); } /* This could be a proper debug string starting with CR just a print to stdout */ /* Trap the CR which would cause overwriting of the timestamp */ //{int i;for (i=0;i<inbufptr;i++) fprintf(stderr,"%2x ",inpktbuf[i]);} if(inpktbuf[0] == DEBUG_LINE_MARKER) { fwrite(inpktbuf + 1, inbufptr - 1, 1, stderr); } else { fwrite(inpktbuf, inbufptr, 1, stderr); } inbufptr=0; } else if (c == 0 || c == '\t' || c == '\r') { } else if(c < ' ' || '~' < c) { issensiblestring=0; } } break; } goto read_more; }
/*---------------------------------------------------------------------------*/ static void pollhandler(void) { #if !FALLBACK_HAS_ETHERNET_HEADERS //native br is fallback only process_poll(&wpcap_process); uip_len = wpcap_poll(); if(uip_len > 0) { #if UIP_CONF_IPV6 if(BUF->type == uip_htons(UIP_ETHTYPE_IPV6)) { printf("wpcap poll calls tcpip"); tcpip_input(); } else #endif /* UIP_CONF_IPV6 */ if(BUF->type == uip_htons(UIP_ETHTYPE_IP)) { uip_len -= sizeof(struct uip_eth_hdr); tcpip_input(); #if !UIP_CONF_IPV6 } else if(BUF->type == uip_htons(UIP_ETHTYPE_ARP)) { uip_arp_arpin(); //math /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { wpcap_send(); } #endif /* !UIP_CONF_IPV6 */ } else { uip_len = 0; } } #endif #ifdef UIP_FALLBACK_INTERFACE process_poll(&wpcap_process); uip_len = wfall_poll(); if(uip_len > 0) { #if FALLBACK_HAS_ETHERNET_HEADERS if(BUF->type == uip_htons(UIP_ETHTYPE_IPV6)) { //remove ethernet header and pass ipv6 packet to stack uip_len-=14; //{int i;printf("\n0000 ");for (i=0;i<uip_len;i++) printf("%02x ",*(unsigned char*)(uip_buf+i));printf("\n");} // memcpy(uip_buf, uip_buf+14, uip_len); memcpy(&uip_buf[UIP_LLH_LEN], uip_buf+14, uip_len); //LLH_LEN is zero for native border router to slip radio // CopyMemory(uip_buf, uip_buf+14, uip_len); //{int i;printf("\n0000 ");for (i=0;i<uip_len;i++) printf("%02x ",*(char*)(uip_buf+i));printf("\n");} tcpip_input(); } else goto bail; #elif UIP_CONF_IPV6 if(BUF->type == uip_htons(UIP_ETHTYPE_IPV6)) { tcpip_input(); } else goto bail; #endif /* UIP_CONF_IPV6 */ if(BUF->type == uip_htons(UIP_ETHTYPE_IP)) { uip_len -= sizeof(struct uip_eth_hdr); tcpip_input(); #if !UIP_CONF_IPV6 } else if(BUF->type == uip_htons(UIP_ETHTYPE_ARP)) { uip_arp_arpin(); //math /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { wfall_send(); } #endif /* !UIP_CONF_IPV6 */ } else { bail: uip_len = 0; } } #endif }
/*---------------------------------------------------------------------------*/ int main(void) { int i; uip_ipaddr_t ipaddr; struct timer periodic_timer, arp_timer; timer_set(&periodic_timer, CLOCK_SECOND / 2); timer_set(&arp_timer, CLOCK_SECOND * 10); #ifdef __CYGWIN__ wpcap_init(); #else tapdev_init(); #endif uip_init(); uip_ipaddr(ipaddr, 192,168,0,2); uip_sethostaddr(ipaddr); uip_ipaddr(ipaddr, 192,168,0,1); uip_setdraddr(ipaddr); uip_ipaddr(ipaddr, 255,255,255,0); uip_setnetmask(ipaddr); httpd_init(); /* telnetd_init();*/ /* hello_world_init();*/ /* { u8_t mac[6] = {1,2,3,4,5,6}; dhcpc_init(&mac, 6); }*/ /*uip_ipaddr(ipaddr, 127,0,0,1); smtp_configure("localhost", ipaddr); SMTP_SEND("*****@*****.**", NULL, "*****@*****.**", "Testing SMTP from uIP", "Test message sent by uIP\r\n");*/ /* webclient_init(); resolv_init(); uip_ipaddr(ipaddr, 195,54,122,204); resolv_conf(ipaddr); resolv_query("www.sics.se");*/ while(1) { #ifdef __CYGWIN__ uip_len = wpcap_read(); #else uip_len = tapdev_read(); #endif if(uip_len > 0) { if(BUF->type == htons(UIP_ETHTYPE_IP)) { uip_arp_ipin(); uip_input(); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { uip_arp_out(); #ifdef __CYGWIN__ wpcap_send(); #else tapdev_send(); #endif } } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) { uip_arp_arpin(); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { #ifdef __CYGWIN__ wpcap_send(); #else tapdev_send(); #endif } } } else if(timer_expired(&periodic_timer)) { timer_reset(&periodic_timer); for(i = 0; i < UIP_CONNS; i++) { uip_periodic(i); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { uip_arp_out(); #ifdef __CYGWIN__ wpcap_send(); #else tapdev_send(); #endif } } #if UIP_UDP for(i = 0; i < UIP_UDP_CONNS; i++) { uip_udp_periodic(i); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { uip_arp_out(); #ifdef __CYGWIN__ wpcap_send(); #else tapdev_send(); #endif } } #endif /* UIP_UDP */ /* Call the ARP timer function every 10 seconds. */ if(timer_expired(&arp_timer)) { timer_reset(&arp_timer); uip_arp_timer(); } } } return 0; }