New configfile parser and configuration scheme integrated
[olsrd.git] / src / local_hna_set.c
1 /*
2  * OLSR ad-hoc routing table management protocol
3  * Copyright (C) 2003 Andreas T√łnnesen (andreto@ifi.uio.no)
4  *
5  * This file is part of the olsr.org OLSR daemon.
6  *
7  * olsr.org is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * olsr.org is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with olsr.org; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  * 
21  * 
22  * $Id: local_hna_set.c,v 1.6 2004/10/18 13:13:37 kattemat Exp $
23  *
24  */
25
26
27 #include "local_hna_set.h"
28
29
30 int
31 olsr_init_local_hna_set()
32 {
33
34   inet_gw = 0;
35
36   local_hna4_set.next = &local_hna4_set;
37   local_hna4_set.prev = &local_hna4_set;
38   local_hna6_set.next = &local_hna6_set;
39   local_hna6_set.prev = &local_hna6_set;
40
41   return 1;
42 }
43
44
45 void
46 add_local_hna4_entry(union olsr_ip_addr *net, union hna_netmask *mask)
47 {
48   struct local_hna_entry *new_entry;
49
50   if((net->v4 == 0) && (mask->v4 == 0))
51     inet_gw = 1;
52
53   new_entry = olsr_malloc(sizeof(struct local_hna_entry), "Add local HNA entry 4");
54
55   memcpy(&new_entry->A_network_addr, net, sizeof(olsr_u32_t));
56   memcpy(&new_entry->A_netmask, mask, sizeof(olsr_u32_t));
57
58   /* Queue */
59
60   local_hna4_set.next->prev = new_entry;
61   new_entry->next = local_hna4_set.next;
62   local_hna4_set.next = new_entry;
63   new_entry->prev = &local_hna4_set;
64 }
65
66
67 void
68 add_local_hna6_entry(union olsr_ip_addr *net, union hna_netmask *mask)
69 {
70   struct local_hna_entry *new_entry;
71
72   new_entry = olsr_malloc(sizeof(struct local_hna_entry), "Add local HNA entry 6");
73
74   memcpy(&new_entry->A_network_addr, net, sizeof(struct in6_addr));
75   memcpy(&new_entry->A_netmask, mask, sizeof(olsr_u16_t));
76
77   /* Queue */
78
79   local_hna6_set.next->prev = new_entry;
80   new_entry->next = local_hna6_set.next;
81   local_hna6_set.next = new_entry;
82   new_entry->prev = &local_hna6_set;
83 }
84
85
86 int
87 remove_local_hna4_entry(union olsr_ip_addr *net, union hna_netmask *mask)
88 {
89   struct local_hna_entry *entry;
90
91   if((net->v4 == 0) && (mask->v4 == 0))
92     inet_gw = 0;
93
94   for(entry = local_hna4_set.next; 
95       entry != &local_hna4_set;
96       entry = entry->next)
97     {
98       if((net->v4 == entry->A_network_addr.v4) && 
99          (mask->v4 == entry->A_netmask.v4))
100         {
101           entry->prev->next = entry->next;
102           entry->next->prev = entry->prev;
103
104           free(entry);
105           return 1;
106         }
107     }
108   return 0;
109 }
110
111
112
113 int
114 remove_local_hna6_entry(union olsr_ip_addr *net, union hna_netmask *mask)
115 {
116   struct local_hna_entry *entry;
117
118   for(entry = local_hna6_set.next; 
119       entry != &local_hna6_set;
120       entry = entry->next)
121     {
122       if((memcmp(net, &entry->A_network_addr, ipsize) == 0) && 
123          (mask->v6 == entry->A_netmask.v6))
124         {
125           entry->prev->next = entry->next;
126           entry->next->prev = entry->prev;
127           
128           free(entry);
129           return 1;
130         }
131     }
132   return 0;
133 }
134