Detect limp home state
[revag-nm.git] / vw-nm-tools.h
index f4126a69f06e3c99eb19409b153841567ddd127f..7d3c32681e0d1435270f1911cb40ce46ba997e7e 100644 (file)
@@ -121,14 +121,12 @@ static void nm_set_timer_awol(struct NM_Main *nm)
        nm->timer_reason = NM_TIMER_AWOL;
 }
 
-/*
 static void nm_set_timer_limphome(struct NM_Main *nm)
 {
        nm->tv.tv_sec = 0;
        nm->tv.tv_usec = NM_USECS_LIMPHOME;
        nm->timer_reason = NM_TIMER_LIMPHOME;
 }
-*/
 
 
 
@@ -139,19 +137,38 @@ static void nm_reset(struct NM_Main *nm)
 {
        unsigned id;
 
+       if (nm->nodes[nm->my_id].next == nm->my_id) {
+               nm->lonely_resets++;
+       }
+
        for (id = 0; id < nm->max_nodes; id++) {
                nm->nodes[id].next = 0xff;
                nm->nodes[id].state = NM_MAIN_OFF;
        }
 
        nm->nodes[nm->my_id].next = nm->my_id;
-       nm->nodes[nm->my_id].state = NM_MAIN_LOGIN;
+       if (nm->lonely_resets >= 5) {
+               printf("Limp home detected :(\n");
+
+               nm->nodes[nm->my_id].state = NM_MAIN_LIMPHOME;
+               nm_set_timer_limphome(nm);
+       } else {
+               nm->nodes[nm->my_id].state = NM_MAIN_LOGIN;
+               nm_set_timer_now(nm);
+       }
+}
+
 
-       nm_set_timer_normal(nm);
+static void nm_initreset(struct NM_Main *nm)
+{
+       nm_reset(nm);
+
+       nm->lonely_resets = 0;
 }
 
 
 
+
 static struct NM_Main* nm_alloc(unsigned node_bits, NM_ID my_id, canid_t can_base)
 {
        struct NM_Main *nm;
@@ -175,7 +192,7 @@ static struct NM_Main* nm_alloc(unsigned node_bits, NM_ID my_id, canid_t can_bas
        nm->my_id = my_id;
        nm->can_base = can_base;
 
-       nm_reset(nm);
+       nm_initreset(nm);
 
        return nm;
 }