Update version after release of v0.6.5.2
[olsrd.git] / src / duplicate_handler.c
1 /*
2  * duplicate_handler.c
3  *
4  *  Created on: 11.01.2010
5  *      Author: henning
6  */
7
8 #include "common/list.h"
9 #include "defs.h"
10 #include "ipcalc.h"
11 #include "log.h"
12 #include "olsr.h"
13 #include "scheduler.h"
14 #include "duplicate_handler.h"
15
16 #ifndef NO_DUPLICATE_DETECTION_HANDLER
17
18 static struct list_node duplicate_handler_head;
19 static uint32_t spam_orig_counter, spam_hna_counter, spam_mid_counter;
20
21 static struct timer_entry *duplicate_spam_timer;
22
23 static void handle_duplicate_spam_timer(void __attribute__ ((unused)) *no) {
24   if (spam_orig_counter > MAX_SYSLOG_EACH_HOUR) {
25     olsr_syslog(OLSR_LOG_INFO, "Skipped %u originator duplicate warnings.", spam_orig_counter - MAX_SYSLOG_EACH_HOUR);
26   }
27   if (spam_hna_counter > MAX_SYSLOG_EACH_HOUR) {
28     olsr_syslog(OLSR_LOG_INFO, "Skipped %u hna duplicate warnings.", spam_hna_counter - MAX_SYSLOG_EACH_HOUR);
29   }
30   if (spam_mid_counter > MAX_SYSLOG_EACH_HOUR) {
31     olsr_syslog(OLSR_LOG_INFO, "Skipped %u mid duplicate warnings.", spam_mid_counter - MAX_SYSLOG_EACH_HOUR);
32   }
33   spam_orig_counter = 0;
34   spam_hna_counter = 0;
35   spam_mid_counter = 0;
36 }
37
38
39 void olsr_duplicate_handler_init(void) {
40   list_head_init(&duplicate_handler_head);
41
42   spam_orig_counter = 0;
43   spam_hna_counter = 0;
44   spam_mid_counter = 0;
45
46   olsr_set_timer(&duplicate_spam_timer, 3600*1000, 0, OLSR_TIMER_PERIODIC,
47                  &handle_duplicate_spam_timer, NULL, 0);
48 }
49
50 void olsr_add_duplicate_handler(struct duplicate_handler *h) {
51   list_add_before(&duplicate_handler_head, &h->node);
52 }
53
54 void olsr_remove_duplicate_handler(struct duplicate_handler *h) {
55   list_remove(&h->node);
56 }
57
58 void olsr_test_originator_collision(uint8_t msgType, uint16_t seqno) {
59   struct list_node *n;
60
61   if (!olsr_is_bad_duplicate_msg_seqno(seqno)) {
62     return;
63   }
64
65   if (++spam_orig_counter < MAX_SYSLOG_EACH_HOUR) {
66     struct ipaddr_str buf;
67
68     olsr_syslog(OLSR_LOG_INFO, "You might have another node with main ip %s in the mesh!",
69         olsr_ip_to_string(&buf, &olsr_cnf->main_addr));
70   }
71
72   for (n=duplicate_handler_head.next; n != &duplicate_handler_head; n = n->next) {
73     struct duplicate_handler *h = (struct duplicate_handler *)n;
74
75     h->originator_collision(msgType);
76   }
77 }
78
79 void olsr_handle_hna_collision(union olsr_ip_addr *hna, union olsr_ip_addr *orig) {
80   struct list_node *n;
81
82   if (++spam_hna_counter < MAX_SYSLOG_EACH_HOUR) {
83     struct ipaddr_str buf1, buf2;
84
85     olsr_syslog(OLSR_LOG_INFO, "Node %s is publishing your ip %s as HNA!",
86         olsr_ip_to_string(&buf1, orig), olsr_ip_to_string(&buf2, hna));
87   }
88
89   for (n=duplicate_handler_head.next; n != &duplicate_handler_head; n = n->next) {
90     struct duplicate_handler *h = (struct duplicate_handler *)n;
91
92     h->hna_collision(hna, orig);
93   }
94 }
95
96 void olsr_handle_mid_collision(union olsr_ip_addr *mid, union olsr_ip_addr *orig) {
97   struct list_node *n;
98
99   if (++spam_mid_counter < MAX_SYSLOG_EACH_HOUR) {
100     struct ipaddr_str buf1, buf2;
101
102     olsr_syslog(OLSR_LOG_INFO, "Node %s is publishing your ip %s as MID!",
103         olsr_ip_to_string(&buf1, orig), olsr_ip_to_string(&buf2, mid));
104   }
105
106   for (n=duplicate_handler_head.next; n != &duplicate_handler_head; n = n->next) {
107     struct duplicate_handler *h = (struct duplicate_handler *)n;
108
109     h->mid_collision(mid, orig);
110   }
111 }
112
113 #endif /* NO_DUPLICATE_DETECTION_HANDLER */