From df104b77a304c0164fcf187d70dfde3599a0fcf4 Mon Sep 17 00:00:00 2001 From: joxe Date: Tue, 25 May 2010 20:34:51 +0000 Subject: [PATCH] updated with support for getting prefix from tunslip6 and for setting RPL prefix --- .../ipv6/rpl-border-router/border-router.c | 47 ++++++++++++++----- examples/ipv6/rpl-border-router/slip-bridge.c | 20 +++++++- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/examples/ipv6/rpl-border-router/border-router.c b/examples/ipv6/rpl-border-router/border-router.c index 2fa1149f7..915f9c298 100644 --- a/examples/ipv6/rpl-border-router/border-router.c +++ b/examples/ipv6/rpl-border-router/border-router.c @@ -44,6 +44,7 @@ #include "net/netstack.h" #include "dev/button-sensor.h" +#include "dev/slip.h" #include "webserver-nogui.h" #include "httpd-simple.h" #include @@ -59,6 +60,9 @@ uint16_t dag_id[] = {0x1111, 0x1100, 0, 0, 0, 0, 0, 0x0011}; extern uip_ds6_nbr_t uip_ds6_nbr_cache[]; extern uip_ds6_route_t uip_ds6_routing_table[]; +static uip_ipaddr_t prefix; +static uint8_t prefix_set; + PROCESS(border_router_process, "Border router process"); AUTOSTART_PROCESSES(&border_router_process); /*---------------------------------------------------------------------------*/ @@ -166,12 +170,32 @@ print_local_addresses(void) } } /*---------------------------------------------------------------------------*/ +void +request_prefix(void) { + /* mess up uip_buf with a dirty request... */ + uip_buf[0] = '!'; + uip_buf[1] = 'P'; + uip_len = 2; + slip_send(); +} +/*---------------------------------------------------------------------------*/ +void +set_prefix_64(uip_ipaddr_t *prefix_64) { + uip_ipaddr_t ipaddr; + memcpy(&prefix, prefix_64, 16); + memcpy(&ipaddr, prefix_64, 16); + prefix_set = 1; + uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr); + uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF); +} +/*---------------------------------------------------------------------------*/ PROCESS_THREAD(border_router_process, ev, data) { - uip_ipaddr_t ipaddr; - struct uip_ds6_addr *root_if; + static struct etimer et; + rpl_dag_t *dag; PROCESS_BEGIN(); + prefix_set = 0; PROCESS_PAUSE(); @@ -181,17 +205,18 @@ PROCESS_THREAD(border_router_process, ev, data) PRINTF("RPL-Border router started\n"); - uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0); - uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr); - uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF); - root_if = uip_ds6_addr_lookup(&ipaddr); - if(root_if != NULL) { - rpl_set_root((uip_ip6addr_t *)dag_id); - PRINTF("created a new RPL dag\n"); - } else { - PRINTF("failed to create a new RPL DAG\n"); + /* Request prefix until it has been received */ + while(!prefix_set) { + etimer_set(&et, CLOCK_SECOND); + request_prefix(); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); } + rpl_set_root((uip_ip6addr_t *)dag_id); + dag = rpl_get_dag(RPL_ANY_INSTANCE); + rpl_set_prefix(dag, &prefix, 64); + PRINTF("created a new RPL dag\n"); + print_local_addresses(); /* The border router runs with a 100% duty cycle in order to ensure high diff --git a/examples/ipv6/rpl-border-router/slip-bridge.c b/examples/ipv6/rpl-border-router/slip-bridge.c index d35aef03d..f3a5c3d31 100644 --- a/examples/ipv6/rpl-border-router/slip-bridge.c +++ b/examples/ipv6/rpl-border-router/slip-bridge.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: slip-bridge.c,v 1.1 2010/05/05 19:44:30 joxe Exp $ + * $Id: slip-bridge.c,v 1.2 2010/05/25 20:34:51 joxe Exp $ */ /** @@ -50,13 +50,28 @@ #define DEBUG DEBUG_PRINT #include "net/uip-debug.h" +void set_prefix_64(uip_ipaddr_t *); + static uip_ipaddr_t last_sender; /*---------------------------------------------------------------------------*/ static void slip_input_callback(void) { PRINTF("SIN: %u\n", uip_len); - + if(uip_buf[0] == '!') { + PRINTF("Got configuration message of type %c\n", uip_buf[1]); + uip_len = 0; + if(uip_buf[1] == 'P') { + uip_ipaddr_t prefix; + /* Here we set a prefix !!! */ + memset(&prefix, 0, 16); + memcpy(&prefix, &uip_buf[2], 8); + PRINTF("Setting prefix "); + PRINT6ADDR(&prefix); + PRINTF("\n"); + set_prefix_64(&prefix); + } + } /* Save the last sender received over SLIP to avoid bouncing the packet back if no route is found */ uip_ipaddr_copy(&last_sender, &UIP_IP_BUF->srcipaddr); @@ -82,6 +97,7 @@ output(void) slip_send(); } } + /*---------------------------------------------------------------------------*/ int putchar(int c)