print-lmp.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139
  1. /*
  2. * Redistribution and use in source and binary forms, with or without
  3. * modification, are permitted provided that: (1) source code
  4. * distributions retain the above copyright notice and this paragraph
  5. * in its entirety, and (2) distributions including binary code include
  6. * the above copyright notice and this paragraph in its entirety in
  7. * the documentation or other materials provided with the distribution.
  8. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
  9. * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
  10. * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  11. * FOR A PARTICULAR PURPOSE.
  12. *
  13. * Original code by Hannes Gredler (hannes@gredler.at)
  14. * Support for LMP service discovery extensions (defined by OIF UNI 1.0)
  15. * added by Manu Pathak (mapathak@cisco.com), May 2005
  16. */
  17. /* \summary: Link Management Protocol (LMP) printer */
  18. /* specification: RFC 4204 */
  19. /* OIF UNI 1.0: http://www.oiforum.com/public/documents/OIF-UNI-01.0.pdf */
  20. #ifdef HAVE_CONFIG_H
  21. #include "config.h"
  22. #endif
  23. #include <netdissect-stdinc.h>
  24. #include "netdissect.h"
  25. #include "extract.h"
  26. #include "addrtoname.h"
  27. #include "gmpls.h"
  28. /*
  29. * LMP common header
  30. *
  31. * 0 1 2 3
  32. * 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
  33. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  34. * | Vers | (Reserved) | Flags | Msg Type |
  35. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  36. * | LMP Length | (Reserved) |
  37. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  38. */
  39. struct lmp_common_header {
  40. uint8_t version_res[2];
  41. uint8_t flags;
  42. uint8_t msg_type;
  43. uint8_t length[2];
  44. uint8_t reserved[2];
  45. };
  46. #define LMP_VERSION 1
  47. #define LMP_EXTRACT_VERSION(x) (((x)&0xf0)>>4)
  48. static const struct tok lmp_header_flag_values[] = {
  49. { 0x01, "Control Channel Down"},
  50. { 0x02, "LMP restart"},
  51. { 0, NULL}
  52. };
  53. static const struct tok lmp_obj_te_link_flag_values[] = {
  54. { 0x01, "Fault Management Supported"},
  55. { 0x02, "Link Verification Supported"},
  56. { 0, NULL}
  57. };
  58. static const struct tok lmp_obj_data_link_flag_values[] = {
  59. { 0x01, "Data Link Port"},
  60. { 0x02, "Allocated for user traffic"},
  61. { 0x04, "Failed link"},
  62. { 0, NULL}
  63. };
  64. static const struct tok lmp_obj_channel_status_values[] = {
  65. { 1, "Signal Okay"},
  66. { 2, "Signal Degraded"},
  67. { 3, "Signal Fail"},
  68. { 0, NULL}
  69. };
  70. static const struct tok lmp_obj_begin_verify_flag_values[] = {
  71. { 0x0001, "Verify all links"},
  72. { 0x0002, "Data link type"},
  73. { 0, NULL}
  74. };
  75. static const struct tok lmp_obj_begin_verify_error_values[] = {
  76. { 0x01, "Link Verification Procedure Not supported"},
  77. { 0x02, "Unwilling to verify"},
  78. { 0x04, "Unsupported verification transport mechanism"},
  79. { 0x08, "Link-Id configuration error"},
  80. { 0x10, "Unknown object c-type"},
  81. { 0, NULL}
  82. };
  83. static const struct tok lmp_obj_link_summary_error_values[] = {
  84. { 0x01, "Unacceptable non-negotiable LINK-SUMMARY parameters"},
  85. { 0x02, "Renegotiate LINK-SUMMARY parameters"},
  86. { 0x04, "Invalid TE-LINK Object"},
  87. { 0x08, "Invalid DATA-LINK Object"},
  88. { 0x10, "Unknown TE-LINK Object c-type"},
  89. { 0x20, "Unknown DATA-LINK Object c-type"},
  90. { 0, NULL}
  91. };
  92. /* Service Config Supported Protocols Flags */
  93. static const struct tok lmp_obj_service_config_sp_flag_values[] = {
  94. { 0x01, "RSVP Supported"},
  95. { 0x02, "LDP Supported"},
  96. { 0, NULL}
  97. };
  98. /* Service Config Client Port Service Attribute Transparency Flags */
  99. static const struct tok lmp_obj_service_config_cpsa_tp_flag_values[] = {
  100. { 0x01, "Path/VC Overhead Transparency Supported"},
  101. { 0x02, "Line/MS Overhead Transparency Supported"},
  102. { 0x04, "Section/RS Overhead Transparency Supported"},
  103. { 0, NULL}
  104. };
  105. /* Service Config Client Port Service Attribute Contiguous Concatenation Types Flags */
  106. static const struct tok lmp_obj_service_config_cpsa_cct_flag_values[] = {
  107. { 0x01, "Contiguous Concatenation Types Supported"},
  108. { 0, NULL}
  109. };
  110. /* Service Config Network Service Attributes Transparency Flags */
  111. static const struct tok lmp_obj_service_config_nsa_transparency_flag_values[] = {
  112. { 0x01, "Standard SOH/RSOH Transparency Supported"},
  113. { 0x02, "Standard LOH/MSOH Transparency Supported"},
  114. { 0, NULL}
  115. };
  116. /* Service Config Network Service Attributes TCM Monitoring Flags */
  117. static const struct tok lmp_obj_service_config_nsa_tcm_flag_values[] = {
  118. { 0x01, "Transparent Tandem Connection Monitoring Supported"},
  119. { 0, NULL}
  120. };
  121. /* Network Service Attributes Network Diversity Flags */
  122. static const struct tok lmp_obj_service_config_nsa_network_diversity_flag_values[] = {
  123. { 0x01, "Node Diversity Supported"},
  124. { 0x02, "Link Diversity Supported"},
  125. { 0x04, "SRLG Diversity Supported"},
  126. { 0, NULL}
  127. };
  128. #define LMP_MSGTYPE_CONFIG 1
  129. #define LMP_MSGTYPE_CONFIG_ACK 2
  130. #define LMP_MSGTYPE_CONFIG_NACK 3
  131. #define LMP_MSGTYPE_HELLO 4
  132. #define LMP_MSGTYPE_VERIFY_BEGIN 5
  133. #define LMP_MSGTYPE_VERIFY_BEGIN_ACK 6
  134. #define LMP_MSGTYPE_VERIFY_BEGIN_NACK 7
  135. #define LMP_MSGTYPE_VERIFY_END 8
  136. #define LMP_MSGTYPE_VERIFY_END_ACK 9
  137. #define LMP_MSGTYPE_TEST 10
  138. #define LMP_MSGTYPE_TEST_STATUS_SUCCESS 11
  139. #define LMP_MSGTYPE_TEST_STATUS_FAILURE 12
  140. #define LMP_MSGTYPE_TEST_STATUS_ACK 13
  141. #define LMP_MSGTYPE_LINK_SUMMARY 14
  142. #define LMP_MSGTYPE_LINK_SUMMARY_ACK 15
  143. #define LMP_MSGTYPE_LINK_SUMMARY_NACK 16
  144. #define LMP_MSGTYPE_CHANNEL_STATUS 17
  145. #define LMP_MSGTYPE_CHANNEL_STATUS_ACK 18
  146. #define LMP_MSGTYPE_CHANNEL_STATUS_REQ 19
  147. #define LMP_MSGTYPE_CHANNEL_STATUS_RESP 20
  148. /* LMP Service Discovery message types defined by UNI 1.0 */
  149. #define LMP_MSGTYPE_SERVICE_CONFIG 50
  150. #define LMP_MSGTYPE_SERVICE_CONFIG_ACK 51
  151. #define LMP_MSGTYPE_SERVICE_CONFIG_NACK 52
  152. static const struct tok lmp_msg_type_values[] = {
  153. { LMP_MSGTYPE_CONFIG, "Config"},
  154. { LMP_MSGTYPE_CONFIG_ACK, "Config ACK"},
  155. { LMP_MSGTYPE_CONFIG_NACK, "Config NACK"},
  156. { LMP_MSGTYPE_HELLO, "Hello"},
  157. { LMP_MSGTYPE_VERIFY_BEGIN, "Begin Verify"},
  158. { LMP_MSGTYPE_VERIFY_BEGIN_ACK, "Begin Verify ACK"},
  159. { LMP_MSGTYPE_VERIFY_BEGIN_NACK, "Begin Verify NACK"},
  160. { LMP_MSGTYPE_VERIFY_END, "End Verify"},
  161. { LMP_MSGTYPE_VERIFY_END_ACK, "End Verify ACK"},
  162. { LMP_MSGTYPE_TEST, "Test"},
  163. { LMP_MSGTYPE_TEST_STATUS_SUCCESS, "Test Status Success"},
  164. { LMP_MSGTYPE_TEST_STATUS_FAILURE, "Test Status Failure"},
  165. { LMP_MSGTYPE_TEST_STATUS_ACK, "Test Status ACK"},
  166. { LMP_MSGTYPE_LINK_SUMMARY, "Link Summary"},
  167. { LMP_MSGTYPE_LINK_SUMMARY_ACK, "Link Summary ACK"},
  168. { LMP_MSGTYPE_LINK_SUMMARY_NACK, "Link Summary NACK"},
  169. { LMP_MSGTYPE_CHANNEL_STATUS, "Channel Status"},
  170. { LMP_MSGTYPE_CHANNEL_STATUS_ACK, "Channel Status ACK"},
  171. { LMP_MSGTYPE_CHANNEL_STATUS_REQ, "Channel Status Request"},
  172. { LMP_MSGTYPE_CHANNEL_STATUS_RESP, "Channel Status Response"},
  173. { LMP_MSGTYPE_SERVICE_CONFIG, "Service Config"},
  174. { LMP_MSGTYPE_SERVICE_CONFIG_ACK, "Service Config ACK"},
  175. { LMP_MSGTYPE_SERVICE_CONFIG_NACK, "Service Config NACK"},
  176. { 0, NULL}
  177. };
  178. /*
  179. * LMP object header
  180. *
  181. * 0 1 2 3
  182. * 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
  183. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  184. * |N| C-Type | Class | Length |
  185. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  186. * | |
  187. * // (object contents) //
  188. * | |
  189. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  190. */
  191. struct lmp_object_header {
  192. uint8_t ctype;
  193. uint8_t class_num;
  194. uint8_t length[2];
  195. };
  196. #define LMP_OBJ_CC_ID 1
  197. #define LMP_OBJ_NODE_ID 2
  198. #define LMP_OBJ_LINK_ID 3
  199. #define LMP_OBJ_INTERFACE_ID 4
  200. #define LMP_OBJ_MESSAGE_ID 5
  201. #define LMP_OBJ_CONFIG 6
  202. #define LMP_OBJ_HELLO 7
  203. #define LMP_OBJ_VERIFY_BEGIN 8
  204. #define LMP_OBJ_VERIFY_BEGIN_ACK 9
  205. #define LMP_OBJ_VERIFY_ID 10
  206. #define LMP_OBJ_TE_LINK 11
  207. #define LMP_OBJ_DATA_LINK 12
  208. #define LMP_OBJ_CHANNEL_STATUS 13
  209. #define LMP_OBJ_CHANNEL_STATUS_REQ 14
  210. #define LMP_OBJ_ERROR_CODE 20
  211. #define LMP_OBJ_SERVICE_CONFIG 51 /* defined in UNI 1.0 */
  212. static const struct tok lmp_obj_values[] = {
  213. { LMP_OBJ_CC_ID, "Control Channel ID" },
  214. { LMP_OBJ_NODE_ID, "Node ID" },
  215. { LMP_OBJ_LINK_ID, "Link ID" },
  216. { LMP_OBJ_INTERFACE_ID, "Interface ID" },
  217. { LMP_OBJ_MESSAGE_ID, "Message ID" },
  218. { LMP_OBJ_CONFIG, "Configuration" },
  219. { LMP_OBJ_HELLO, "Hello" },
  220. { LMP_OBJ_VERIFY_BEGIN, "Verify Begin" },
  221. { LMP_OBJ_VERIFY_BEGIN_ACK, "Verify Begin ACK" },
  222. { LMP_OBJ_VERIFY_ID, "Verify ID" },
  223. { LMP_OBJ_TE_LINK, "TE Link" },
  224. { LMP_OBJ_DATA_LINK, "Data Link" },
  225. { LMP_OBJ_CHANNEL_STATUS, "Channel Status" },
  226. { LMP_OBJ_CHANNEL_STATUS_REQ, "Channel Status Request" },
  227. { LMP_OBJ_ERROR_CODE, "Error Code" },
  228. { LMP_OBJ_SERVICE_CONFIG, "Service Config" },
  229. { 0, NULL}
  230. };
  231. #define INT_SWITCHING_TYPE_SUBOBJ 1
  232. #define WAVELENGTH_SUBOBJ 2
  233. static const struct tok lmp_data_link_subobj[] = {
  234. { INT_SWITCHING_TYPE_SUBOBJ, "Interface Switching Type" },
  235. { WAVELENGTH_SUBOBJ , "Wavelength" },
  236. { 0, NULL}
  237. };
  238. #define LMP_CTYPE_IPV4 1
  239. #define LMP_CTYPE_IPV6 2
  240. #define LMP_CTYPE_LOC 1
  241. #define LMP_CTYPE_RMT 2
  242. #define LMP_CTYPE_UNMD 3
  243. #define LMP_CTYPE_IPV4_LOC 1
  244. #define LMP_CTYPE_IPV4_RMT 2
  245. #define LMP_CTYPE_IPV6_LOC 3
  246. #define LMP_CTYPE_IPV6_RMT 4
  247. #define LMP_CTYPE_UNMD_LOC 5
  248. #define LMP_CTYPE_UNMD_RMT 6
  249. #define LMP_CTYPE_1 1
  250. #define LMP_CTYPE_2 2
  251. #define LMP_CTYPE_HELLO_CONFIG 1
  252. #define LMP_CTYPE_HELLO 1
  253. #define LMP_CTYPE_BEGIN_VERIFY_ERROR 1
  254. #define LMP_CTYPE_LINK_SUMMARY_ERROR 2
  255. /* C-Types for Service Config Object */
  256. #define LMP_CTYPE_SERVICE_CONFIG_SP 1
  257. #define LMP_CTYPE_SERVICE_CONFIG_CPSA 2
  258. #define LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM 3
  259. #define LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY 4
  260. /*
  261. * Different link types allowed in the Client Port Service Attributes
  262. * subobject defined for LMP Service Discovery in the UNI 1.0 spec
  263. */
  264. #define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH 5 /* UNI 1.0 Sec 9.4.2 */
  265. #define LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET 6 /* UNI 1.0 Sec 9.4.2 */
  266. /*
  267. * the ctypes are not globally unique so for
  268. * translating it to strings we build a table based
  269. * on objects offsetted by the ctype
  270. */
  271. static const struct tok lmp_ctype_values[] = {
  272. { 256*LMP_OBJ_CC_ID+LMP_CTYPE_LOC, "Local" },
  273. { 256*LMP_OBJ_CC_ID+LMP_CTYPE_RMT, "Remote" },
  274. { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_LOC, "Local" },
  275. { 256*LMP_OBJ_NODE_ID+LMP_CTYPE_RMT, "Remote" },
  276. { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" },
  277. { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" },
  278. { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" },
  279. { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" },
  280. { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" },
  281. { 256*LMP_OBJ_LINK_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" },
  282. { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_LOC, "IPv4 Local" },
  283. { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV4_RMT, "IPv4 Remote" },
  284. { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_LOC, "IPv6 Local" },
  285. { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_IPV6_RMT, "IPv6 Remote" },
  286. { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_LOC, "Unnumbered Local" },
  287. { 256*LMP_OBJ_INTERFACE_ID+LMP_CTYPE_UNMD_RMT, "Unnumbered Remote" },
  288. { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_1, "1" },
  289. { 256*LMP_OBJ_MESSAGE_ID+LMP_CTYPE_2, "2" },
  290. { 256*LMP_OBJ_CONFIG+LMP_CTYPE_1, "1" },
  291. { 256*LMP_OBJ_HELLO+LMP_CTYPE_1, "1" },
  292. { 256*LMP_OBJ_VERIFY_BEGIN+LMP_CTYPE_1, "1" },
  293. { 256*LMP_OBJ_VERIFY_BEGIN_ACK+LMP_CTYPE_1, "1" },
  294. { 256*LMP_OBJ_VERIFY_ID+LMP_CTYPE_1, "1" },
  295. { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV4, "IPv4" },
  296. { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_IPV6, "IPv6" },
  297. { 256*LMP_OBJ_TE_LINK+LMP_CTYPE_UNMD, "Unnumbered" },
  298. { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV4, "IPv4" },
  299. { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_IPV6, "IPv6" },
  300. { 256*LMP_OBJ_DATA_LINK+LMP_CTYPE_UNMD, "Unnumbered" },
  301. { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV4, "IPv4" },
  302. { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_IPV6, "IPv6" },
  303. { 256*LMP_OBJ_CHANNEL_STATUS+LMP_CTYPE_UNMD, "Unnumbered" },
  304. { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV4, "IPv4" },
  305. { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_IPV6, "IPv6" },
  306. { 256*LMP_OBJ_CHANNEL_STATUS_REQ+LMP_CTYPE_UNMD, "Unnumbered" },
  307. { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_1, "1" },
  308. { 256*LMP_OBJ_ERROR_CODE+LMP_CTYPE_2, "2" },
  309. { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_SP, "1" },
  310. { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_CPSA, "2" },
  311. { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM, "3" },
  312. { 256*LMP_OBJ_SERVICE_CONFIG+LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY, "4" },
  313. { 0, NULL}
  314. };
  315. static int
  316. lmp_print_data_link_subobjs(netdissect_options *ndo, const u_char *obj_tptr,
  317. int total_subobj_len, int offset)
  318. {
  319. int hexdump = FALSE;
  320. int subobj_type, subobj_len;
  321. union { /* int to float conversion buffer */
  322. float f;
  323. uint32_t i;
  324. } bw;
  325. while (total_subobj_len > 0 && hexdump == FALSE ) {
  326. subobj_type = EXTRACT_8BITS(obj_tptr+offset);
  327. subobj_len = EXTRACT_8BITS(obj_tptr+offset+1);
  328. ND_PRINT((ndo, "\n\t Subobject, Type: %s (%u), Length: %u",
  329. tok2str(lmp_data_link_subobj,
  330. "Unknown",
  331. subobj_type),
  332. subobj_type,
  333. subobj_len));
  334. if (subobj_len < 4) {
  335. ND_PRINT((ndo, " (too short)"));
  336. break;
  337. }
  338. if ((subobj_len % 4) != 0) {
  339. ND_PRINT((ndo, " (not a multiple of 4)"));
  340. break;
  341. }
  342. if (total_subobj_len < subobj_len) {
  343. ND_PRINT((ndo, " (goes past the end of the object)"));
  344. break;
  345. }
  346. switch(subobj_type) {
  347. case INT_SWITCHING_TYPE_SUBOBJ:
  348. ND_PRINT((ndo, "\n\t Switching Type: %s (%u)",
  349. tok2str(gmpls_switch_cap_values,
  350. "Unknown",
  351. EXTRACT_8BITS(obj_tptr+offset+2)),
  352. EXTRACT_8BITS(obj_tptr+offset+2)));
  353. ND_PRINT((ndo, "\n\t Encoding Type: %s (%u)",
  354. tok2str(gmpls_encoding_values,
  355. "Unknown",
  356. EXTRACT_8BITS(obj_tptr+offset+3)),
  357. EXTRACT_8BITS(obj_tptr+offset+3)));
  358. bw.i = EXTRACT_32BITS(obj_tptr+offset+4);
  359. ND_PRINT((ndo, "\n\t Min Reservable Bandwidth: %.3f Mbps",
  360. bw.f*8/1000000));
  361. bw.i = EXTRACT_32BITS(obj_tptr+offset+8);
  362. ND_PRINT((ndo, "\n\t Max Reservable Bandwidth: %.3f Mbps",
  363. bw.f*8/1000000));
  364. break;
  365. case WAVELENGTH_SUBOBJ:
  366. ND_PRINT((ndo, "\n\t Wavelength: %u",
  367. EXTRACT_32BITS(obj_tptr+offset+4)));
  368. break;
  369. default:
  370. /* Any Unknown Subobject ==> Exit loop */
  371. hexdump=TRUE;
  372. break;
  373. }
  374. total_subobj_len-=subobj_len;
  375. offset+=subobj_len;
  376. }
  377. return (hexdump);
  378. }
  379. void
  380. lmp_print(netdissect_options *ndo,
  381. register const u_char *pptr, register u_int len)
  382. {
  383. const struct lmp_common_header *lmp_com_header;
  384. const struct lmp_object_header *lmp_obj_header;
  385. const u_char *tptr,*obj_tptr;
  386. u_int tlen,lmp_obj_len,lmp_obj_ctype,obj_tlen;
  387. int hexdump;
  388. u_int offset;
  389. u_int link_type;
  390. union { /* int to float conversion buffer */
  391. float f;
  392. uint32_t i;
  393. } bw;
  394. tptr=pptr;
  395. lmp_com_header = (const struct lmp_common_header *)pptr;
  396. ND_TCHECK(*lmp_com_header);
  397. /*
  398. * Sanity checking of the header.
  399. */
  400. if (LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]) != LMP_VERSION) {
  401. ND_PRINT((ndo, "LMP version %u packet not supported",
  402. LMP_EXTRACT_VERSION(lmp_com_header->version_res[0])));
  403. return;
  404. }
  405. /* in non-verbose mode just lets print the basic Message Type*/
  406. if (ndo->ndo_vflag < 1) {
  407. ND_PRINT((ndo, "LMPv%u %s Message, length: %u",
  408. LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]),
  409. tok2str(lmp_msg_type_values, "unknown (%u)",lmp_com_header->msg_type),
  410. len));
  411. return;
  412. }
  413. /* ok they seem to want to know everything - lets fully decode it */
  414. tlen=EXTRACT_16BITS(lmp_com_header->length);
  415. ND_PRINT((ndo, "\n\tLMPv%u, msg-type: %s, Flags: [%s], length: %u",
  416. LMP_EXTRACT_VERSION(lmp_com_header->version_res[0]),
  417. tok2str(lmp_msg_type_values, "unknown, type: %u",lmp_com_header->msg_type),
  418. bittok2str(lmp_header_flag_values,"none",lmp_com_header->flags),
  419. tlen));
  420. if (tlen < sizeof(const struct lmp_common_header)) {
  421. ND_PRINT((ndo, " (too short)"));
  422. return;
  423. }
  424. if (tlen > len) {
  425. ND_PRINT((ndo, " (too long)"));
  426. tlen = len;
  427. }
  428. tptr+=sizeof(const struct lmp_common_header);
  429. tlen-=sizeof(const struct lmp_common_header);
  430. while(tlen>0) {
  431. /* did we capture enough for fully decoding the object header ? */
  432. ND_TCHECK2(*tptr, sizeof(struct lmp_object_header));
  433. lmp_obj_header = (const struct lmp_object_header *)tptr;
  434. lmp_obj_len=EXTRACT_16BITS(lmp_obj_header->length);
  435. lmp_obj_ctype=(lmp_obj_header->ctype)&0x7f;
  436. ND_PRINT((ndo, "\n\t %s Object (%u), Class-Type: %s (%u) Flags: [%snegotiable], length: %u",
  437. tok2str(lmp_obj_values,
  438. "Unknown",
  439. lmp_obj_header->class_num),
  440. lmp_obj_header->class_num,
  441. tok2str(lmp_ctype_values,
  442. "Unknown",
  443. ((lmp_obj_header->class_num)<<8)+lmp_obj_ctype),
  444. lmp_obj_ctype,
  445. (lmp_obj_header->ctype)&0x80 ? "" : "non-",
  446. lmp_obj_len));
  447. if (lmp_obj_len < 4) {
  448. ND_PRINT((ndo, " (too short)"));
  449. return;
  450. }
  451. if ((lmp_obj_len % 4) != 0) {
  452. ND_PRINT((ndo, " (not a multiple of 4)"));
  453. return;
  454. }
  455. obj_tptr=tptr+sizeof(struct lmp_object_header);
  456. obj_tlen=lmp_obj_len-sizeof(struct lmp_object_header);
  457. /* did we capture enough for fully decoding the object ? */
  458. ND_TCHECK2(*tptr, lmp_obj_len);
  459. hexdump=FALSE;
  460. switch(lmp_obj_header->class_num) {
  461. case LMP_OBJ_CC_ID:
  462. switch(lmp_obj_ctype) {
  463. case LMP_CTYPE_LOC:
  464. case LMP_CTYPE_RMT:
  465. if (obj_tlen != 4) {
  466. ND_PRINT((ndo, " (not correct for object)"));
  467. break;
  468. }
  469. ND_PRINT((ndo, "\n\t Control Channel ID: %u (0x%08x)",
  470. EXTRACT_32BITS(obj_tptr),
  471. EXTRACT_32BITS(obj_tptr)));
  472. break;
  473. default:
  474. hexdump=TRUE;
  475. }
  476. break;
  477. case LMP_OBJ_LINK_ID:
  478. case LMP_OBJ_INTERFACE_ID:
  479. switch(lmp_obj_ctype) {
  480. case LMP_CTYPE_IPV4_LOC:
  481. case LMP_CTYPE_IPV4_RMT:
  482. if (obj_tlen != 4) {
  483. ND_PRINT((ndo, " (not correct for object)"));
  484. break;
  485. }
  486. ND_PRINT((ndo, "\n\t IPv4 Link ID: %s (0x%08x)",
  487. ipaddr_string(ndo, obj_tptr),
  488. EXTRACT_32BITS(obj_tptr)));
  489. break;
  490. case LMP_CTYPE_IPV6_LOC:
  491. case LMP_CTYPE_IPV6_RMT:
  492. if (obj_tlen != 16) {
  493. ND_PRINT((ndo, " (not correct for object)"));
  494. break;
  495. }
  496. ND_PRINT((ndo, "\n\t IPv6 Link ID: %s (0x%08x)",
  497. ip6addr_string(ndo, obj_tptr),
  498. EXTRACT_32BITS(obj_tptr)));
  499. break;
  500. case LMP_CTYPE_UNMD_LOC:
  501. case LMP_CTYPE_UNMD_RMT:
  502. if (obj_tlen != 4) {
  503. ND_PRINT((ndo, " (not correct for object)"));
  504. break;
  505. }
  506. ND_PRINT((ndo, "\n\t Link ID: %u (0x%08x)",
  507. EXTRACT_32BITS(obj_tptr),
  508. EXTRACT_32BITS(obj_tptr)));
  509. break;
  510. default:
  511. hexdump=TRUE;
  512. }
  513. break;
  514. case LMP_OBJ_MESSAGE_ID:
  515. switch(lmp_obj_ctype) {
  516. case LMP_CTYPE_1:
  517. if (obj_tlen != 4) {
  518. ND_PRINT((ndo, " (not correct for object)"));
  519. break;
  520. }
  521. ND_PRINT((ndo, "\n\t Message ID: %u (0x%08x)",
  522. EXTRACT_32BITS(obj_tptr),
  523. EXTRACT_32BITS(obj_tptr)));
  524. break;
  525. case LMP_CTYPE_2:
  526. if (obj_tlen != 4) {
  527. ND_PRINT((ndo, " (not correct for object)"));
  528. break;
  529. }
  530. ND_PRINT((ndo, "\n\t Message ID Ack: %u (0x%08x)",
  531. EXTRACT_32BITS(obj_tptr),
  532. EXTRACT_32BITS(obj_tptr)));
  533. break;
  534. default:
  535. hexdump=TRUE;
  536. }
  537. break;
  538. case LMP_OBJ_NODE_ID:
  539. switch(lmp_obj_ctype) {
  540. case LMP_CTYPE_LOC:
  541. case LMP_CTYPE_RMT:
  542. if (obj_tlen != 4) {
  543. ND_PRINT((ndo, " (not correct for object)"));
  544. break;
  545. }
  546. ND_PRINT((ndo, "\n\t Node ID: %s (0x%08x)",
  547. ipaddr_string(ndo, obj_tptr),
  548. EXTRACT_32BITS(obj_tptr)));
  549. break;
  550. default:
  551. hexdump=TRUE;
  552. }
  553. break;
  554. case LMP_OBJ_CONFIG:
  555. switch(lmp_obj_ctype) {
  556. case LMP_CTYPE_HELLO_CONFIG:
  557. if (obj_tlen != 4) {
  558. ND_PRINT((ndo, " (not correct for object)"));
  559. break;
  560. }
  561. ND_PRINT((ndo, "\n\t Hello Interval: %u\n\t Hello Dead Interval: %u",
  562. EXTRACT_16BITS(obj_tptr),
  563. EXTRACT_16BITS(obj_tptr+2)));
  564. break;
  565. default:
  566. hexdump=TRUE;
  567. }
  568. break;
  569. case LMP_OBJ_HELLO:
  570. switch(lmp_obj_ctype) {
  571. case LMP_CTYPE_HELLO:
  572. if (obj_tlen != 8) {
  573. ND_PRINT((ndo, " (not correct for object)"));
  574. break;
  575. }
  576. ND_PRINT((ndo, "\n\t Tx Seq: %u, Rx Seq: %u",
  577. EXTRACT_32BITS(obj_tptr),
  578. EXTRACT_32BITS(obj_tptr+4)));
  579. break;
  580. default:
  581. hexdump=TRUE;
  582. }
  583. break;
  584. case LMP_OBJ_TE_LINK:
  585. switch(lmp_obj_ctype) {
  586. case LMP_CTYPE_IPV4:
  587. if (obj_tlen != 12) {
  588. ND_PRINT((ndo, " (not correct for object)"));
  589. break;
  590. }
  591. ND_PRINT((ndo, "\n\t Flags: [%s]",
  592. bittok2str(lmp_obj_te_link_flag_values,
  593. "none",
  594. EXTRACT_8BITS(obj_tptr))));
  595. ND_PRINT((ndo, "\n\t Local Link-ID: %s (0x%08x)"
  596. "\n\t Remote Link-ID: %s (0x%08x)",
  597. ipaddr_string(ndo, obj_tptr+4),
  598. EXTRACT_32BITS(obj_tptr+4),
  599. ipaddr_string(ndo, obj_tptr+8),
  600. EXTRACT_32BITS(obj_tptr+8)));
  601. break;
  602. case LMP_CTYPE_IPV6:
  603. if (obj_tlen != 36) {
  604. ND_PRINT((ndo, " (not correct for object)"));
  605. break;
  606. }
  607. ND_PRINT((ndo, "\n\t Flags: [%s]",
  608. bittok2str(lmp_obj_te_link_flag_values,
  609. "none",
  610. EXTRACT_8BITS(obj_tptr))));
  611. ND_PRINT((ndo, "\n\t Local Link-ID: %s (0x%08x)"
  612. "\n\t Remote Link-ID: %s (0x%08x)",
  613. ip6addr_string(ndo, obj_tptr+4),
  614. EXTRACT_32BITS(obj_tptr+4),
  615. ip6addr_string(ndo, obj_tptr+20),
  616. EXTRACT_32BITS(obj_tptr+20)));
  617. break;
  618. case LMP_CTYPE_UNMD:
  619. if (obj_tlen != 12) {
  620. ND_PRINT((ndo, " (not correct for object)"));
  621. break;
  622. }
  623. ND_PRINT((ndo, "\n\t Flags: [%s]",
  624. bittok2str(lmp_obj_te_link_flag_values,
  625. "none",
  626. EXTRACT_8BITS(obj_tptr))));
  627. ND_PRINT((ndo, "\n\t Local Link-ID: %u (0x%08x)"
  628. "\n\t Remote Link-ID: %u (0x%08x)",
  629. EXTRACT_32BITS(obj_tptr+4),
  630. EXTRACT_32BITS(obj_tptr+4),
  631. EXTRACT_32BITS(obj_tptr+8),
  632. EXTRACT_32BITS(obj_tptr+8)));
  633. break;
  634. default:
  635. hexdump=TRUE;
  636. }
  637. break;
  638. case LMP_OBJ_DATA_LINK:
  639. switch(lmp_obj_ctype) {
  640. case LMP_CTYPE_IPV4:
  641. if (obj_tlen < 12) {
  642. ND_PRINT((ndo, " (not correct for object)"));
  643. break;
  644. }
  645. ND_PRINT((ndo, "\n\t Flags: [%s]",
  646. bittok2str(lmp_obj_data_link_flag_values,
  647. "none",
  648. EXTRACT_8BITS(obj_tptr))));
  649. ND_PRINT((ndo, "\n\t Local Interface ID: %s (0x%08x)"
  650. "\n\t Remote Interface ID: %s (0x%08x)",
  651. ipaddr_string(ndo, obj_tptr+4),
  652. EXTRACT_32BITS(obj_tptr+4),
  653. ipaddr_string(ndo, obj_tptr+8),
  654. EXTRACT_32BITS(obj_tptr+8)));
  655. if (lmp_print_data_link_subobjs(ndo, obj_tptr, obj_tlen - 12, 12))
  656. hexdump=TRUE;
  657. break;
  658. case LMP_CTYPE_IPV6:
  659. if (obj_tlen < 36) {
  660. ND_PRINT((ndo, " (not correct for object)"));
  661. break;
  662. }
  663. ND_PRINT((ndo, "\n\t Flags: [%s]",
  664. bittok2str(lmp_obj_data_link_flag_values,
  665. "none",
  666. EXTRACT_8BITS(obj_tptr))));
  667. ND_PRINT((ndo, "\n\t Local Interface ID: %s (0x%08x)"
  668. "\n\t Remote Interface ID: %s (0x%08x)",
  669. ip6addr_string(ndo, obj_tptr+4),
  670. EXTRACT_32BITS(obj_tptr+4),
  671. ip6addr_string(ndo, obj_tptr+20),
  672. EXTRACT_32BITS(obj_tptr+20)));
  673. if (lmp_print_data_link_subobjs(ndo, obj_tptr, obj_tlen - 36, 36))
  674. hexdump=TRUE;
  675. break;
  676. case LMP_CTYPE_UNMD:
  677. if (obj_tlen < 12) {
  678. ND_PRINT((ndo, " (not correct for object)"));
  679. break;
  680. }
  681. ND_PRINT((ndo, "\n\t Flags: [%s]",
  682. bittok2str(lmp_obj_data_link_flag_values,
  683. "none",
  684. EXTRACT_8BITS(obj_tptr))));
  685. ND_PRINT((ndo, "\n\t Local Interface ID: %u (0x%08x)"
  686. "\n\t Remote Interface ID: %u (0x%08x)",
  687. EXTRACT_32BITS(obj_tptr+4),
  688. EXTRACT_32BITS(obj_tptr+4),
  689. EXTRACT_32BITS(obj_tptr+8),
  690. EXTRACT_32BITS(obj_tptr+8)));
  691. if (lmp_print_data_link_subobjs(ndo, obj_tptr, obj_tlen - 12, 12))
  692. hexdump=TRUE;
  693. break;
  694. default:
  695. hexdump=TRUE;
  696. }
  697. break;
  698. case LMP_OBJ_VERIFY_BEGIN:
  699. switch(lmp_obj_ctype) {
  700. case LMP_CTYPE_1:
  701. if (obj_tlen != 20) {
  702. ND_PRINT((ndo, " (not correct for object)"));
  703. break;
  704. }
  705. ND_PRINT((ndo, "\n\t Flags: %s",
  706. bittok2str(lmp_obj_begin_verify_flag_values,
  707. "none",
  708. EXTRACT_16BITS(obj_tptr))));
  709. ND_PRINT((ndo, "\n\t Verify Interval: %u",
  710. EXTRACT_16BITS(obj_tptr+2)));
  711. ND_PRINT((ndo, "\n\t Data links: %u",
  712. EXTRACT_32BITS(obj_tptr+4)));
  713. ND_PRINT((ndo, "\n\t Encoding type: %s",
  714. tok2str(gmpls_encoding_values, "Unknown", *(obj_tptr+8))));
  715. ND_PRINT((ndo, "\n\t Verify Transport Mechanism: %u (0x%x)%s",
  716. EXTRACT_16BITS(obj_tptr+10),
  717. EXTRACT_16BITS(obj_tptr+10),
  718. EXTRACT_16BITS(obj_tptr+10)&8000 ? " (Payload test messages capable)" : ""));
  719. bw.i = EXTRACT_32BITS(obj_tptr+12);
  720. ND_PRINT((ndo, "\n\t Transmission Rate: %.3f Mbps",bw.f*8/1000000));
  721. ND_PRINT((ndo, "\n\t Wavelength: %u",
  722. EXTRACT_32BITS(obj_tptr+16)));
  723. break;
  724. default:
  725. hexdump=TRUE;
  726. }
  727. break;
  728. case LMP_OBJ_VERIFY_BEGIN_ACK:
  729. switch(lmp_obj_ctype) {
  730. case LMP_CTYPE_1:
  731. if (obj_tlen != 4) {
  732. ND_PRINT((ndo, " (not correct for object)"));
  733. break;
  734. }
  735. ND_PRINT((ndo, "\n\t Verify Dead Interval: %u"
  736. "\n\t Verify Transport Response: %u",
  737. EXTRACT_16BITS(obj_tptr),
  738. EXTRACT_16BITS(obj_tptr+2)));
  739. break;
  740. default:
  741. hexdump=TRUE;
  742. }
  743. break;
  744. case LMP_OBJ_VERIFY_ID:
  745. switch(lmp_obj_ctype) {
  746. case LMP_CTYPE_1:
  747. if (obj_tlen != 4) {
  748. ND_PRINT((ndo, " (not correct for object)"));
  749. break;
  750. }
  751. ND_PRINT((ndo, "\n\t Verify ID: %u",
  752. EXTRACT_32BITS(obj_tptr)));
  753. break;
  754. default:
  755. hexdump=TRUE;
  756. }
  757. break;
  758. case LMP_OBJ_CHANNEL_STATUS:
  759. switch(lmp_obj_ctype) {
  760. case LMP_CTYPE_IPV4:
  761. offset = 0;
  762. /* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */
  763. while (offset+8 <= obj_tlen) {
  764. ND_PRINT((ndo, "\n\t Interface ID: %s (0x%08x)",
  765. ipaddr_string(ndo, obj_tptr+offset),
  766. EXTRACT_32BITS(obj_tptr+offset)));
  767. ND_PRINT((ndo, "\n\t\t Active: %s (%u)",
  768. (EXTRACT_32BITS(obj_tptr+offset+4)>>31) ?
  769. "Allocated" : "Non-allocated",
  770. (EXTRACT_32BITS(obj_tptr+offset+4)>>31)));
  771. ND_PRINT((ndo, "\n\t\t Direction: %s (%u)",
  772. (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1 ?
  773. "Transmit" : "Receive",
  774. (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1));
  775. ND_PRINT((ndo, "\n\t\t Channel Status: %s (%u)",
  776. tok2str(lmp_obj_channel_status_values,
  777. "Unknown",
  778. EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF),
  779. EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF));
  780. offset+=8;
  781. }
  782. break;
  783. case LMP_CTYPE_IPV6:
  784. offset = 0;
  785. /* Decode pairs: <Interface_ID (16 bytes), Channel_status (4 bytes)> */
  786. while (offset+20 <= obj_tlen) {
  787. ND_PRINT((ndo, "\n\t Interface ID: %s (0x%08x)",
  788. ip6addr_string(ndo, obj_tptr+offset),
  789. EXTRACT_32BITS(obj_tptr+offset)));
  790. ND_PRINT((ndo, "\n\t\t Active: %s (%u)",
  791. (EXTRACT_32BITS(obj_tptr+offset+16)>>31) ?
  792. "Allocated" : "Non-allocated",
  793. (EXTRACT_32BITS(obj_tptr+offset+16)>>31)));
  794. ND_PRINT((ndo, "\n\t\t Direction: %s (%u)",
  795. (EXTRACT_32BITS(obj_tptr+offset+16)>>30)&0x1 ?
  796. "Transmit" : "Receive",
  797. (EXTRACT_32BITS(obj_tptr+offset+16)>>30)&0x1));
  798. ND_PRINT((ndo, "\n\t\t Channel Status: %s (%u)",
  799. tok2str(lmp_obj_channel_status_values,
  800. "Unknown",
  801. EXTRACT_32BITS(obj_tptr+offset+16)&0x3FFFFFF),
  802. EXTRACT_32BITS(obj_tptr+offset+16)&0x3FFFFFF));
  803. offset+=20;
  804. }
  805. break;
  806. case LMP_CTYPE_UNMD:
  807. offset = 0;
  808. /* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */
  809. while (offset+8 <= obj_tlen) {
  810. ND_PRINT((ndo, "\n\t Interface ID: %u (0x%08x)",
  811. EXTRACT_32BITS(obj_tptr+offset),
  812. EXTRACT_32BITS(obj_tptr+offset)));
  813. ND_PRINT((ndo, "\n\t\t Active: %s (%u)",
  814. (EXTRACT_32BITS(obj_tptr+offset+4)>>31) ?
  815. "Allocated" : "Non-allocated",
  816. (EXTRACT_32BITS(obj_tptr+offset+4)>>31)));
  817. ND_PRINT((ndo, "\n\t\t Direction: %s (%u)",
  818. (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1 ?
  819. "Transmit" : "Receive",
  820. (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1));
  821. ND_PRINT((ndo, "\n\t\t Channel Status: %s (%u)",
  822. tok2str(lmp_obj_channel_status_values,
  823. "Unknown",
  824. EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF),
  825. EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF));
  826. offset+=8;
  827. }
  828. break;
  829. default:
  830. hexdump=TRUE;
  831. }
  832. break;
  833. case LMP_OBJ_CHANNEL_STATUS_REQ:
  834. switch(lmp_obj_ctype) {
  835. case LMP_CTYPE_IPV4:
  836. offset = 0;
  837. while (offset+4 <= obj_tlen) {
  838. ND_PRINT((ndo, "\n\t Interface ID: %s (0x%08x)",
  839. ipaddr_string(ndo, obj_tptr+offset),
  840. EXTRACT_32BITS(obj_tptr+offset)));
  841. offset+=4;
  842. }
  843. break;
  844. case LMP_CTYPE_IPV6:
  845. offset = 0;
  846. while (offset+16 <= obj_tlen) {
  847. ND_PRINT((ndo, "\n\t Interface ID: %s (0x%08x)",
  848. ip6addr_string(ndo, obj_tptr+offset),
  849. EXTRACT_32BITS(obj_tptr+offset)));
  850. offset+=16;
  851. }
  852. break;
  853. case LMP_CTYPE_UNMD:
  854. offset = 0;
  855. while (offset+4 <= obj_tlen) {
  856. ND_PRINT((ndo, "\n\t Interface ID: %u (0x%08x)",
  857. EXTRACT_32BITS(obj_tptr+offset),
  858. EXTRACT_32BITS(obj_tptr+offset)));
  859. offset+=4;
  860. }
  861. break;
  862. default:
  863. hexdump=TRUE;
  864. }
  865. break;
  866. case LMP_OBJ_ERROR_CODE:
  867. switch(lmp_obj_ctype) {
  868. case LMP_CTYPE_BEGIN_VERIFY_ERROR:
  869. if (obj_tlen != 4) {
  870. ND_PRINT((ndo, " (not correct for object)"));
  871. break;
  872. }
  873. ND_PRINT((ndo, "\n\t Error Code: %s",
  874. bittok2str(lmp_obj_begin_verify_error_values,
  875. "none",
  876. EXTRACT_32BITS(obj_tptr))));
  877. break;
  878. case LMP_CTYPE_LINK_SUMMARY_ERROR:
  879. if (obj_tlen != 4) {
  880. ND_PRINT((ndo, " (not correct for object)"));
  881. break;
  882. }
  883. ND_PRINT((ndo, "\n\t Error Code: %s",
  884. bittok2str(lmp_obj_link_summary_error_values,
  885. "none",
  886. EXTRACT_32BITS(obj_tptr))));
  887. break;
  888. default:
  889. hexdump=TRUE;
  890. }
  891. break;
  892. case LMP_OBJ_SERVICE_CONFIG:
  893. switch (lmp_obj_ctype) {
  894. case LMP_CTYPE_SERVICE_CONFIG_SP:
  895. if (obj_tlen != 4) {
  896. ND_PRINT((ndo, " (not correct for object)"));
  897. break;
  898. }
  899. ND_PRINT((ndo, "\n\t Flags: %s",
  900. bittok2str(lmp_obj_service_config_sp_flag_values,
  901. "none",
  902. EXTRACT_8BITS(obj_tptr))));
  903. ND_PRINT((ndo, "\n\t UNI Version: %u",
  904. EXTRACT_8BITS(obj_tptr+1)));
  905. break;
  906. case LMP_CTYPE_SERVICE_CONFIG_CPSA:
  907. if (obj_tlen != 16) {
  908. ND_PRINT((ndo, " (not correct for object)"));
  909. break;
  910. }
  911. link_type = EXTRACT_8BITS(obj_tptr);
  912. ND_PRINT((ndo, "\n\t Link Type: %s (%u)",
  913. tok2str(lmp_sd_service_config_cpsa_link_type_values,
  914. "Unknown", link_type),
  915. link_type));
  916. switch (link_type) {
  917. case LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH:
  918. ND_PRINT((ndo, "\n\t Signal Type: %s (%u)",
  919. tok2str(lmp_sd_service_config_cpsa_signal_type_sdh_values,
  920. "Unknown",
  921. EXTRACT_8BITS(obj_tptr+1)),
  922. EXTRACT_8BITS(obj_tptr+1)));
  923. break;
  924. case LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET:
  925. ND_PRINT((ndo, "\n\t Signal Type: %s (%u)",
  926. tok2str(lmp_sd_service_config_cpsa_signal_type_sonet_values,
  927. "Unknown",
  928. EXTRACT_8BITS(obj_tptr+1)),
  929. EXTRACT_8BITS(obj_tptr+1)));
  930. break;
  931. }
  932. ND_PRINT((ndo, "\n\t Transparency: %s",
  933. bittok2str(lmp_obj_service_config_cpsa_tp_flag_values,
  934. "none",
  935. EXTRACT_8BITS(obj_tptr+2))));
  936. ND_PRINT((ndo, "\n\t Contiguous Concatenation Types: %s",
  937. bittok2str(lmp_obj_service_config_cpsa_cct_flag_values,
  938. "none",
  939. EXTRACT_8BITS(obj_tptr+3))));
  940. ND_PRINT((ndo, "\n\t Minimum NCC: %u",
  941. EXTRACT_16BITS(obj_tptr+4)));
  942. ND_PRINT((ndo, "\n\t Maximum NCC: %u",
  943. EXTRACT_16BITS(obj_tptr+6)));
  944. ND_PRINT((ndo, "\n\t Minimum NVC:%u",
  945. EXTRACT_16BITS(obj_tptr+8)));
  946. ND_PRINT((ndo, "\n\t Maximum NVC:%u",
  947. EXTRACT_16BITS(obj_tptr+10)));
  948. ND_PRINT((ndo, "\n\t Local Interface ID: %s (0x%08x)",
  949. ipaddr_string(ndo, obj_tptr+12),
  950. EXTRACT_32BITS(obj_tptr+12)));
  951. break;
  952. case LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM:
  953. if (obj_tlen != 8) {
  954. ND_PRINT((ndo, " (not correct for object)"));
  955. break;
  956. }
  957. ND_PRINT((ndo, "\n\t Transparency Flags: %s",
  958. bittok2str(
  959. lmp_obj_service_config_nsa_transparency_flag_values,
  960. "none",
  961. EXTRACT_32BITS(obj_tptr))));
  962. ND_PRINT((ndo, "\n\t TCM Monitoring Flags: %s",
  963. bittok2str(
  964. lmp_obj_service_config_nsa_tcm_flag_values,
  965. "none",
  966. EXTRACT_8BITS(obj_tptr+7))));
  967. break;
  968. case LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY:
  969. if (obj_tlen != 4) {
  970. ND_PRINT((ndo, " (not correct for object)"));
  971. break;
  972. }
  973. ND_PRINT((ndo, "\n\t Diversity: Flags: %s",
  974. bittok2str(
  975. lmp_obj_service_config_nsa_network_diversity_flag_values,
  976. "none",
  977. EXTRACT_8BITS(obj_tptr+3))));
  978. break;
  979. default:
  980. hexdump = TRUE;
  981. }
  982. break;
  983. default:
  984. if (ndo->ndo_vflag <= 1)
  985. print_unknown_data(ndo,obj_tptr,"\n\t ",obj_tlen);
  986. break;
  987. }
  988. /* do we want to see an additionally hexdump ? */
  989. if (ndo->ndo_vflag > 1 || hexdump==TRUE)
  990. print_unknown_data(ndo,tptr+sizeof(struct lmp_object_header),"\n\t ",
  991. lmp_obj_len-sizeof(struct lmp_object_header));
  992. tptr+=lmp_obj_len;
  993. tlen-=lmp_obj_len;
  994. }
  995. return;
  996. trunc:
  997. ND_PRINT((ndo, "\n\t\t packet exceeded snapshot"));
  998. }
  999. /*
  1000. * Local Variables:
  1001. * c-style: whitesmith
  1002. * c-basic-offset: 8
  1003. * End:
  1004. */