nexmon – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | /* |
2 | * Copyright (c) 1998-2007 The TCPDUMP project |
||
3 | * |
||
4 | * Redistribution and use in source and binary forms, with or without |
||
5 | * modification, are permitted provided that: (1) source code |
||
6 | * distributions retain the above copyright notice and this paragraph |
||
7 | * in its entirety, and (2) distributions including binary code include |
||
8 | * the above copyright notice and this paragraph in its entirety in |
||
9 | * the documentation or other materials provided with the distribution. |
||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND |
||
11 | * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT |
||
12 | * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
||
13 | * FOR A PARTICULAR PURPOSE. |
||
14 | * |
||
15 | * VLAN TRUNKING PROTOCOL (VTP) |
||
16 | * |
||
17 | * Reference documentation: |
||
18 | * http://www.cisco.com/en/US/tech/tk389/tk689/technologies_tech_note09186a0080094c52.shtml |
||
19 | * http://www.cisco.com/warp/public/473/21.html |
||
20 | * http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm |
||
21 | * |
||
22 | * Original code ode by Carles Kishimoto <carles.kishimoto@gmail.com> |
||
23 | */ |
||
24 | |||
25 | #define NETDISSECT_REWORKED |
||
26 | #ifdef HAVE_CONFIG_H |
||
27 | #include "config.h" |
||
28 | #endif |
||
29 | |||
30 | #include <tcpdump-stdinc.h> |
||
31 | |||
32 | #include "interface.h" |
||
33 | #include "addrtoname.h" |
||
34 | #include "extract.h" |
||
35 | |||
36 | #define VTP_HEADER_LEN 36 |
||
37 | #define VTP_DOMAIN_NAME_LEN 32 |
||
38 | #define VTP_MD5_DIGEST_LEN 16 |
||
39 | #define VTP_UPDATE_TIMESTAMP_LEN 12 |
||
40 | #define VTP_VLAN_INFO_OFFSET 12 |
||
41 | |||
42 | #define VTP_SUMMARY_ADV 0x01 |
||
43 | #define VTP_SUBSET_ADV 0x02 |
||
44 | #define VTP_ADV_REQUEST 0x03 |
||
45 | #define VTP_JOIN_MESSAGE 0x04 |
||
46 | |||
47 | struct vtp_vlan_ { |
||
48 | uint8_t len; |
||
49 | uint8_t status; |
||
50 | uint8_t type; |
||
51 | uint8_t name_len; |
||
52 | uint16_t vlanid; |
||
53 | uint16_t mtu; |
||
54 | uint32_t index; |
||
55 | }; |
||
56 | |||
57 | static const struct tok vtp_message_type_values[] = { |
||
58 | { VTP_SUMMARY_ADV, "Summary advertisement"}, |
||
59 | { VTP_SUBSET_ADV, "Subset advertisement"}, |
||
60 | { VTP_ADV_REQUEST, "Advertisement request"}, |
||
61 | { VTP_JOIN_MESSAGE, "Join message"}, |
||
62 | { 0, NULL } |
||
63 | }; |
||
64 | |||
65 | static const struct tok vtp_header_values[] = { |
||
66 | { 0x01, "Followers"}, /* On Summary advertisement, 3rd byte is Followers */ |
||
67 | { 0x02, "Seq number"}, /* On Subset advertisement, 3rd byte is Sequence number */ |
||
68 | { 0x03, "Rsvd"}, /* On Adver. requests 3rd byte is Rsvd */ |
||
69 | { 0x04, "Rsvd"}, /* On Adver. requests 3rd byte is Rsvd */ |
||
70 | { 0, NULL } |
||
71 | }; |
||
72 | |||
73 | static const struct tok vtp_vlan_type_values[] = { |
||
74 | { 0x01, "Ethernet"}, |
||
75 | { 0x02, "FDDI"}, |
||
76 | { 0x03, "TrCRF"}, |
||
77 | { 0x04, "FDDI-net"}, |
||
78 | { 0x05, "TrBRF"}, |
||
79 | { 0, NULL } |
||
80 | }; |
||
81 | |||
82 | static const struct tok vtp_vlan_status[] = { |
||
83 | { 0x00, "Operational"}, |
||
84 | { 0x01, "Suspended"}, |
||
85 | { 0, NULL } |
||
86 | }; |
||
87 | |||
88 | #define VTP_VLAN_SOURCE_ROUTING_RING_NUMBER 0x01 |
||
89 | #define VTP_VLAN_SOURCE_ROUTING_BRIDGE_NUMBER 0x02 |
||
90 | #define VTP_VLAN_STP_TYPE 0x03 |
||
91 | #define VTP_VLAN_PARENT_VLAN 0x04 |
||
92 | #define VTP_VLAN_TRANS_BRIDGED_VLAN 0x05 |
||
93 | #define VTP_VLAN_PRUNING 0x06 |
||
94 | #define VTP_VLAN_BRIDGE_TYPE 0x07 |
||
95 | #define VTP_VLAN_ARP_HOP_COUNT 0x08 |
||
96 | #define VTP_VLAN_STE_HOP_COUNT 0x09 |
||
97 | #define VTP_VLAN_BACKUP_CRF_MODE 0x0A |
||
98 | |||
99 | static const struct tok vtp_vlan_tlv_values[] = { |
||
100 | { VTP_VLAN_SOURCE_ROUTING_RING_NUMBER, "Source-Routing Ring Number TLV"}, |
||
101 | { VTP_VLAN_SOURCE_ROUTING_BRIDGE_NUMBER, "Source-Routing Bridge Number TLV"}, |
||
102 | { VTP_VLAN_STP_TYPE, "STP type TLV"}, |
||
103 | { VTP_VLAN_PARENT_VLAN, "Parent VLAN TLV"}, |
||
104 | { VTP_VLAN_TRANS_BRIDGED_VLAN, "Translationally bridged VLANs TLV"}, |
||
105 | { VTP_VLAN_PRUNING, "Pruning TLV"}, |
||
106 | { VTP_VLAN_BRIDGE_TYPE, "Bridge Type TLV"}, |
||
107 | { VTP_VLAN_ARP_HOP_COUNT, "Max ARP Hop Count TLV"}, |
||
108 | { VTP_VLAN_STE_HOP_COUNT, "Max STE Hop Count TLV"}, |
||
109 | { VTP_VLAN_BACKUP_CRF_MODE, "Backup CRF Mode TLV"}, |
||
110 | { 0, NULL } |
||
111 | }; |
||
112 | |||
113 | static const struct tok vtp_stp_type_values[] = { |
||
114 | { 1, "SRT"}, |
||
115 | { 2, "SRB"}, |
||
116 | { 3, "Auto"}, |
||
117 | { 0, NULL } |
||
118 | }; |
||
119 | |||
120 | void |
||
121 | vtp_print (netdissect_options *ndo, |
||
122 | const u_char *pptr, u_int length) |
||
123 | { |
||
124 | int type, len, tlv_len, tlv_value; |
||
125 | const u_char *tptr; |
||
126 | const struct vtp_vlan_ *vtp_vlan; |
||
127 | |||
128 | if (length < VTP_HEADER_LEN) |
||
129 | goto trunc; |
||
130 | |||
131 | tptr = pptr; |
||
132 | |||
133 | ND_TCHECK2(*tptr, VTP_HEADER_LEN); |
||
134 | |||
135 | type = *(tptr+1); |
||
136 | ND_PRINT((ndo, "VTPv%u, Message %s (0x%02x), length %u", |
||
137 | *tptr, |
||
138 | tok2str(vtp_message_type_values,"Unknown message type", type), |
||
139 | *(tptr+1), |
||
140 | length)); |
||
141 | |||
142 | /* In non-verbose mode, just print version and message type */ |
||
143 | if (ndo->ndo_vflag < 1) { |
||
144 | return; |
||
145 | } |
||
146 | |||
147 | /* verbose mode print all fields */ |
||
148 | ND_PRINT((ndo, "\n\tDomain name: %s, %s: %u", |
||
149 | (tptr+4), |
||
150 | tok2str(vtp_header_values,"Unknown",*(tptr+1)), |
||
151 | *(tptr+2))); |
||
152 | |||
153 | tptr += VTP_HEADER_LEN; |
||
154 | |||
155 | switch (type) { |
||
156 | |||
157 | case VTP_SUMMARY_ADV: |
||
158 | |||
159 | /* |
||
160 | * SUMMARY ADVERTISEMENT |
||
161 | * |
||
162 | * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
||
163 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
164 | * | Version | Code | Followers | MmgtD Len | |
||
165 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
166 | * | Management Domain Name | |
||
167 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
168 | * | Configuration revision number | |
||
169 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
170 | * | Updater Identity IP address | |
||
171 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
172 | * | Update Timestamp (12 bytes) | |
||
173 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
174 | * | MD5 digest (16 bytes) | |
||
175 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
176 | * |
||
177 | */ |
||
178 | |||
179 | ND_PRINT((ndo, "\n\t Config Rev %x, Updater %s", |
||
180 | EXTRACT_32BITS(tptr), |
||
181 | ipaddr_string(ndo, tptr+4))); |
||
182 | tptr += 8; |
||
183 | ND_PRINT((ndo, ", Timestamp 0x%08x 0x%08x 0x%08x", |
||
184 | EXTRACT_32BITS(tptr), |
||
185 | EXTRACT_32BITS(tptr + 4), |
||
186 | EXTRACT_32BITS(tptr + 8))); |
||
187 | tptr += VTP_UPDATE_TIMESTAMP_LEN; |
||
188 | ND_PRINT((ndo, ", MD5 digest: %08x%08x%08x%08x", |
||
189 | EXTRACT_32BITS(tptr), |
||
190 | EXTRACT_32BITS(tptr + 4), |
||
191 | EXTRACT_32BITS(tptr + 8), |
||
192 | EXTRACT_32BITS(tptr + 12))); |
||
193 | tptr += VTP_MD5_DIGEST_LEN; |
||
194 | break; |
||
195 | |||
196 | case VTP_SUBSET_ADV: |
||
197 | |||
198 | /* |
||
199 | * SUBSET ADVERTISEMENT |
||
200 | * |
||
201 | * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
||
202 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
203 | * | Version | Code | Seq number | MmgtD Len | |
||
204 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
205 | * | Management Domain Name | |
||
206 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
207 | * | Configuration revision number | |
||
208 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
209 | * | VLAN info field 1 | |
||
210 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
211 | * | ................ | |
||
212 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
213 | * | VLAN info field N | |
||
214 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
215 | * |
||
216 | */ |
||
217 | |||
218 | ND_PRINT((ndo, ", Config Rev %x", EXTRACT_32BITS(tptr))); |
||
219 | |||
220 | /* |
||
221 | * VLAN INFORMATION |
||
222 | * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
||
223 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
224 | * | V info len | Status | VLAN type | VLAN name len | |
||
225 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
226 | * | ISL vlan id | MTU size | |
||
227 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
228 | * | 802.10 index (SAID) | |
||
229 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
230 | * | VLAN name | |
||
231 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
232 | * |
||
233 | */ |
||
234 | |||
235 | tptr += 4; |
||
236 | while (tptr < (pptr+length)) { |
||
237 | |||
238 | len = *tptr; |
||
239 | if (len == 0) |
||
240 | break; |
||
241 | |||
242 | ND_TCHECK2(*tptr, len); |
||
243 | |||
244 | vtp_vlan = (struct vtp_vlan_*)tptr; |
||
245 | ND_PRINT((ndo, "\n\tVLAN info status %s, type %s, VLAN-id %u, MTU %u, SAID 0x%08x, Name %s", |
||
246 | tok2str(vtp_vlan_status,"Unknown",vtp_vlan->status), |
||
247 | tok2str(vtp_vlan_type_values,"Unknown",vtp_vlan->type), |
||
248 | EXTRACT_16BITS(&vtp_vlan->vlanid), |
||
249 | EXTRACT_16BITS(&vtp_vlan->mtu), |
||
250 | EXTRACT_32BITS(&vtp_vlan->index), |
||
251 | (tptr + VTP_VLAN_INFO_OFFSET))); |
||
252 | |||
253 | /* |
||
254 | * Vlan names are aligned to 32-bit boundaries. |
||
255 | */ |
||
256 | len -= VTP_VLAN_INFO_OFFSET + 4*((vtp_vlan->name_len + 3)/4); |
||
257 | tptr += VTP_VLAN_INFO_OFFSET + 4*((vtp_vlan->name_len + 3)/4); |
||
258 | |||
259 | /* TLV information follows */ |
||
260 | |||
261 | while (len > 0) { |
||
262 | |||
263 | /* |
||
264 | * Cisco specs says 2 bytes for type + 2 bytes for length, take only 1 |
||
265 | * See: http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm |
||
266 | */ |
||
267 | type = *tptr; |
||
268 | tlv_len = *(tptr+1); |
||
269 | |||
270 | ND_PRINT((ndo, "\n\t\t%s (0x%04x) TLV", |
||
271 | tok2str(vtp_vlan_tlv_values, "Unknown", type), |
||
272 | type)); |
||
273 | |||
274 | /* |
||
275 | * infinite loop check |
||
276 | */ |
||
277 | if (type == 0 || tlv_len == 0) { |
||
278 | return; |
||
279 | } |
||
280 | |||
281 | ND_TCHECK2(*tptr, tlv_len * 2 +2); |
||
282 | |||
283 | tlv_value = EXTRACT_16BITS(tptr+2); |
||
284 | |||
285 | switch (type) { |
||
286 | case VTP_VLAN_STE_HOP_COUNT: |
||
287 | ND_PRINT((ndo, ", %u", tlv_value)); |
||
288 | break; |
||
289 | |||
290 | case VTP_VLAN_PRUNING: |
||
291 | ND_PRINT((ndo, ", %s (%u)", |
||
292 | tlv_value == 1 ? "Enabled" : "Disabled", |
||
293 | tlv_value)); |
||
294 | break; |
||
295 | |||
296 | case VTP_VLAN_STP_TYPE: |
||
297 | ND_PRINT((ndo, ", %s (%u)", |
||
298 | tok2str(vtp_stp_type_values, "Unknown", tlv_value), |
||
299 | tlv_value)); |
||
300 | break; |
||
301 | |||
302 | case VTP_VLAN_BRIDGE_TYPE: |
||
303 | ND_PRINT((ndo, ", %s (%u)", |
||
304 | tlv_value == 1 ? "SRB" : "SRT", |
||
305 | tlv_value)); |
||
306 | break; |
||
307 | |||
308 | case VTP_VLAN_BACKUP_CRF_MODE: |
||
309 | ND_PRINT((ndo, ", %s (%u)", |
||
310 | tlv_value == 1 ? "Backup" : "Not backup", |
||
311 | tlv_value)); |
||
312 | break; |
||
313 | |||
314 | /* |
||
315 | * FIXME those are the defined TLVs that lack a decoder |
||
316 | * you are welcome to contribute code ;-) |
||
317 | */ |
||
318 | |||
319 | case VTP_VLAN_SOURCE_ROUTING_RING_NUMBER: |
||
320 | case VTP_VLAN_SOURCE_ROUTING_BRIDGE_NUMBER: |
||
321 | case VTP_VLAN_PARENT_VLAN: |
||
322 | case VTP_VLAN_TRANS_BRIDGED_VLAN: |
||
323 | case VTP_VLAN_ARP_HOP_COUNT: |
||
324 | default: |
||
325 | print_unknown_data(ndo, tptr, "\n\t\t ", 2 + tlv_len*2); |
||
326 | break; |
||
327 | } |
||
328 | len -= 2 + tlv_len*2; |
||
329 | tptr += 2 + tlv_len*2; |
||
330 | } |
||
331 | } |
||
332 | break; |
||
333 | |||
334 | case VTP_ADV_REQUEST: |
||
335 | |||
336 | /* |
||
337 | * ADVERTISEMENT REQUEST |
||
338 | * |
||
339 | * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
||
340 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
341 | * | Version | Code | Reserved | MmgtD Len | |
||
342 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
343 | * | Management Domain Name | |
||
344 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
345 | * | Start value | |
||
346 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
||
347 | * |
||
348 | */ |
||
349 | |||
350 | ND_PRINT((ndo, "\n\tStart value: %u", EXTRACT_32BITS(tptr))); |
||
351 | break; |
||
352 | |||
353 | case VTP_JOIN_MESSAGE: |
||
354 | |||
355 | /* FIXME - Could not find message format */ |
||
356 | break; |
||
357 | |||
358 | default: |
||
359 | break; |
||
360 | } |
||
361 | |||
362 | return; |
||
363 | |||
364 | trunc: |
||
365 | ND_PRINT((ndo, "[|vtp]")); |
||
366 | } |
||
367 | |||
368 | /* |
||
369 | * Local Variables: |
||
370 | * c-style: whitesmith |
||
371 | * c-basic-offset: 4 |
||
372 | * End: |
||
373 | */ |