Merge pull request #1269 from tadodotcom/tmp-uip-fallback-iface

More flexibility for the fallback interface
This commit is contained in:
Simon Duquennoy 2015-10-20 11:33:14 +02:00
commit 2daa3d7377
10 changed files with 39 additions and 15 deletions

View file

@ -572,7 +572,16 @@ tcpip_ipv6_output(void)
/* This should be copied from the ext header... */ /* This should be copied from the ext header... */
UIP_IP_BUF->proto = proto; UIP_IP_BUF->proto = proto;
} }
UIP_FALLBACK_INTERFACE.output(); /* 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 #else
PRINTF("tcpip_ipv6_output: Destination off-link but no route\n"); PRINTF("tcpip_ipv6_output: Destination off-link but no route\n");
#endif /* !UIP_FALLBACK_INTERFACE */ #endif /* !UIP_FALLBACK_INTERFACE */

View file

@ -1429,7 +1429,13 @@ extern struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS];
struct uip_fallback_interface { struct uip_fallback_interface {
void (*init)(void); void (*init)(void);
void (*output)(void); /**
* \retval >=0
* in case of success
* \retval <0
* in case of failure
*/
int (*output)(void);
}; };
#if UIP_CONF_ICMP6 #if UIP_CONF_ICMP6

View file

@ -84,7 +84,7 @@ init(void)
printf("ip64-eth-interface: init\n"); printf("ip64-eth-interface: init\n");
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static int
output(void) output(void)
{ {
int len, ret; int len, ret;
@ -114,7 +114,7 @@ output(void)
printf("Create request\n"); printf("Create request\n");
len = ip64_arp_create_arp_request(ip64_packet_buffer, len = ip64_arp_create_arp_request(ip64_packet_buffer,
&ip64_packet_buffer[sizeof(struct ip64_eth_hdr)]); &ip64_packet_buffer[sizeof(struct ip64_eth_hdr)]);
IP64_ETH_DRIVER.output(ip64_packet_buffer, len); return IP64_ETH_DRIVER.output(ip64_packet_buffer, len);
} }
} }
} }

View file

@ -115,7 +115,7 @@ init(void)
slip_set_input_callback(input_callback); slip_set_input_callback(input_callback);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static int
output(void) output(void)
{ {
int len; int len;
@ -138,8 +138,10 @@ output(void)
memcpy(&uip_buf[UIP_LLH_LEN], ip64_packet_buffer, len); memcpy(&uip_buf[UIP_LLH_LEN], ip64_packet_buffer, len);
uip_len = len; uip_len = len;
slip_send(); slip_send();
return len;
} }
} }
return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
const struct uip_fallback_interface ip64_slip_interface = { const struct uip_fallback_interface ip64_slip_interface = {

View file

@ -192,7 +192,7 @@ uint8_t wfall_send(const uip_lladdr_t *lladdr);
static uip_ipaddr_t last_sender; static uip_ipaddr_t last_sender;
#endif #endif
static void static int
output(void) output(void)
{ {
#if FALLBACK_HAS_ETHERNET_HEADERS&&0 #if FALLBACK_HAS_ETHERNET_HEADERS&&0
@ -203,8 +203,8 @@ output(void)
} }
uip_ipaddr_copy(&last_sender, &UIP_IP_BUF->srcipaddr); uip_ipaddr_copy(&last_sender, &UIP_IP_BUF->srcipaddr);
#endif #endif
PRINTF("FUT: %u\n", uip_len); PRINTF("FUT: %u\n", uip_len);
wfall_send(0); return wfall_send(0);
} }
const struct uip_fallback_interface rpl_interface = { const struct uip_fallback_interface rpl_interface = {

View file

@ -83,7 +83,7 @@ init(void)
slip_set_input_callback(slip_input_callback); slip_set_input_callback(slip_input_callback);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static int
output(void) output(void)
{ {
if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) { if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) {
@ -94,6 +94,7 @@ output(void)
PRINTF("SUT: %u\n", uip_len); PRINTF("SUT: %u\n", uip_len);
slip_send(); slip_send();
} }
return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
struct uip_fallback_interface slip_interface = { struct uip_fallback_interface slip_interface = {

View file

@ -222,13 +222,15 @@ tun_init()
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void static int
tun_output(uint8_t *data, int len) tun_output(uint8_t *data, int len)
{ {
/* fprintf(stderr, "*** Writing to tun...%d\n", len); */ /* fprintf(stderr, "*** Writing to tun...%d\n", len); */
if(write(tunfd, data, len) != len) { if(write(tunfd, data, len) != len) {
err(1, "serial_to_tun: write"); err(1, "serial_to_tun: write");
return -1;
} }
return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
int int
@ -246,13 +248,14 @@ init(void)
{ {
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static int
output(void) output(void)
{ {
PRINTF("SUT: %u\n", uip_len); PRINTF("SUT: %u\n", uip_len);
if(uip_len > 0) { if(uip_len > 0) {
tun_output(&uip_buf[UIP_LLH_LEN], uip_len); return tun_output(&uip_buf[UIP_LLH_LEN], uip_len);
} }
return 0;
} }

View file

@ -100,7 +100,7 @@ init(void)
slip_set_input_callback(slip_input_callback); slip_set_input_callback(slip_input_callback);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static int
output(void) output(void)
{ {
if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) { if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) {
@ -115,6 +115,7 @@ output(void)
// PRINTF("SUT: %u\n", uip_len); // PRINTF("SUT: %u\n", uip_len);
slip_send(); slip_send();
} }
return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/

View file

@ -84,7 +84,7 @@ init(void)
slip_set_input_callback(slip_input_callback); slip_set_input_callback(slip_input_callback);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static int
output(void) output(void)
{ {
if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) { if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) {
@ -95,6 +95,7 @@ output(void)
PRINTF("SUT: %u\n", uip_len); PRINTF("SUT: %u\n", uip_len);
slip_send(); slip_send();
} }
return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
const struct uip_fallback_interface slip_interface = { const struct uip_fallback_interface slip_interface = {

View file

@ -132,7 +132,7 @@ init(void)
{ {
} }
void mac_LowpanToEthernet(void); void mac_LowpanToEthernet(void);
static void static int
output(void) output(void)
{ {
// if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) { // if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) {
@ -142,6 +142,7 @@ output(void)
PRINTD("SUT: %u\n", uip_len); PRINTD("SUT: %u\n", uip_len);
mac_LowpanToEthernet(); //bounceback trap is done in lowpanToEthernet mac_LowpanToEthernet(); //bounceback trap is done in lowpanToEthernet
// } // }
return 0;
} }
const struct uip_fallback_interface rpl_interface = { const struct uip_fallback_interface rpl_interface = {
init, output init, output