57 #ifndef UIP_CONF_SIMPLE_JACKDAW_ADDR_TRANS
58 #define UIP_CONF_SIMPLE_JACKDAW_ADDR_TRANS 0
59 #endif // ifndef UIP_CONF_SIMPLE_JACKDAW_ADDR_TRANS
61 #ifndef UIP_CONF_AUTO_SUBSTITUTE_LOCAL_MAC_ADDR
62 #define UIP_CONF_AUTO_SUBSTITUTE_LOCAL_MAC_ADDR 1
63 #endif // ifndef UIP_CONF_AUTO_SUBSTITUTE_LOCAL_MAC_ADDR
65 #if UIP_CONF_SIMPLE_JACKDAW_ADDR_TRANS
231 #include "sicslow_ethernet.h"
246 #define PRINTF(FORMAT,args...) printf_P(PSTR(FORMAT),##args)
251 #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
252 #define ETHBUF(x) ((struct uip_eth_hdr *)x)
256 #define LSB(u16) (((uint8_t *)&(u16))[0])
257 #define MSB(u16) (((uint8_t *)&(u16))[1])
260 static const uint64_t simple_trans_ethernet_addr = 0x3E3D3C3B3AF2ULL;
262 #if UIP_CONF_IPV6_RPL
263 static uip_ipaddr_t last_sender;
266 extern uint64_t usb_ethernet_addr;
271 extern void (*pinput)(
const struct mac_driver *r);
272 void (*sicslowinput)(
const struct mac_driver *r);
273 parsed_frame_t * parsed_frame;
275 usbstick_mode_t usbstick_mode;
280 void mac_ethhijack_nondata(
const struct mac_driver *r);
283 extern void (*sicslowmac_snifferhook)(
const struct mac_driver *r);
287 #define TRANSLATE_BIT_MASK (1<<2)
289 #define LOCAL_BIT_MASK (1<<1)
291 #define MULTICAST_BIT_MASK (1<<0)
293 #define PREFIX_BUFFER_SIZE 32
295 uint8_t prefixCounter;
296 uint8_t prefixBuffer[PREFIX_BUFFER_SIZE][3];
307 void mac_ethernetSetup(
void)
309 usbstick_mode.sicslowpan = 1;
310 usbstick_mode.sendToRf = 1;
311 usbstick_mode.translate = 1;
312 usbstick_mode.debugOn= 1;
313 usbstick_mode.raw = 0;
314 usbstick_mode.sneeze=0;
317 sicslowinput = pinput;
319 pmac = sicslowmac_get_driver();
321 sicslowmac_snifferhook = mac_ethhijack_nondata;
336 PRINTF(
"Packet type: 0x%04x\n\r", uip_ntohs(((
struct uip_eth_hdr *) ethHeader)->type));
344 if ((usbstick_mode.sendToRf == 0) || (usbstick_mode.sneeze != 0)) {
352 PRINTF(
"eth2low: Dropping packet w/type=0x%04x\n",uip_ntohs(((
struct uip_eth_hdr *) ethHeader)->type));
355 usb_eth_stat.txbad++;
362 if ( (((
struct uip_eth_hdr *) ethHeader)->dest.addr[0] == 0x33) &&
363 (((
struct uip_eth_hdr *) ethHeader)->dest.addr[1] == 0x33) )
365 PRINTF(
"eth2low: Ethernet multicast packet received\n\r");
367 }
else if ( (((
struct uip_eth_hdr *) ethHeader)->dest.addr[0] == 0xFF) &&
368 (((
struct uip_eth_hdr *) ethHeader)->dest.addr[1] == 0xFF) &&
369 (((
struct uip_eth_hdr *) ethHeader)->dest.addr[2] == 0xFF) &&
370 (((
struct uip_eth_hdr *) ethHeader)->dest.addr[3] == 0xFF) &&
371 (((
struct uip_eth_hdr *) ethHeader)->dest.addr[4] == 0xFF) &&
372 (((
struct uip_eth_hdr *) ethHeader)->dest.addr[5] == 0xFF) ) {
374 PRINTF(
"eth2low: Dropping broadcast packet\n\r");
376 usb_eth_stat.txbad++;
383 if(memcmp((uint8_t *)&simple_trans_ethernet_addr, &(((
struct uip_eth_hdr *) ethHeader)->dest.addr[0]), 6) == 0) {
384 #if NETSTACK_CONF_WITH_IPV6
386 destAddr.addr[0] =
UIP_IP_BUF->destipaddr.u8[8] ^ 0x02;
387 destAddr.addr[1] =
UIP_IP_BUF->destipaddr.u8[9];
388 destAddr.addr[2] =
UIP_IP_BUF->destipaddr.u8[10];
389 destAddr.addr[3] =
UIP_IP_BUF->destipaddr.u8[11];
390 destAddr.addr[4] =
UIP_IP_BUF->destipaddr.u8[12];
391 destAddr.addr[5] =
UIP_IP_BUF->destipaddr.u8[13];
392 destAddr.addr[6] =
UIP_IP_BUF->destipaddr.u8[14];
393 destAddr.addr[7] =
UIP_IP_BUF->destipaddr.u8[15];
396 destAddr.addr[0] =
UIP_IP_BUF->destipaddr.u8[0] ^ 0x02;
397 destAddr.addr[1] =
UIP_IP_BUF->destipaddr.u8[1];
398 destAddr.addr[2] =
UIP_IP_BUF->destipaddr.u8[2];
399 destAddr.addr[3] =
UIP_IP_BUF->destipaddr.u8[3];
400 destAddr.addr[4] =
UIP_IP_BUF->destipaddr.u8[0];
401 destAddr.addr[5] =
UIP_IP_BUF->destipaddr.u8[1];
402 destAddr.addr[6] =
UIP_IP_BUF->destipaddr.u8[2];
403 destAddr.addr[7] =
UIP_IP_BUF->destipaddr.u8[3];
407 destAddrPtr = &destAddr;
409 #if UIP_CONF_SIMPLE_JACKDAW_ADDR_TRANS
418 PRINTF(
"eth2low: Addressed packet received... ");
421 PRINTF(
" translation failed\n\r");
423 usb_eth_stat.txbad++;
428 PRINTF(
" translated OK\n\r");
429 destAddrPtr = &destAddr;
439 if (usbstick_mode.translate) {
442 PRINTF(
"IPTranslation: returns %d\n\r", transReturn);
448 #if NETSTACK_CONF_WITH_IPV6
450 #if UIP_CONF_IPV6_RPL
478 parsed_frame = sicslowmac_get_frame();
487 if( ( parsed_frame->fcf->destAddrMode == SHORTADDRMODE) &&
488 ( parsed_frame->dest_addr->addr16 == 0xffff) ) {
490 ETHBUF(
uip_buf)->dest.addr[0] = 0x33;
491 ETHBUF(
uip_buf)->dest.addr[1] = 0x33;
493 #if NETSTACK_CONF_WITH_IPV6
508 (
uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
511 #if !UIP_CONF_SIMPLE_JACKDAW_ADDR_TRANS
514 (uint8_t *) &(ETHBUF(
uip_buf)->src.addr[0]),
524 if (usbstick_mode.translate) {
529 #if UIP_CONF_IPV6_RPL
531 if(uip_ipaddr_cmp(&last_sender, &
UIP_IP_BUF->srcipaddr)) {
532 PRINTF(
"siclow_ethernet: Destination off-link but no route\n");
538 PRINTF(
"Low2Eth: Sending packet to ethernet\n\r");
563 #if UIP_LLADDR_LEN == 8
565 PRINTF(
"eth2low: ICMP Message detected\n\r");
584 #define UIP_ICMP_BUF ((struct uip_icmp_hdr *)&uip_buf[UIP_LLH_LEN + UIP_IPH_LEN])
585 #define UIP_ICMP_OPTS(x) ((icmp_opts_t *)&uip_buf[UIP_LLH_LEN + UIP_IPH_LEN + x])
587 void slide(uint8_t * data, uint8_t length, int16_t
slide);
602 uint16_t icmp_opt_offset = 0;
617 icmp_opt_offset = 24;
625 icmp_opt_offset = 16;
629 icmp_opt_offset = 40;
647 len -= icmp_opt_offset;
650 if (len < 8)
return -2;
656 if (((UIP_ICMP_OPTS(icmp_opt_offset)->type) == UIP_ND6_OPT_SLLAO) ||
657 ((UIP_ICMP_OPTS(icmp_opt_offset)->type) == UIP_ND6_OPT_TLLAO) ) {
661 for(i = 0; i < (UIP_ICMP_OPTS(icmp_opt_offset)->length*8 - 2); i++) {
662 llbuf[i] = UIP_ICMP_OPTS(icmp_opt_offset)->data[i];
666 if (target == ll_802154_type) {
669 slide(UIP_ICMP_OPTS(icmp_opt_offset)->data + 6, len - 6, sizechange);
670 }
else if (target == ll_8023_type) {
678 slide(UIP_ICMP_OPTS(icmp_opt_offset)->data + 14, len - 14, sizechange);
684 if (target == ll_802154_type) {
687 #if !UIP_CONF_SIMPLE_JACKDAW_ADDR_TRANS
694 if (target == ll_802154_type) {
695 UIP_ICMP_OPTS(icmp_opt_offset)->length = 2;
697 UIP_ICMP_OPTS(icmp_opt_offset)->length = 1;
712 #if NETSTACK_CONF_WITH_IPV6 //allow non ipv6 builds
717 len -= 8 * UIP_ICMP_OPTS(icmp_opt_offset)->length;
718 icmp_opt_offset += 8 * UIP_ICMP_OPTS(icmp_opt_offset)->length;
722 len -= 8 * UIP_ICMP_OPTS(icmp_opt_offset)->length;
725 if (UIP_ICMP_OPTS(icmp_opt_offset)->length == 0) {
726 PRINTF(
"Option in ND packet has length zero, error?\n\r");
730 icmp_opt_offset += 8 * UIP_ICMP_OPTS(icmp_opt_offset)->length;
748 #if UIP_CONF_AUTO_SUBSTITUTE_LOCAL_MAC_ADDR
751 if (memcmp((uint8_t *)&usb_ethernet_addr, ethernet, 6) == 0)
758 #if UIP_CONF_SIMPLE_JACKDAW_ADDR_TRANS
761 lowpan->addr[0] = ethernet[0];
762 lowpan->addr[1] = ethernet[1];
763 lowpan->addr[2] = ethernet[2];
764 lowpan->addr[3] = 0xff;
765 lowpan->addr[4] = 0xfe;
766 lowpan->addr[5] = ethernet[3];
767 lowpan->addr[6] = ethernet[4];
768 lowpan->addr[7] = ethernet[5];
774 #if UIP_LLADDR_LEN == 8
778 index = ethernet[0] >> 3;
781 lowpan->addr[0] = prefixBuffer[index][0];
782 lowpan->addr[1] = prefixBuffer[index][1];
783 lowpan->addr[2] = prefixBuffer[index][2];
784 lowpan->addr[3] = ethernet[1];
785 lowpan->addr[4] = ethernet[2];
788 if (index >= prefixCounter)
791 lowpan->addr[0] = ethernet[0];
792 lowpan->addr[1] = ethernet[1];
793 lowpan->addr[2] = ethernet[2];
794 lowpan->addr[3] = 0xff;
795 lowpan->addr[4] = 0xfe;
798 lowpan->addr[5] = ethernet[3];
799 lowpan->addr[6] = ethernet[4];
800 lowpan->addr[7] = ethernet[5];
802 #else //UIP_LLADDR != 8
806 lowpan->addr[i] = ethernet[i];
808 #endif //UIP_LLADDR == 8
810 #endif //UIP_CONF_SIMPLE_JACKDAW_ADDR_TRANS
823 #if UIP_CONF_AUTO_SUBSTITUTE_LOCAL_MAC_ADDR
827 usb_eth_get_mac_address(ethernet);
832 #if UIP_CONF_SIMPLE_JACKDAW_ADDR_TRANS
835 ethernet[0] = lowpan->addr[0];
836 ethernet[1] = lowpan->addr[1];
837 ethernet[2] = lowpan->addr[2];
838 ethernet[3] = lowpan->addr[5];
839 ethernet[4] = lowpan->addr[6];
840 ethernet[5] = lowpan->addr[7];
847 #if UIP_LLADDR_LEN == 8
850 if ((lowpan->addr[3] == 0xff) && (lowpan->addr[4] == 0xfe) &&
856 ethernet[0] = lowpan->addr[0];
857 ethernet[1] = lowpan->addr[1];
858 ethernet[2] = lowpan->addr[2];
859 ethernet[3] = lowpan->addr[5];
860 ethernet[4] = lowpan->addr[6];
861 ethernet[5] = lowpan->addr[7];
867 for (i = 0; i < prefixCounter; i++) {
869 if ((lowpan->addr[0] == prefixBuffer[i][0]) &&
870 (lowpan->addr[1] == prefixBuffer[i][1]) &&
871 (lowpan->addr[2] == prefixBuffer[i][2])) {
877 if (index >= PREFIX_BUFFER_SIZE) {
880 ethernet[0] = lowpan->addr[0];
881 ethernet[1] = lowpan->addr[1];
882 ethernet[2] = lowpan->addr[2];
883 ethernet[3] = lowpan->addr[5];
884 ethernet[4] = lowpan->addr[6];
885 ethernet[5] = lowpan->addr[7];
889 if (index == prefixCounter) {
891 prefixBuffer[index][0] = lowpan->addr[0];
892 prefixBuffer[index][1] = lowpan->addr[1];
893 prefixBuffer[index][2] = lowpan->addr[2];
898 ethernet[1] = lowpan->addr[3];
899 ethernet[2] = lowpan->addr[4];
900 ethernet[3] = lowpan->addr[5];
901 ethernet[4] = lowpan->addr[6];
902 ethernet[5] = lowpan->addr[7];
906 #else //UIP_LLADDR_LEN != 8
910 ethernet[i] = lowpan->addr[i];
912 #endif //UIP_LLADDR_LEN == 8
914 #endif //UIP_CONF_SIMPLE_JACKDAW_ADDR_TRANS
924 memcpy(ethernet, &simple_trans_ethernet_addr, 6);
948 *(data + length +
slide) = *(data + length);
952 *(data + slide + i) = *(data + i);
963 mac_log_802_15_4_tx(
const uint8_t* buffer,
size_t total_len) {
964 if (usbstick_mode.raw != 0) {
974 ETHBUF(raw_buf)->type =
uip_htons(0x809A);
978 ETHBUF(raw_buf)->dest.addr[0] = 0x33;
979 ETHBUF(raw_buf)->dest.addr[1] = 0x33;
980 ETHBUF(raw_buf)->dest.addr[2] = 0x00;
981 ETHBUF(raw_buf)->dest.addr[3] = 0x00;
982 ETHBUF(raw_buf)->dest.addr[4] = 0x80;
983 ETHBUF(raw_buf)->dest.addr[5] = 0x9A;
994 (
uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
1006 mac_log_802_15_4_rx(
const uint8_t* buf,
size_t len) {
1007 if (usbstick_mode.raw != 0) {
1015 ETHBUF(raw_buf)->type =
uip_htons(0x809A);
1019 ETHBUF(raw_buf)->dest.addr[0] = 0x33;
1020 ETHBUF(raw_buf)->dest.addr[1] = 0x33;
1021 ETHBUF(raw_buf)->dest.addr[2] = 0x00;
1022 ETHBUF(raw_buf)->dest.addr[3] = 0x00;
1023 ETHBUF(raw_buf)->dest.addr[4] = 0x80;
1024 ETHBUF(raw_buf)->dest.addr[5] = 0x9A;
1034 (
uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
1046 mac_is_send_enabled(
void) {
1047 if ((usbstick_mode.sendToRf == 0) || (usbstick_mode.sneeze != 0))
return 0;
1069 if (usbstick_mode.raw) {
1073 if (usbstick_mode.sicslowpan) {
1075 #if UIP_CONF_USE_RUM
1076 if (parsed_frame->payload[4]) {
1079 #if UIP_CONF_USE_RUM
1088 void mac_ethhijack_nondata(
const struct mac_driver *r)
1090 if (usbstick_mode.raw)
1104 mac_log_802_15_4_tx(frame_result->
frame, frame_result->
length);
1116 mac_log_802_15_4_tx(radio_frame_data(), radio_frame_length());
Header file for IPv6 Neighbor discovery (RFC 4861)
#define ICMP6_ECHO_REPLY
Echo reply.
uip_len
The length of the packet in the uip_buf buffer.
void mac_ethernetToLowpan(uint8_t *ethHeader)
Take a packet received over the ethernet link, and send it out over 802.15.4.
void mac_802154raw(const struct mac_driver *r)
Process a received 6lowpan packet.
uint8_t mac_createEthernetAddr(uint8_t *ethernet, uip_lladdr_t *lowpan)
Create a 802.3 address from a 802.15.4 long address.
#define ICMP6_NS
Neighbor Solicitation.
uint8_t * frame
Pointer to created frame.
void mac_logTXtoEthernet(frame_create_params_t *p, frame_result_t *frame_result)
Logs a sent 6lowpan frame.
void mac_ethhijack(const struct mac_driver *r)
Process a received 6lowpan packet.
void slide(uint8_t *data, uint8_t length, int16_t slide)
Slide the pointed to memory up a certain amount, growing/shrinking a buffer.
Parameters used by the frame_tx_create() function.
#define TRANSLATE_BIT_MASK
Location of TRANSLATE (TR) bit in Ethernet address.
#define UIP_HTONS(n)
Convert 16-bit quantity from host byte order to network byte order.
#define ICMP6_ECHO_REQUEST
Echo request.
#define UIP_LLH_LEN
The link level header length.
uint16_t uip_icmp6chksum(void)
Calculate the ICMP checksum of the packet in uip_buf.
int8_t mac_translateIPLinkLayer(lltype_t target)
Translate IP packet's possible link-layer addresses, passing the message to the appropriate higher le...
#define UIP_LLADDR_LEN
Link layer address length.
#define uip_buf
Macro to access uip_aligned_buf as an array of bytes.
#define ICMP6_DST_UNREACH
dest unreachable
#define MULTICAST_BIT_MASK
Location of MULTICAST (MU) bit in Ethernet address.
#define uip_ipaddr_copy(dest, src)
Copy an IP address from one place to another.
int packetbuf_holds_broadcast(void)
Checks whether the current packet is a broadcast.
uint8_t mac_createSicslowpanLongAddr(uint8_t *ethernet, uip_lladdr_t *lowpan)
Create a 802.15.4 long address from a 802.3 address.
#define UIP_IP_BUF
Pointer to IP header.
uint8_t length
Length (in bytes) of created frame.
802.15.4 frame creation and parsing functions
uint8_t mac_createDefaultEthernetAddr(uint8_t *ethernet)
Create a 802.3 address (default)
Header file for the Rime stack
The IEEE 802.15.4 (2003/2006) MAC utility functions.
#define NULL
The null pointer.
Header file for ICMPv6 message and error handing (RFC 4443)
The structure of a MAC protocol driver in Contiki.
This file manages the RNDIS task.
#define UIP_ICMP_BUF
Pointer to ICMP header.
#define ICMP6_PARAM_PROB
ip6 header bad
Header file for the uIP TCP/IP stack.
#define LOCAL_BIT_MASK
Location of LOCAL (GL) bit in Ethernet address.
uint8_t tcpip_output(const uip_lladdr_t *a)
Output packet to layer 2 The eventual parameter is the MAC address of the destination.
int8_t mac_translateIcmpLinkLayer(lltype_t target)
Translate the link-layer (L2) addresses in an ICMP packet.
#define ICMP6_TIME_EXCEEDED
time exceeded
#define ICMP6_REDIRECT
Redirect.
#define ICMP6_RA
Router Advertisement.
#define ICMP6_RS
Router Solicitation.
uint8_t usb_eth_send(uint8_t *senddata, uint16_t sendlen, uint8_t led)
Sends a single ethernet frame over USB using appropriate low-level protocol (EEM or RNDIS) ...
#define ICMP6_NA
Neighbor advertisement.
void tcpip_input(void)
Deliver an incoming packet to the TCP/IP stack.
Strucure used to return that status of the frame create process.
Header file for the 6lowpan implementation (RFC4944 and draft-hui-6lowpan-hc-01) ...
void mac_LowpanToEthernet(void)
Take a packet received over the 802.15.4 link, and send it out over ethernet, performing any translat...
#define ICMP6_PACKET_TOO_BIG
packet too big
Macros and definitions for the ARP module.
uint64_t macLongAddr
Our own long address.
CCIF uint16_t uip_htons(uint16_t val)
Convert a 16-bit quantity from host byte order to network byte order.
struct mac_driver * pmac
Perform any setup needed.