Line 0
Link Here
|
|
|
1 |
diff -u -r ../quagga-0.99.18_org/ospf6d/ospf6_neighbor.c ./ospf6d/ospf6_neighbor.c |
2 |
--- ../quagga-0.99.18_org/ospf6d/ospf6_neighbor.c 2011-03-21 10:43:52.000000000 +0100 |
3 |
+++ ./ospf6d/ospf6_neighbor.c 2011-03-31 17:19:30.000000000 +0200 |
4 |
@@ -141,12 +141,29 @@ |
5 |
THREAD_OFF (on->thread_send_lsack); |
6 |
|
7 |
XFREE (MTYPE_OSPF6_NEIGHBOR, on); |
8 |
+ |
9 |
} |
10 |
+ |
11 |
+const char *ospf6_nsm_event_str[] = |
12 |
+{ |
13 |
+ "NoEvent", |
14 |
+ "HelloReceived", |
15 |
+ "2-WayReceived", |
16 |
+ "NegotiationDone", |
17 |
+ "ExchangeDone", |
18 |
+ "LoadingDone", |
19 |
+ "AdjOK?", |
20 |
+ "SeqNumberMismatch", |
21 |
+ "BadLSReq", |
22 |
+ "1-WayReceived", |
23 |
+ "InactivityTimer" |
24 |
+}; |
25 |
|
26 |
static void |
27 |
-ospf6_neighbor_state_change (u_char next_state, struct ospf6_neighbor *on) |
28 |
+ospf6_neighbor_state_change (u_char next_state, struct ospf6_neighbor *on, int event) |
29 |
{ |
30 |
u_char prev_state; |
31 |
+ char router_id[16]; |
32 |
|
33 |
prev_state = on->state; |
34 |
on->state = next_state; |
35 |
@@ -159,9 +176,25 @@ |
36 |
/* log */ |
37 |
if (IS_OSPF6_DEBUG_NEIGHBOR (STATE)) |
38 |
{ |
39 |
- zlog_debug ("Neighbor state change %s: [%s]->[%s]", on->name, |
40 |
- ospf6_neighbor_state_str[prev_state], |
41 |
- ospf6_neighbor_state_str[next_state]); |
42 |
+ inet_ntop (AF_INET, &on->router_id, router_id, sizeof (router_id)); |
43 |
+ zlog_debug ("Neighbor state change %s: [%s]->[%s] (%s)", router_id, |
44 |
+ ospf6_neighbor_state_str[prev_state], |
45 |
+ ospf6_neighbor_state_str[next_state], |
46 |
+ ospf6_nsm_event_str [event]); |
47 |
+ } |
48 |
+ |
49 |
+ /* Optionally notify about adjacency changes */ |
50 |
+ if (CHECK_FLAG(on->ospf6_if->area->ospf6->flag, OSPF6_LOG_ADJACENCY_CHANGES) && |
51 |
+ (CHECK_FLAG(on->ospf6_if->area->ospf6->flag, OSPF6_LOG_ADJACENCY_DETAIL) || |
52 |
+ (next_state == OSPF6_NEIGHBOR_FULL) || (next_state < on->state))) |
53 |
+ { |
54 |
+ inet_ntop (AF_INET, &on->router_id, router_id, sizeof (router_id)); |
55 |
+ zlog_notice("AdjChg: Nbr %s on %s: %s -> %s (%s)", |
56 |
+ router_id, on->ospf6_if->interface->name, |
57 |
+ ospf6_neighbor_state_str[prev_state], |
58 |
+ ospf6_neighbor_state_str[next_state], |
59 |
+ ospf6_nsm_event_str [event]); |
60 |
+ |
61 |
} |
62 |
|
63 |
if (prev_state == OSPF6_NEIGHBOR_FULL || next_state == OSPF6_NEIGHBOR_FULL) |
64 |
@@ -215,7 +248,7 @@ |
65 |
on->ospf6_if->dead_interval); |
66 |
|
67 |
if (on->state <= OSPF6_NEIGHBOR_DOWN) |
68 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_INIT, on); |
69 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_INIT, on, OSPF6_EVENT_HELLO_RECV); |
70 |
|
71 |
return 0; |
72 |
} |
73 |
@@ -238,11 +271,11 @@ |
74 |
|
75 |
if (! need_adjacency (on)) |
76 |
{ |
77 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_TWOWAY, on); |
78 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_TWOWAY, on, OSPF6_EVENT_2WAY); |
79 |
return 0; |
80 |
} |
81 |
|
82 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on); |
83 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on, OSPF6_EVENT_2WAY); |
84 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MSBIT); |
85 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MBIT); |
86 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); |
87 |
@@ -319,7 +352,7 @@ |
88 |
} |
89 |
|
90 |
UNSET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); |
91 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXCHANGE, on); |
92 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXCHANGE, on, OSPF6_EVENT_NEG_DONE); |
93 |
|
94 |
return 0; |
95 |
} |
96 |
@@ -347,9 +380,9 @@ |
97 |
*/ |
98 |
|
99 |
if (on->request_list->count == 0) |
100 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_FULL, on); |
101 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_FULL, on, OSPF6_EVENT_EXCH_DONE); |
102 |
else |
103 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_LOADING, on); |
104 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_LOADING, on, OSPF6_EVENT_EXCH_DONE); |
105 |
|
106 |
return 0; |
107 |
} |
108 |
@@ -370,7 +403,7 @@ |
109 |
|
110 |
assert (on->request_list->count == 0); |
111 |
|
112 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_FULL, on); |
113 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_FULL, on, OSPF6_EVENT_LOAD_DONE); |
114 |
|
115 |
return 0; |
116 |
} |
117 |
@@ -389,7 +422,7 @@ |
118 |
|
119 |
if (on->state == OSPF6_NEIGHBOR_TWOWAY && need_adjacency (on)) |
120 |
{ |
121 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on); |
122 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on, OSPF6_EVENT_ADJ_OK); |
123 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MSBIT); |
124 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MBIT); |
125 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); |
126 |
@@ -402,7 +435,7 @@ |
127 |
else if (on->state >= OSPF6_NEIGHBOR_EXSTART && |
128 |
! need_adjacency (on)) |
129 |
{ |
130 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_TWOWAY, on); |
131 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_TWOWAY, on, OSPF6_EVENT_ADJ_OK); |
132 |
ospf6_lsdb_remove_all (on->summary_list); |
133 |
ospf6_lsdb_remove_all (on->request_list); |
134 |
for (lsa = ospf6_lsdb_head (on->retrans_list); lsa; |
135 |
@@ -431,7 +464,7 @@ |
136 |
if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) |
137 |
zlog_debug ("Neighbor Event %s: *SeqNumberMismatch*", on->name); |
138 |
|
139 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on); |
140 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on, OSPF6_EVENT_SEQ_MISS); |
141 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MSBIT); |
142 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MBIT); |
143 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); |
144 |
@@ -467,7 +500,7 @@ |
145 |
if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) |
146 |
zlog_debug ("Neighbor Event %s: *BadLSReq*", on->name); |
147 |
|
148 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on); |
149 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on, OSPF6_EVENT_BAD_LSREQ); |
150 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MSBIT); |
151 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MBIT); |
152 |
SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); |
153 |
@@ -503,7 +536,7 @@ |
154 |
if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) |
155 |
zlog_debug ("Neighbor Event %s: *1Way-Received*", on->name); |
156 |
|
157 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_INIT, on); |
158 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_INIT, on, OSPF6_EVENT_1WAY_RECV); |
159 |
thread_add_event (master, neighbor_change, on->ospf6_if, 0); |
160 |
|
161 |
ospf6_lsdb_remove_all (on->summary_list); |
162 |
@@ -538,7 +571,7 @@ |
163 |
on->drouter = on->prev_drouter = 0; |
164 |
on->bdrouter = on->prev_bdrouter = 0; |
165 |
|
166 |
- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_DOWN, on); |
167 |
+ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_DOWN, on, OSPF6_EVENT_INACT_T); |
168 |
thread_add_event (master, neighbor_change, on->ospf6_if, 0); |
169 |
|
170 |
listnode_delete (on->ospf6_if->neighbor_list, on); |
171 |
diff -u -r ../quagga-0.99.18_org/ospf6d/ospf6_neighbor.h ./ospf6d/ospf6_neighbor.h |
172 |
--- ../quagga-0.99.18_org/ospf6d/ospf6_neighbor.h 2011-03-21 10:43:52.000000000 +0100 |
173 |
+++ ./ospf6d/ospf6_neighbor.h 2011-03-31 17:20:15.000000000 +0200 |
174 |
@@ -107,6 +107,20 @@ |
175 |
|
176 |
extern const char *ospf6_neighbor_state_str[]; |
177 |
|
178 |
+/* Neighbor event state */ |
179 |
+#define OSPF6_EVENT_HELLO_RECV 1 |
180 |
+#define OSPF6_EVENT_2WAY 2 |
181 |
+#define OSPF6_EVENT_NEG_DONE 3 |
182 |
+#define OSPF6_EVENT_EXCH_DONE 4 |
183 |
+#define OSPF6_EVENT_LOAD_DONE 5 |
184 |
+#define OSPF6_EVENT_ADJ_OK 6 |
185 |
+#define OSPF6_EVENT_SEQ_MISS 7 |
186 |
+#define OSPF6_EVENT_BAD_LSREQ 8 |
187 |
+#define OSPF6_EVENT_1WAY_RECV 9 |
188 |
+#define OSPF6_EVENT_INACT_T 10 |
189 |
+ |
190 |
+extern const char *ospf6_nsm_event_str[]; |
191 |
+ |
192 |
|
193 |
/* Function Prototypes */ |
194 |
int ospf6_neighbor_cmp (void *va, void *vb); |
195 |
diff -u -r ../quagga-0.99.18_org/ospf6d/ospf6_top.c ./ospf6d/ospf6_top.c |
196 |
--- ../quagga-0.99.18_org/ospf6d/ospf6_top.c 2011-03-21 14:43:34.000000000 +0100 |
197 |
+++ ./ospf6d/ospf6_top.c 2011-03-31 17:23:51.000000000 +0200 |
198 |
@@ -312,6 +312,60 @@ |
199 |
return CMD_SUCCESS; |
200 |
} |
201 |
|
202 |
+DEFUN (ospf6_log_adjacency_changes, |
203 |
+ ospf6_log_adjacency_changes_cmd, |
204 |
+ "log-adjacency-changes", |
205 |
+ "Log changes in adjacency state\n") |
206 |
+{ |
207 |
+ struct ospf6 *o; |
208 |
+ o = (struct ospf6 *) vty->index; |
209 |
+ |
210 |
+ SET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_CHANGES); |
211 |
+ return CMD_SUCCESS; |
212 |
+} |
213 |
+ |
214 |
+DEFUN (ospf6_log_adjacency_changes_detail, |
215 |
+ ospf6_log_adjacency_changes_detail_cmd, |
216 |
+ "log-adjacency-changes detail", |
217 |
+ "Log changes in adjacency state\n" |
218 |
+ "Log all state changes\n") |
219 |
+{ |
220 |
+ struct ospf6 *o; |
221 |
+ o = (struct ospf6 *) vty->index; |
222 |
+ |
223 |
+ SET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_CHANGES); |
224 |
+ SET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_DETAIL); |
225 |
+ return CMD_SUCCESS; |
226 |
+} |
227 |
+ |
228 |
+DEFUN (no_ospf6_log_adjacency_changes, |
229 |
+ no_ospf6_log_adjacency_changes_cmd, |
230 |
+ "no log-adjacency-changes", |
231 |
+ NO_STR |
232 |
+ "Log changes in adjacency state\n") |
233 |
+{ |
234 |
+ struct ospf6 *o; |
235 |
+ o = (struct ospf6 *) vty->index; |
236 |
+ |
237 |
+ UNSET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_DETAIL); |
238 |
+ UNSET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_CHANGES); |
239 |
+ return CMD_SUCCESS; |
240 |
+} |
241 |
+ |
242 |
+DEFUN (no_ospf6_log_adjacency_changes_detail, |
243 |
+ no_ospf6_log_adjacency_changes_detail_cmd, |
244 |
+ "no log-adjacency-changes detail", |
245 |
+ NO_STR |
246 |
+ "Log changes in adjacency state\n" |
247 |
+ "Log all state changes\n") |
248 |
+{ |
249 |
+ struct ospf6 *o; |
250 |
+ o = (struct ospf6 *) vty->index; |
251 |
+ |
252 |
+ UNSET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_DETAIL); |
253 |
+ return CMD_SUCCESS; |
254 |
+} |
255 |
+ |
256 |
DEFUN (ospf6_interface_area, |
257 |
ospf6_interface_area_cmd, |
258 |
"interface IFNAME area A.B.C.D", |
259 |
@@ -648,6 +702,15 @@ |
260 |
if (ospf6->router_id_static != 0) |
261 |
vty_out (vty, " router-id %s%s", router_id, VNL); |
262 |
|
263 |
+ /* log-adjacency-changes flag print. */ |
264 |
+ if (CHECK_FLAG(ospf6->flag, OSPF6_LOG_ADJACENCY_CHANGES)) |
265 |
+ { |
266 |
+ vty_out(vty, " log-adjacency-changes"); |
267 |
+ if (CHECK_FLAG(ospf6->flag, OSPF6_LOG_ADJACENCY_DETAIL)) |
268 |
+ vty_out(vty, " detail"); |
269 |
+ vty_out(vty, "%s", VTY_NEWLINE); |
270 |
+ } |
271 |
+ |
272 |
ospf6_redistribute_config_write (vty); |
273 |
ospf6_area_config_write (vty); |
274 |
|
275 |
@@ -700,6 +763,13 @@ |
276 |
|
277 |
install_default (OSPF6_NODE); |
278 |
install_element (OSPF6_NODE, &ospf6_router_id_cmd); |
279 |
+ |
280 |
+ /* "ospf log-adjacency-changes" commands. */ |
281 |
+ install_element (OSPF6_NODE, &ospf6_log_adjacency_changes_cmd); |
282 |
+ install_element (OSPF6_NODE, &ospf6_log_adjacency_changes_detail_cmd); |
283 |
+ install_element (OSPF6_NODE, &no_ospf6_log_adjacency_changes_cmd); |
284 |
+ install_element (OSPF6_NODE, &no_ospf6_log_adjacency_changes_detail_cmd); |
285 |
+ |
286 |
install_element (OSPF6_NODE, &ospf6_interface_area_cmd); |
287 |
install_element (OSPF6_NODE, &no_ospf6_interface_area_cmd); |
288 |
} |
289 |
diff -u -r ../quagga-0.99.18_org/ospf6d/ospf6_top.h ./ospf6d/ospf6_top.h |
290 |
--- ../quagga-0.99.18_org/ospf6d/ospf6_top.h 2011-03-21 14:43:34.000000000 +0100 |
291 |
+++ ./ospf6d/ospf6_top.h 2011-03-31 17:24:33.000000000 +0200 |
292 |
@@ -62,7 +62,9 @@ |
293 |
struct thread *maxage_remover; |
294 |
}; |
295 |
|
296 |
-#define OSPF6_DISABLED 0x01 |
297 |
+#define OSPF6_DISABLED 0x01 |
298 |
+#define OSPF6_LOG_ADJACENCY_CHANGES 0x02 |
299 |
+#define OSPF6_LOG_ADJACENCY_DETAIL 0x04 |
300 |
|
301 |
/* global pointer for OSPF top data structure */ |
302 |
extern struct ospf6 *ospf6; |