Added CVS Id fields to all ca nd h files
[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 $
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   if(ipversion == AF_INET)
36     {
37       netmask_size = sizeof(olsr_u32_t);
38     }
39   else
40     {
41       netmask_size = sizeof(olsr_u16_t);
42     }
43
44   local_hna4_set.next = &local_hna4_set;
45   local_hna4_set.prev = &local_hna4_set;
46   local_hna6_set.next = &local_hna6_set;
47   local_hna6_set.prev = &local_hna6_set;
48
49   return 1;
50 }
51
52
53 void
54 add_local_hna4_entry(union olsr_ip_addr *net, union hna_netmask *mask)
55 {
56   struct local_hna_entry *new_entry;
57
58   if((net->v4 == 0) && (mask->v4 == 0))
59     inet_gw = 1;
60
61   new_entry = olsr_malloc(sizeof(struct local_hna_entry), "Add local HNA entry 4");
62
63   memcpy(&new_entry->A_network_addr, net, sizeof(olsr_u32_t));
64   memcpy(&new_entry->A_netmask, mask, sizeof(olsr_u32_t));
65
66   /* Queue */
67
68   local_hna4_set.next->prev = new_entry;
69   new_entry->next = local_hna4_set.next;
70   local_hna4_set.next = new_entry;
71   new_entry->prev = &local_hna4_set;
72 }
73
74
75 void
76 add_local_hna6_entry(union olsr_ip_addr *net, union hna_netmask *mask)
77 {
78   struct local_hna_entry *new_entry;
79
80   new_entry = olsr_malloc(sizeof(struct local_hna_entry), "Add local HNA entry 6");
81
82   memcpy(&new_entry->A_network_addr, net, sizeof(struct in6_addr));
83   memcpy(&new_entry->A_netmask, mask, sizeof(olsr_u16_t));
84
85   /* Queue */
86
87   local_hna6_set.next->prev = new_entry;
88   new_entry->next = local_hna6_set.next;
89   local_hna6_set.next = new_entry;
90   new_entry->prev = &local_hna6_set;
91 }
92
93
94 int
95 remove_local_hna4_entry(union olsr_ip_addr *net, union hna_netmask *mask)
96 {
97   struct local_hna_entry *entry;
98
99   if((net->v4 == 0) && (mask->v4 == 0))
100     inet_gw = 0;
101
102   for(entry = local_hna4_set.next; 
103       entry != &local_hna4_set;
104       entry = entry->next)
105     {
106       if((net->v4 == entry->A_network_addr.v4) && 
107          (mask->v4 == entry->A_netmask.v4))
108         {
109           entry->prev->next = entry->next;
110           entry->next->prev = entry->prev;
111
112           free(entry);
113           return 1;
114         }
115     }
116   return 0;
117 }
118
119
120
121 int
122 remove_local_hna6_entry(union olsr_ip_addr *net, union hna_netmask *mask)
123 {
124   struct local_hna_entry *entry;
125
126   for(entry = local_hna6_set.next; 
127       entry != &local_hna6_set;
128       entry = entry->next)
129     {
130       if((memcmp(net, &entry->A_network_addr, ipsize) == 0) && 
131          (mask->v6 == entry->A_netmask.v6))
132         {
133           entry->prev->next = entry->next;
134           entry->next->prev = entry->prev;
135           
136           free(entry);
137           return 1;
138         }
139     }
140   return 0;
141 }
142