print-rsvp.c 79 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990
  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. * Original code by Hannes Gredler (hannes@gredler.at)
  16. */
  17. /* \summary: Resource ReSerVation Protocol (RSVP) printer */
  18. #ifdef HAVE_CONFIG_H
  19. #include "config.h"
  20. #endif
  21. #include <netdissect-stdinc.h>
  22. #include "netdissect.h"
  23. #include "extract.h"
  24. #include "addrtoname.h"
  25. #include "ethertype.h"
  26. #include "gmpls.h"
  27. #include "af.h"
  28. #include "signature.h"
  29. static const char tstr[] = " [|rsvp]";
  30. /*
  31. * RFC 2205 common header
  32. *
  33. * 0 1 2 3
  34. * +-------------+-------------+-------------+-------------+
  35. * | Vers | Flags| Msg Type | RSVP Checksum |
  36. * +-------------+-------------+-------------+-------------+
  37. * | Send_TTL | (Reserved) | RSVP Length |
  38. * +-------------+-------------+-------------+-------------+
  39. *
  40. */
  41. struct rsvp_common_header {
  42. uint8_t version_flags;
  43. uint8_t msg_type;
  44. uint8_t checksum[2];
  45. uint8_t ttl;
  46. uint8_t reserved;
  47. uint8_t length[2];
  48. };
  49. /*
  50. * RFC2205 object header
  51. *
  52. *
  53. * 0 1 2 3
  54. * +-------------+-------------+-------------+-------------+
  55. * | Length (bytes) | Class-Num | C-Type |
  56. * +-------------+-------------+-------------+-------------+
  57. * | |
  58. * // (Object contents) //
  59. * | |
  60. * +-------------+-------------+-------------+-------------+
  61. */
  62. struct rsvp_object_header {
  63. uint8_t length[2];
  64. uint8_t class_num;
  65. uint8_t ctype;
  66. };
  67. #define RSVP_VERSION 1
  68. #define RSVP_EXTRACT_VERSION(x) (((x)&0xf0)>>4)
  69. #define RSVP_EXTRACT_FLAGS(x) ((x)&0x0f)
  70. #define RSVP_MSGTYPE_PATH 1
  71. #define RSVP_MSGTYPE_RESV 2
  72. #define RSVP_MSGTYPE_PATHERR 3
  73. #define RSVP_MSGTYPE_RESVERR 4
  74. #define RSVP_MSGTYPE_PATHTEAR 5
  75. #define RSVP_MSGTYPE_RESVTEAR 6
  76. #define RSVP_MSGTYPE_RESVCONF 7
  77. #define RSVP_MSGTYPE_BUNDLE 12
  78. #define RSVP_MSGTYPE_ACK 13
  79. #define RSVP_MSGTYPE_HELLO_OLD 14 /* ancient Hellos */
  80. #define RSVP_MSGTYPE_SREFRESH 15
  81. #define RSVP_MSGTYPE_HELLO 20
  82. static const struct tok rsvp_msg_type_values[] = {
  83. { RSVP_MSGTYPE_PATH, "Path" },
  84. { RSVP_MSGTYPE_RESV, "Resv" },
  85. { RSVP_MSGTYPE_PATHERR, "PathErr" },
  86. { RSVP_MSGTYPE_RESVERR, "ResvErr" },
  87. { RSVP_MSGTYPE_PATHTEAR, "PathTear" },
  88. { RSVP_MSGTYPE_RESVTEAR, "ResvTear" },
  89. { RSVP_MSGTYPE_RESVCONF, "ResvConf" },
  90. { RSVP_MSGTYPE_BUNDLE, "Bundle" },
  91. { RSVP_MSGTYPE_ACK, "Acknowledgement" },
  92. { RSVP_MSGTYPE_HELLO_OLD, "Hello (Old)" },
  93. { RSVP_MSGTYPE_SREFRESH, "Refresh" },
  94. { RSVP_MSGTYPE_HELLO, "Hello" },
  95. { 0, NULL}
  96. };
  97. static const struct tok rsvp_header_flag_values[] = {
  98. { 0x01, "Refresh reduction capable" }, /* rfc2961 */
  99. { 0, NULL}
  100. };
  101. #define RSVP_OBJ_SESSION 1 /* rfc2205 */
  102. #define RSVP_OBJ_RSVP_HOP 3 /* rfc2205, rfc3473 */
  103. #define RSVP_OBJ_INTEGRITY 4 /* rfc2747 */
  104. #define RSVP_OBJ_TIME_VALUES 5 /* rfc2205 */
  105. #define RSVP_OBJ_ERROR_SPEC 6
  106. #define RSVP_OBJ_SCOPE 7
  107. #define RSVP_OBJ_STYLE 8 /* rfc2205 */
  108. #define RSVP_OBJ_FLOWSPEC 9 /* rfc2215 */
  109. #define RSVP_OBJ_FILTERSPEC 10 /* rfc2215 */
  110. #define RSVP_OBJ_SENDER_TEMPLATE 11
  111. #define RSVP_OBJ_SENDER_TSPEC 12 /* rfc2215 */
  112. #define RSVP_OBJ_ADSPEC 13 /* rfc2215 */
  113. #define RSVP_OBJ_POLICY_DATA 14
  114. #define RSVP_OBJ_CONFIRM 15 /* rfc2205 */
  115. #define RSVP_OBJ_LABEL 16 /* rfc3209 */
  116. #define RSVP_OBJ_LABEL_REQ 19 /* rfc3209 */
  117. #define RSVP_OBJ_ERO 20 /* rfc3209 */
  118. #define RSVP_OBJ_RRO 21 /* rfc3209 */
  119. #define RSVP_OBJ_HELLO 22 /* rfc3209 */
  120. #define RSVP_OBJ_MESSAGE_ID 23 /* rfc2961 */
  121. #define RSVP_OBJ_MESSAGE_ID_ACK 24 /* rfc2961 */
  122. #define RSVP_OBJ_MESSAGE_ID_LIST 25 /* rfc2961 */
  123. #define RSVP_OBJ_RECOVERY_LABEL 34 /* rfc3473 */
  124. #define RSVP_OBJ_UPSTREAM_LABEL 35 /* rfc3473 */
  125. #define RSVP_OBJ_LABEL_SET 36 /* rfc3473 */
  126. #define RSVP_OBJ_PROTECTION 37 /* rfc3473 */
  127. #define RSVP_OBJ_S2L 50 /* rfc4875 */
  128. #define RSVP_OBJ_DETOUR 63 /* draft-ietf-mpls-rsvp-lsp-fastreroute-07 */
  129. #define RSVP_OBJ_CLASSTYPE 66 /* rfc4124 */
  130. #define RSVP_OBJ_CLASSTYPE_OLD 125 /* draft-ietf-tewg-diff-te-proto-07 */
  131. #define RSVP_OBJ_SUGGESTED_LABEL 129 /* rfc3473 */
  132. #define RSVP_OBJ_ACCEPT_LABEL_SET 130 /* rfc3473 */
  133. #define RSVP_OBJ_RESTART_CAPABILITY 131 /* rfc3473 */
  134. #define RSVP_OBJ_NOTIFY_REQ 195 /* rfc3473 */
  135. #define RSVP_OBJ_ADMIN_STATUS 196 /* rfc3473 */
  136. #define RSVP_OBJ_PROPERTIES 204 /* juniper proprietary */
  137. #define RSVP_OBJ_FASTREROUTE 205 /* draft-ietf-mpls-rsvp-lsp-fastreroute-07 */
  138. #define RSVP_OBJ_SESSION_ATTRIBUTE 207 /* rfc3209 */
  139. #define RSVP_OBJ_GENERALIZED_UNI 229 /* OIF RSVP extensions UNI 1.0 Signaling, Rel. 2 */
  140. #define RSVP_OBJ_CALL_ID 230 /* rfc3474 */
  141. #define RSVP_OBJ_CALL_OPS 236 /* rfc3474 */
  142. static const struct tok rsvp_obj_values[] = {
  143. { RSVP_OBJ_SESSION, "Session" },
  144. { RSVP_OBJ_RSVP_HOP, "RSVP Hop" },
  145. { RSVP_OBJ_INTEGRITY, "Integrity" },
  146. { RSVP_OBJ_TIME_VALUES, "Time Values" },
  147. { RSVP_OBJ_ERROR_SPEC, "Error Spec" },
  148. { RSVP_OBJ_SCOPE, "Scope" },
  149. { RSVP_OBJ_STYLE, "Style" },
  150. { RSVP_OBJ_FLOWSPEC, "Flowspec" },
  151. { RSVP_OBJ_FILTERSPEC, "FilterSpec" },
  152. { RSVP_OBJ_SENDER_TEMPLATE, "Sender Template" },
  153. { RSVP_OBJ_SENDER_TSPEC, "Sender TSpec" },
  154. { RSVP_OBJ_ADSPEC, "Adspec" },
  155. { RSVP_OBJ_POLICY_DATA, "Policy Data" },
  156. { RSVP_OBJ_CONFIRM, "Confirm" },
  157. { RSVP_OBJ_LABEL, "Label" },
  158. { RSVP_OBJ_LABEL_REQ, "Label Request" },
  159. { RSVP_OBJ_ERO, "ERO" },
  160. { RSVP_OBJ_RRO, "RRO" },
  161. { RSVP_OBJ_HELLO, "Hello" },
  162. { RSVP_OBJ_MESSAGE_ID, "Message ID" },
  163. { RSVP_OBJ_MESSAGE_ID_ACK, "Message ID Ack" },
  164. { RSVP_OBJ_MESSAGE_ID_LIST, "Message ID List" },
  165. { RSVP_OBJ_RECOVERY_LABEL, "Recovery Label" },
  166. { RSVP_OBJ_UPSTREAM_LABEL, "Upstream Label" },
  167. { RSVP_OBJ_LABEL_SET, "Label Set" },
  168. { RSVP_OBJ_ACCEPT_LABEL_SET, "Acceptable Label Set" },
  169. { RSVP_OBJ_DETOUR, "Detour" },
  170. { RSVP_OBJ_CLASSTYPE, "Class Type" },
  171. { RSVP_OBJ_CLASSTYPE_OLD, "Class Type (old)" },
  172. { RSVP_OBJ_SUGGESTED_LABEL, "Suggested Label" },
  173. { RSVP_OBJ_PROPERTIES, "Properties" },
  174. { RSVP_OBJ_FASTREROUTE, "Fast Re-Route" },
  175. { RSVP_OBJ_SESSION_ATTRIBUTE, "Session Attribute" },
  176. { RSVP_OBJ_GENERALIZED_UNI, "Generalized UNI" },
  177. { RSVP_OBJ_CALL_ID, "Call-ID" },
  178. { RSVP_OBJ_CALL_OPS, "Call Capability" },
  179. { RSVP_OBJ_RESTART_CAPABILITY, "Restart Capability" },
  180. { RSVP_OBJ_NOTIFY_REQ, "Notify Request" },
  181. { RSVP_OBJ_PROTECTION, "Protection" },
  182. { RSVP_OBJ_ADMIN_STATUS, "Administrative Status" },
  183. { RSVP_OBJ_S2L, "Sub-LSP to LSP" },
  184. { 0, NULL}
  185. };
  186. #define RSVP_CTYPE_IPV4 1
  187. #define RSVP_CTYPE_IPV6 2
  188. #define RSVP_CTYPE_TUNNEL_IPV4 7
  189. #define RSVP_CTYPE_TUNNEL_IPV6 8
  190. #define RSVP_CTYPE_UNI_IPV4 11 /* OIF RSVP extensions UNI 1.0 Signaling Rel. 2 */
  191. #define RSVP_CTYPE_1 1
  192. #define RSVP_CTYPE_2 2
  193. #define RSVP_CTYPE_3 3
  194. #define RSVP_CTYPE_4 4
  195. #define RSVP_CTYPE_12 12
  196. #define RSVP_CTYPE_13 13
  197. #define RSVP_CTYPE_14 14
  198. /*
  199. * the ctypes are not globally unique so for
  200. * translating it to strings we build a table based
  201. * on objects offsetted by the ctype
  202. */
  203. static const struct tok rsvp_ctype_values[] = {
  204. { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV4, "IPv4" },
  205. { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_IPV6, "IPv6" },
  206. { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_3, "IPv4 plus opt. TLVs" },
  207. { 256*RSVP_OBJ_RSVP_HOP+RSVP_CTYPE_4, "IPv6 plus opt. TLVs" },
  208. { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV4, "IPv4" },
  209. { 256*RSVP_OBJ_NOTIFY_REQ+RSVP_CTYPE_IPV6, "IPv6" },
  210. { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV4, "IPv4" },
  211. { 256*RSVP_OBJ_CONFIRM+RSVP_CTYPE_IPV6, "IPv6" },
  212. { 256*RSVP_OBJ_TIME_VALUES+RSVP_CTYPE_1, "1" },
  213. { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_1, "obsolete" },
  214. { 256*RSVP_OBJ_FLOWSPEC+RSVP_CTYPE_2, "IntServ" },
  215. { 256*RSVP_OBJ_SENDER_TSPEC+RSVP_CTYPE_2, "IntServ" },
  216. { 256*RSVP_OBJ_ADSPEC+RSVP_CTYPE_2, "IntServ" },
  217. { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV4, "IPv4" },
  218. { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_IPV6, "IPv6" },
  219. { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_3, "IPv6 Flow-label" },
  220. { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
  221. { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_12, "IPv4 P2MP LSP Tunnel" },
  222. { 256*RSVP_OBJ_FILTERSPEC+RSVP_CTYPE_13, "IPv6 P2MP LSP Tunnel" },
  223. { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV4, "IPv4" },
  224. { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_IPV6, "IPv6" },
  225. { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
  226. { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_UNI_IPV4, "UNI IPv4" },
  227. { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_13, "IPv4 P2MP LSP Tunnel" },
  228. { 256*RSVP_OBJ_SESSION+RSVP_CTYPE_14, "IPv6 P2MP LSP Tunnel" },
  229. { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV4, "IPv4" },
  230. { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_IPV6, "IPv6" },
  231. { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
  232. { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_12, "IPv4 P2MP LSP Tunnel" },
  233. { 256*RSVP_OBJ_SENDER_TEMPLATE+RSVP_CTYPE_13, "IPv6 P2MP LSP Tunnel" },
  234. { 256*RSVP_OBJ_MESSAGE_ID+RSVP_CTYPE_1, "1" },
  235. { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_1, "Message id ack" },
  236. { 256*RSVP_OBJ_MESSAGE_ID_ACK+RSVP_CTYPE_2, "Message id nack" },
  237. { 256*RSVP_OBJ_MESSAGE_ID_LIST+RSVP_CTYPE_1, "1" },
  238. { 256*RSVP_OBJ_STYLE+RSVP_CTYPE_1, "1" },
  239. { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_1, "Hello Request" },
  240. { 256*RSVP_OBJ_HELLO+RSVP_CTYPE_2, "Hello Ack" },
  241. { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_1, "without label range" },
  242. { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_2, "with ATM label range" },
  243. { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_3, "with FR label range" },
  244. { 256*RSVP_OBJ_LABEL_REQ+RSVP_CTYPE_4, "Generalized Label" },
  245. { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_1, "Label" },
  246. { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_2, "Generalized Label" },
  247. { 256*RSVP_OBJ_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
  248. { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_1, "Label" },
  249. { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_2, "Generalized Label" },
  250. { 256*RSVP_OBJ_SUGGESTED_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
  251. { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_1, "Label" },
  252. { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_2, "Generalized Label" },
  253. { 256*RSVP_OBJ_UPSTREAM_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
  254. { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_1, "Label" },
  255. { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_2, "Generalized Label" },
  256. { 256*RSVP_OBJ_RECOVERY_LABEL+RSVP_CTYPE_3, "Waveband Switching" },
  257. { 256*RSVP_OBJ_ERO+RSVP_CTYPE_IPV4, "IPv4" },
  258. { 256*RSVP_OBJ_RRO+RSVP_CTYPE_IPV4, "IPv4" },
  259. { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV4, "IPv4" },
  260. { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_IPV6, "IPv6" },
  261. { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_3, "IPv4 plus opt. TLVs" },
  262. { 256*RSVP_OBJ_ERROR_SPEC+RSVP_CTYPE_4, "IPv6 plus opt. TLVs" },
  263. { 256*RSVP_OBJ_RESTART_CAPABILITY+RSVP_CTYPE_1, "IPv4" },
  264. { 256*RSVP_OBJ_SESSION_ATTRIBUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
  265. { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" }, /* old style*/
  266. { 256*RSVP_OBJ_FASTREROUTE+RSVP_CTYPE_1, "1" }, /* new style */
  267. { 256*RSVP_OBJ_DETOUR+RSVP_CTYPE_TUNNEL_IPV4, "Tunnel IPv4" },
  268. { 256*RSVP_OBJ_PROPERTIES+RSVP_CTYPE_1, "1" },
  269. { 256*RSVP_OBJ_ADMIN_STATUS+RSVP_CTYPE_1, "1" },
  270. { 256*RSVP_OBJ_CLASSTYPE+RSVP_CTYPE_1, "1" },
  271. { 256*RSVP_OBJ_CLASSTYPE_OLD+RSVP_CTYPE_1, "1" },
  272. { 256*RSVP_OBJ_LABEL_SET+RSVP_CTYPE_1, "1" },
  273. { 256*RSVP_OBJ_GENERALIZED_UNI+RSVP_CTYPE_1, "1" },
  274. { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV4, "IPv4 sub-LSP" },
  275. { 256*RSVP_OBJ_S2L+RSVP_CTYPE_IPV6, "IPv6 sub-LSP" },
  276. { 0, NULL}
  277. };
  278. struct rsvp_obj_integrity_t {
  279. uint8_t flags;
  280. uint8_t res;
  281. uint8_t key_id[6];
  282. uint8_t sequence[8];
  283. uint8_t digest[16];
  284. };
  285. static const struct tok rsvp_obj_integrity_flag_values[] = {
  286. { 0x80, "Handshake" },
  287. { 0, NULL}
  288. };
  289. struct rsvp_obj_frr_t {
  290. uint8_t setup_prio;
  291. uint8_t hold_prio;
  292. uint8_t hop_limit;
  293. uint8_t flags;
  294. uint8_t bandwidth[4];
  295. uint8_t include_any[4];
  296. uint8_t exclude_any[4];
  297. uint8_t include_all[4];
  298. };
  299. #define RSVP_OBJ_XRO_MASK_SUBOBJ(x) ((x)&0x7f)
  300. #define RSVP_OBJ_XRO_MASK_LOOSE(x) ((x)&0x80)
  301. #define RSVP_OBJ_XRO_RES 0
  302. #define RSVP_OBJ_XRO_IPV4 1
  303. #define RSVP_OBJ_XRO_IPV6 2
  304. #define RSVP_OBJ_XRO_LABEL 3
  305. #define RSVP_OBJ_XRO_ASN 32
  306. #define RSVP_OBJ_XRO_MPLS 64
  307. static const struct tok rsvp_obj_xro_values[] = {
  308. { RSVP_OBJ_XRO_RES, "Reserved" },
  309. { RSVP_OBJ_XRO_IPV4, "IPv4 prefix" },
  310. { RSVP_OBJ_XRO_IPV6, "IPv6 prefix" },
  311. { RSVP_OBJ_XRO_LABEL, "Label" },
  312. { RSVP_OBJ_XRO_ASN, "Autonomous system number" },
  313. { RSVP_OBJ_XRO_MPLS, "MPLS label switched path termination" },
  314. { 0, NULL}
  315. };
  316. /* draft-ietf-mpls-rsvp-lsp-fastreroute-07.txt */
  317. static const struct tok rsvp_obj_rro_flag_values[] = {
  318. { 0x01, "Local protection available" },
  319. { 0x02, "Local protection in use" },
  320. { 0x04, "Bandwidth protection" },
  321. { 0x08, "Node protection" },
  322. { 0, NULL}
  323. };
  324. /* RFC3209 */
  325. static const struct tok rsvp_obj_rro_label_flag_values[] = {
  326. { 0x01, "Global" },
  327. { 0, NULL}
  328. };
  329. static const struct tok rsvp_resstyle_values[] = {
  330. { 17, "Wildcard Filter" },
  331. { 10, "Fixed Filter" },
  332. { 18, "Shared Explicit" },
  333. { 0, NULL}
  334. };
  335. #define RSVP_OBJ_INTSERV_GUARANTEED_SERV 2
  336. #define RSVP_OBJ_INTSERV_CONTROLLED_LOAD 5
  337. static const struct tok rsvp_intserv_service_type_values[] = {
  338. { 1, "Default/Global Information" },
  339. { RSVP_OBJ_INTSERV_GUARANTEED_SERV, "Guaranteed Service" },
  340. { RSVP_OBJ_INTSERV_CONTROLLED_LOAD, "Controlled Load" },
  341. { 0, NULL}
  342. };
  343. static const struct tok rsvp_intserv_parameter_id_values[] = {
  344. { 4, "IS hop cnt" },
  345. { 6, "Path b/w estimate" },
  346. { 8, "Minimum path latency" },
  347. { 10, "Composed MTU" },
  348. { 127, "Token Bucket TSpec" },
  349. { 130, "Guaranteed Service RSpec" },
  350. { 133, "End-to-end composed value for C" },
  351. { 134, "End-to-end composed value for D" },
  352. { 135, "Since-last-reshaping point composed C" },
  353. { 136, "Since-last-reshaping point composed D" },
  354. { 0, NULL}
  355. };
  356. static const struct tok rsvp_session_attribute_flag_values[] = {
  357. { 0x01, "Local Protection" },
  358. { 0x02, "Label Recording" },
  359. { 0x04, "SE Style" },
  360. { 0x08, "Bandwidth protection" }, /* RFC4090 */
  361. { 0x10, "Node protection" }, /* RFC4090 */
  362. { 0, NULL}
  363. };
  364. static const struct tok rsvp_obj_prop_tlv_values[] = {
  365. { 0x01, "Cos" },
  366. { 0x02, "Metric 1" },
  367. { 0x04, "Metric 2" },
  368. { 0x08, "CCC Status" },
  369. { 0x10, "Path Type" },
  370. { 0, NULL}
  371. };
  372. #define RSVP_OBJ_ERROR_SPEC_CODE_ROUTING 24
  373. #define RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY 25
  374. #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE 28
  375. #define RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD 125
  376. static const struct tok rsvp_obj_error_code_values[] = {
  377. { RSVP_OBJ_ERROR_SPEC_CODE_ROUTING, "Routing Problem" },
  378. { RSVP_OBJ_ERROR_SPEC_CODE_NOTIFY, "Notify Error" },
  379. { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE, "Diffserv TE Error" },
  380. { RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD, "Diffserv TE Error (Old)" },
  381. { 0, NULL}
  382. };
  383. static const struct tok rsvp_obj_error_code_routing_values[] = {
  384. { 1, "Bad EXPLICIT_ROUTE object" },
  385. { 2, "Bad strict node" },
  386. { 3, "Bad loose node" },
  387. { 4, "Bad initial subobject" },
  388. { 5, "No route available toward destination" },
  389. { 6, "Unacceptable label value" },
  390. { 7, "RRO indicated routing loops" },
  391. { 8, "non-RSVP-capable router in the path" },
  392. { 9, "MPLS label allocation failure" },
  393. { 10, "Unsupported L3PID" },
  394. { 0, NULL}
  395. };
  396. static const struct tok rsvp_obj_error_code_diffserv_te_values[] = {
  397. { 1, "Unexpected CT object" },
  398. { 2, "Unsupported CT" },
  399. { 3, "Invalid CT value" },
  400. { 4, "CT/setup priority do not form a configured TE-Class" },
  401. { 5, "CT/holding priority do not form a configured TE-Class" },
  402. { 6, "CT/setup priority and CT/holding priority do not form a configured TE-Class" },
  403. { 7, "Inconsistency between signaled PSC and signaled CT" },
  404. { 8, "Inconsistency between signaled PHBs and signaled CT" },
  405. { 0, NULL}
  406. };
  407. /* rfc3473 / rfc 3471 */
  408. static const struct tok rsvp_obj_admin_status_flag_values[] = {
  409. { 0x80000000, "Reflect" },
  410. { 0x00000004, "Testing" },
  411. { 0x00000002, "Admin-down" },
  412. { 0x00000001, "Delete-in-progress" },
  413. { 0, NULL}
  414. };
  415. /* label set actions - rfc3471 */
  416. #define LABEL_SET_INCLUSIVE_LIST 0
  417. #define LABEL_SET_EXCLUSIVE_LIST 1
  418. #define LABEL_SET_INCLUSIVE_RANGE 2
  419. #define LABEL_SET_EXCLUSIVE_RANGE 3
  420. static const struct tok rsvp_obj_label_set_action_values[] = {
  421. { LABEL_SET_INCLUSIVE_LIST, "Inclusive list" },
  422. { LABEL_SET_EXCLUSIVE_LIST, "Exclusive list" },
  423. { LABEL_SET_INCLUSIVE_RANGE, "Inclusive range" },
  424. { LABEL_SET_EXCLUSIVE_RANGE, "Exclusive range" },
  425. { 0, NULL}
  426. };
  427. /* OIF RSVP extensions UNI 1.0 Signaling, release 2 */
  428. #define RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS 1
  429. #define RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS 2
  430. #define RSVP_GEN_UNI_SUBOBJ_DIVERSITY 3
  431. #define RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL 4
  432. #define RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL 5
  433. static const struct tok rsvp_obj_generalized_uni_values[] = {
  434. { RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS, "Source TNA address" },
  435. { RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS, "Destination TNA address" },
  436. { RSVP_GEN_UNI_SUBOBJ_DIVERSITY, "Diversity" },
  437. { RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL, "Egress label" },
  438. { RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL, "Service level" },
  439. { 0, NULL}
  440. };
  441. /*
  442. * this is a dissector for all the intserv defined
  443. * specs as defined per rfc2215
  444. * it is called from various rsvp objects;
  445. * returns the amount of bytes being processed
  446. */
  447. static int
  448. rsvp_intserv_print(netdissect_options *ndo,
  449. const u_char *tptr, u_short obj_tlen)
  450. {
  451. int parameter_id,parameter_length;
  452. union {
  453. float f;
  454. uint32_t i;
  455. } bw;
  456. if (obj_tlen < 4)
  457. return 0;
  458. parameter_id = *(tptr);
  459. ND_TCHECK2(*(tptr + 2), 2);
  460. parameter_length = EXTRACT_16BITS(tptr+2)<<2; /* convert wordcount to bytecount */
  461. ND_PRINT((ndo, "\n\t Parameter ID: %s (%u), length: %u, Flags: [0x%02x]",
  462. tok2str(rsvp_intserv_parameter_id_values,"unknown",parameter_id),
  463. parameter_id,
  464. parameter_length,
  465. *(tptr + 1)));
  466. if (obj_tlen < parameter_length+4)
  467. return 0;
  468. switch(parameter_id) { /* parameter_id */
  469. case 4:
  470. /*
  471. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  472. * | 4 (e) | (f) | 1 (g) |
  473. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  474. * | IS hop cnt (32-bit unsigned integer) |
  475. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  476. */
  477. if (parameter_length == 4) {
  478. ND_TCHECK2(*(tptr + 4), 4);
  479. ND_PRINT((ndo, "\n\t\tIS hop count: %u", EXTRACT_32BITS(tptr + 4)));
  480. }
  481. break;
  482. case 6:
  483. /*
  484. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  485. * | 6 (h) | (i) | 1 (j) |
  486. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  487. * | Path b/w estimate (32-bit IEEE floating point number) |
  488. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  489. */
  490. if (parameter_length == 4) {
  491. ND_TCHECK2(*(tptr + 4), 4);
  492. bw.i = EXTRACT_32BITS(tptr+4);
  493. ND_PRINT((ndo, "\n\t\tPath b/w estimate: %.10g Mbps", bw.f / 125000));
  494. }
  495. break;
  496. case 8:
  497. /*
  498. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  499. * | 8 (k) | (l) | 1 (m) |
  500. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  501. * | Minimum path latency (32-bit integer) |
  502. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  503. */
  504. if (parameter_length == 4) {
  505. ND_TCHECK2(*(tptr + 4), 4);
  506. ND_PRINT((ndo, "\n\t\tMinimum path latency: "));
  507. if (EXTRACT_32BITS(tptr+4) == 0xffffffff)
  508. ND_PRINT((ndo, "don't care"));
  509. else
  510. ND_PRINT((ndo, "%u", EXTRACT_32BITS(tptr + 4)));
  511. }
  512. break;
  513. case 10:
  514. /*
  515. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  516. * | 10 (n) | (o) | 1 (p) |
  517. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  518. * | Composed MTU (32-bit unsigned integer) |
  519. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  520. */
  521. if (parameter_length == 4) {
  522. ND_TCHECK2(*(tptr + 4), 4);
  523. ND_PRINT((ndo, "\n\t\tComposed MTU: %u bytes", EXTRACT_32BITS(tptr + 4)));
  524. }
  525. break;
  526. case 127:
  527. /*
  528. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  529. * | 127 (e) | 0 (f) | 5 (g) |
  530. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  531. * | Token Bucket Rate [r] (32-bit IEEE floating point number) |
  532. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  533. * | Token Bucket Size [b] (32-bit IEEE floating point number) |
  534. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  535. * | Peak Data Rate [p] (32-bit IEEE floating point number) |
  536. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  537. * | Minimum Policed Unit [m] (32-bit integer) |
  538. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  539. * | Maximum Packet Size [M] (32-bit integer) |
  540. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  541. */
  542. if (parameter_length == 20) {
  543. ND_TCHECK2(*(tptr + 4), 20);
  544. bw.i = EXTRACT_32BITS(tptr+4);
  545. ND_PRINT((ndo, "\n\t\tToken Bucket Rate: %.10g Mbps", bw.f / 125000));
  546. bw.i = EXTRACT_32BITS(tptr+8);
  547. ND_PRINT((ndo, "\n\t\tToken Bucket Size: %.10g bytes", bw.f));
  548. bw.i = EXTRACT_32BITS(tptr+12);
  549. ND_PRINT((ndo, "\n\t\tPeak Data Rate: %.10g Mbps", bw.f / 125000));
  550. ND_PRINT((ndo, "\n\t\tMinimum Policed Unit: %u bytes", EXTRACT_32BITS(tptr + 16)));
  551. ND_PRINT((ndo, "\n\t\tMaximum Packet Size: %u bytes", EXTRACT_32BITS(tptr + 20)));
  552. }
  553. break;
  554. case 130:
  555. /*
  556. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  557. * | 130 (h) | 0 (i) | 2 (j) |
  558. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  559. * | Rate [R] (32-bit IEEE floating point number) |
  560. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  561. * | Slack Term [S] (32-bit integer) |
  562. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  563. */
  564. if (parameter_length == 8) {
  565. ND_TCHECK2(*(tptr + 4), 8);
  566. bw.i = EXTRACT_32BITS(tptr+4);
  567. ND_PRINT((ndo, "\n\t\tRate: %.10g Mbps", bw.f / 125000));
  568. ND_PRINT((ndo, "\n\t\tSlack Term: %u", EXTRACT_32BITS(tptr + 8)));
  569. }
  570. break;
  571. case 133:
  572. case 134:
  573. case 135:
  574. case 136:
  575. if (parameter_length == 4) {
  576. ND_TCHECK2(*(tptr + 4), 4);
  577. ND_PRINT((ndo, "\n\t\tValue: %u", EXTRACT_32BITS(tptr + 4)));
  578. }
  579. break;
  580. default:
  581. if (ndo->ndo_vflag <= 1)
  582. print_unknown_data(ndo, tptr + 4, "\n\t\t", parameter_length);
  583. }
  584. return (parameter_length+4); /* header length 4 bytes */
  585. trunc:
  586. ND_PRINT((ndo, "%s", tstr));
  587. return 0;
  588. }
  589. /*
  590. * Clear checksum prior to signature verification.
  591. */
  592. static void
  593. rsvp_clear_checksum(void *header)
  594. {
  595. struct rsvp_common_header *rsvp_com_header = (struct rsvp_common_header *) header;
  596. rsvp_com_header->checksum[0] = 0;
  597. rsvp_com_header->checksum[1] = 0;
  598. }
  599. static int
  600. rsvp_obj_print(netdissect_options *ndo,
  601. const u_char *pptr, u_int plen, const u_char *tptr,
  602. const char *ident, u_int tlen,
  603. const struct rsvp_common_header *rsvp_com_header)
  604. {
  605. const struct rsvp_object_header *rsvp_obj_header;
  606. const u_char *obj_tptr;
  607. union {
  608. const struct rsvp_obj_integrity_t *rsvp_obj_integrity;
  609. const struct rsvp_obj_frr_t *rsvp_obj_frr;
  610. } obj_ptr;
  611. u_short rsvp_obj_len,rsvp_obj_ctype,obj_tlen,intserv_serv_tlen;
  612. int hexdump,processed,padbytes,error_code,error_value,i,sigcheck;
  613. union {
  614. float f;
  615. uint32_t i;
  616. } bw;
  617. uint8_t namelen;
  618. u_int action, subchannel;
  619. while(tlen>=sizeof(struct rsvp_object_header)) {
  620. /* did we capture enough for fully decoding the object header ? */
  621. ND_TCHECK2(*tptr, sizeof(struct rsvp_object_header));
  622. rsvp_obj_header = (const struct rsvp_object_header *)tptr;
  623. rsvp_obj_len=EXTRACT_16BITS(rsvp_obj_header->length);
  624. rsvp_obj_ctype=rsvp_obj_header->ctype;
  625. if(rsvp_obj_len % 4) {
  626. ND_PRINT((ndo, "%sERROR: object header size %u not a multiple of 4", ident, rsvp_obj_len));
  627. return -1;
  628. }
  629. if(rsvp_obj_len < sizeof(struct rsvp_object_header)) {
  630. ND_PRINT((ndo, "%sERROR: object header too short %u < %lu", ident, rsvp_obj_len,
  631. (unsigned long)sizeof(const struct rsvp_object_header)));
  632. return -1;
  633. }
  634. ND_PRINT((ndo, "%s%s Object (%u) Flags: [%s",
  635. ident,
  636. tok2str(rsvp_obj_values,
  637. "Unknown",
  638. rsvp_obj_header->class_num),
  639. rsvp_obj_header->class_num,
  640. ((rsvp_obj_header->class_num) & 0x80) ? "ignore" : "reject"));
  641. if (rsvp_obj_header->class_num > 128)
  642. ND_PRINT((ndo, " %s",
  643. ((rsvp_obj_header->class_num) & 0x40) ? "and forward" : "silently"));
  644. ND_PRINT((ndo, " if unknown], Class-Type: %s (%u), length: %u",
  645. tok2str(rsvp_ctype_values,
  646. "Unknown",
  647. ((rsvp_obj_header->class_num)<<8)+rsvp_obj_ctype),
  648. rsvp_obj_ctype,
  649. rsvp_obj_len));
  650. if(tlen < rsvp_obj_len) {
  651. ND_PRINT((ndo, "%sERROR: object goes past end of objects TLV", ident));
  652. return -1;
  653. }
  654. obj_tptr=tptr+sizeof(struct rsvp_object_header);
  655. obj_tlen=rsvp_obj_len-sizeof(struct rsvp_object_header);
  656. /* did we capture enough for fully decoding the object ? */
  657. if (!ND_TTEST2(*tptr, rsvp_obj_len))
  658. return -1;
  659. hexdump=FALSE;
  660. switch(rsvp_obj_header->class_num) {
  661. case RSVP_OBJ_SESSION:
  662. switch(rsvp_obj_ctype) {
  663. case RSVP_CTYPE_IPV4:
  664. if (obj_tlen < 8)
  665. return -1;
  666. ND_PRINT((ndo, "%s IPv4 DestAddress: %s, Protocol ID: 0x%02x",
  667. ident,
  668. ipaddr_string(ndo, obj_tptr),
  669. *(obj_tptr + sizeof(struct in_addr))));
  670. ND_PRINT((ndo, "%s Flags: [0x%02x], DestPort %u",
  671. ident,
  672. *(obj_tptr+5),
  673. EXTRACT_16BITS(obj_tptr + 6)));
  674. obj_tlen-=8;
  675. obj_tptr+=8;
  676. break;
  677. case RSVP_CTYPE_IPV6:
  678. if (obj_tlen < 20)
  679. return -1;
  680. ND_PRINT((ndo, "%s IPv6 DestAddress: %s, Protocol ID: 0x%02x",
  681. ident,
  682. ip6addr_string(ndo, obj_tptr),
  683. *(obj_tptr + sizeof(struct in6_addr))));
  684. ND_PRINT((ndo, "%s Flags: [0x%02x], DestPort %u",
  685. ident,
  686. *(obj_tptr+sizeof(struct in6_addr)+1),
  687. EXTRACT_16BITS(obj_tptr + sizeof(struct in6_addr) + 2)));
  688. obj_tlen-=20;
  689. obj_tptr+=20;
  690. break;
  691. case RSVP_CTYPE_TUNNEL_IPV6:
  692. if (obj_tlen < 36)
  693. return -1;
  694. ND_PRINT((ndo, "%s IPv6 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
  695. ident,
  696. ip6addr_string(ndo, obj_tptr),
  697. EXTRACT_16BITS(obj_tptr+18),
  698. ip6addr_string(ndo, obj_tptr + 20)));
  699. obj_tlen-=36;
  700. obj_tptr+=36;
  701. break;
  702. case RSVP_CTYPE_14: /* IPv6 p2mp LSP Tunnel */
  703. if (obj_tlen < 26)
  704. return -1;
  705. ND_PRINT((ndo, "%s IPv6 P2MP LSP ID: 0x%08x, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
  706. ident,
  707. EXTRACT_32BITS(obj_tptr),
  708. EXTRACT_16BITS(obj_tptr+6),
  709. ip6addr_string(ndo, obj_tptr + 8)));
  710. obj_tlen-=26;
  711. obj_tptr+=26;
  712. break;
  713. case RSVP_CTYPE_13: /* IPv4 p2mp LSP Tunnel */
  714. if (obj_tlen < 12)
  715. return -1;
  716. ND_PRINT((ndo, "%s IPv4 P2MP LSP ID: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
  717. ident,
  718. ipaddr_string(ndo, obj_tptr),
  719. EXTRACT_16BITS(obj_tptr+6),
  720. ipaddr_string(ndo, obj_tptr + 8)));
  721. obj_tlen-=12;
  722. obj_tptr+=12;
  723. break;
  724. case RSVP_CTYPE_TUNNEL_IPV4:
  725. case RSVP_CTYPE_UNI_IPV4:
  726. if (obj_tlen < 12)
  727. return -1;
  728. ND_PRINT((ndo, "%s IPv4 Tunnel EndPoint: %s, Tunnel ID: 0x%04x, Extended Tunnel ID: %s",
  729. ident,
  730. ipaddr_string(ndo, obj_tptr),
  731. EXTRACT_16BITS(obj_tptr+6),
  732. ipaddr_string(ndo, obj_tptr + 8)));
  733. obj_tlen-=12;
  734. obj_tptr+=12;
  735. break;
  736. default:
  737. hexdump=TRUE;
  738. }
  739. break;
  740. case RSVP_OBJ_CONFIRM:
  741. switch(rsvp_obj_ctype) {
  742. case RSVP_CTYPE_IPV4:
  743. if (obj_tlen < sizeof(struct in_addr))
  744. return -1;
  745. ND_PRINT((ndo, "%s IPv4 Receiver Address: %s",
  746. ident,
  747. ipaddr_string(ndo, obj_tptr)));
  748. obj_tlen-=sizeof(struct in_addr);
  749. obj_tptr+=sizeof(struct in_addr);
  750. break;
  751. case RSVP_CTYPE_IPV6:
  752. if (obj_tlen < sizeof(struct in6_addr))
  753. return -1;
  754. ND_PRINT((ndo, "%s IPv6 Receiver Address: %s",
  755. ident,
  756. ip6addr_string(ndo, obj_tptr)));
  757. obj_tlen-=sizeof(struct in6_addr);
  758. obj_tptr+=sizeof(struct in6_addr);
  759. break;
  760. default:
  761. hexdump=TRUE;
  762. }
  763. break;
  764. case RSVP_OBJ_NOTIFY_REQ:
  765. switch(rsvp_obj_ctype) {
  766. case RSVP_CTYPE_IPV4:
  767. if (obj_tlen < sizeof(struct in_addr))
  768. return -1;
  769. ND_PRINT((ndo, "%s IPv4 Notify Node Address: %s",
  770. ident,
  771. ipaddr_string(ndo, obj_tptr)));
  772. obj_tlen-=sizeof(struct in_addr);
  773. obj_tptr+=sizeof(struct in_addr);
  774. break;
  775. case RSVP_CTYPE_IPV6:
  776. if (obj_tlen < sizeof(struct in6_addr))
  777. return-1;
  778. ND_PRINT((ndo, "%s IPv6 Notify Node Address: %s",
  779. ident,
  780. ip6addr_string(ndo, obj_tptr)));
  781. obj_tlen-=sizeof(struct in6_addr);
  782. obj_tptr+=sizeof(struct in6_addr);
  783. break;
  784. default:
  785. hexdump=TRUE;
  786. }
  787. break;
  788. case RSVP_OBJ_SUGGESTED_LABEL: /* fall through */
  789. case RSVP_OBJ_UPSTREAM_LABEL: /* fall through */
  790. case RSVP_OBJ_RECOVERY_LABEL: /* fall through */
  791. case RSVP_OBJ_LABEL:
  792. switch(rsvp_obj_ctype) {
  793. case RSVP_CTYPE_1:
  794. while(obj_tlen >= 4 ) {
  795. ND_PRINT((ndo, "%s Label: %u", ident, EXTRACT_32BITS(obj_tptr)));
  796. obj_tlen-=4;
  797. obj_tptr+=4;
  798. }
  799. break;
  800. case RSVP_CTYPE_2:
  801. if (obj_tlen < 4)
  802. return-1;
  803. ND_PRINT((ndo, "%s Generalized Label: %u",
  804. ident,
  805. EXTRACT_32BITS(obj_tptr)));
  806. obj_tlen-=4;
  807. obj_tptr+=4;
  808. break;
  809. case RSVP_CTYPE_3:
  810. if (obj_tlen < 12)
  811. return-1;
  812. ND_PRINT((ndo, "%s Waveband ID: %u%s Start Label: %u, Stop Label: %u",
  813. ident,
  814. EXTRACT_32BITS(obj_tptr),
  815. ident,
  816. EXTRACT_32BITS(obj_tptr+4),
  817. EXTRACT_32BITS(obj_tptr + 8)));
  818. obj_tlen-=12;
  819. obj_tptr+=12;
  820. break;
  821. default:
  822. hexdump=TRUE;
  823. }
  824. break;
  825. case RSVP_OBJ_STYLE:
  826. switch(rsvp_obj_ctype) {
  827. case RSVP_CTYPE_1:
  828. if (obj_tlen < 4)
  829. return-1;
  830. ND_PRINT((ndo, "%s Reservation Style: %s, Flags: [0x%02x]",
  831. ident,
  832. tok2str(rsvp_resstyle_values,
  833. "Unknown",
  834. EXTRACT_24BITS(obj_tptr+1)),
  835. *(obj_tptr)));
  836. obj_tlen-=4;
  837. obj_tptr+=4;
  838. break;
  839. default:
  840. hexdump=TRUE;
  841. }
  842. break;
  843. case RSVP_OBJ_SENDER_TEMPLATE:
  844. switch(rsvp_obj_ctype) {
  845. case RSVP_CTYPE_IPV4:
  846. if (obj_tlen < 8)
  847. return-1;
  848. ND_PRINT((ndo, "%s Source Address: %s, Source Port: %u",
  849. ident,
  850. ipaddr_string(ndo, obj_tptr),
  851. EXTRACT_16BITS(obj_tptr + 6)));
  852. obj_tlen-=8;
  853. obj_tptr+=8;
  854. break;
  855. case RSVP_CTYPE_IPV6:
  856. if (obj_tlen < 20)
  857. return-1;
  858. ND_PRINT((ndo, "%s Source Address: %s, Source Port: %u",
  859. ident,
  860. ip6addr_string(ndo, obj_tptr),
  861. EXTRACT_16BITS(obj_tptr + 18)));
  862. obj_tlen-=20;
  863. obj_tptr+=20;
  864. break;
  865. case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
  866. if (obj_tlen < 40)
  867. return-1;
  868. ND_PRINT((ndo, "%s IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
  869. "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
  870. ident,
  871. ip6addr_string(ndo, obj_tptr),
  872. EXTRACT_16BITS(obj_tptr+18),
  873. ident,
  874. ip6addr_string(ndo, obj_tptr+20),
  875. EXTRACT_16BITS(obj_tptr + 38)));
  876. obj_tlen-=40;
  877. obj_tptr+=40;
  878. break;
  879. case RSVP_CTYPE_TUNNEL_IPV4:
  880. if (obj_tlen < 8)
  881. return-1;
  882. ND_PRINT((ndo, "%s IPv4 Tunnel Sender Address: %s, LSP-ID: 0x%04x",
  883. ident,
  884. ipaddr_string(ndo, obj_tptr),
  885. EXTRACT_16BITS(obj_tptr + 6)));
  886. obj_tlen-=8;
  887. obj_tptr+=8;
  888. break;
  889. case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
  890. if (obj_tlen < 16)
  891. return-1;
  892. ND_PRINT((ndo, "%s IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
  893. "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
  894. ident,
  895. ipaddr_string(ndo, obj_tptr),
  896. EXTRACT_16BITS(obj_tptr+6),
  897. ident,
  898. ipaddr_string(ndo, obj_tptr+8),
  899. EXTRACT_16BITS(obj_tptr + 12)));
  900. obj_tlen-=16;
  901. obj_tptr+=16;
  902. break;
  903. default:
  904. hexdump=TRUE;
  905. }
  906. break;
  907. case RSVP_OBJ_LABEL_REQ:
  908. switch(rsvp_obj_ctype) {
  909. case RSVP_CTYPE_1:
  910. while(obj_tlen >= 4 ) {
  911. ND_PRINT((ndo, "%s L3 Protocol ID: %s",
  912. ident,
  913. tok2str(ethertype_values,
  914. "Unknown Protocol (0x%04x)",
  915. EXTRACT_16BITS(obj_tptr + 2))));
  916. obj_tlen-=4;
  917. obj_tptr+=4;
  918. }
  919. break;
  920. case RSVP_CTYPE_2:
  921. if (obj_tlen < 12)
  922. return-1;
  923. ND_PRINT((ndo, "%s L3 Protocol ID: %s",
  924. ident,
  925. tok2str(ethertype_values,
  926. "Unknown Protocol (0x%04x)",
  927. EXTRACT_16BITS(obj_tptr + 2))));
  928. ND_PRINT((ndo, ",%s merge capability",((*(obj_tptr + 4)) & 0x80) ? "no" : "" ));
  929. ND_PRINT((ndo, "%s Minimum VPI/VCI: %u/%u",
  930. ident,
  931. (EXTRACT_16BITS(obj_tptr+4))&0xfff,
  932. (EXTRACT_16BITS(obj_tptr + 6)) & 0xfff));
  933. ND_PRINT((ndo, "%s Maximum VPI/VCI: %u/%u",
  934. ident,
  935. (EXTRACT_16BITS(obj_tptr+8))&0xfff,
  936. (EXTRACT_16BITS(obj_tptr + 10)) & 0xfff));
  937. obj_tlen-=12;
  938. obj_tptr+=12;
  939. break;
  940. case RSVP_CTYPE_3:
  941. if (obj_tlen < 12)
  942. return-1;
  943. ND_PRINT((ndo, "%s L3 Protocol ID: %s",
  944. ident,
  945. tok2str(ethertype_values,
  946. "Unknown Protocol (0x%04x)",
  947. EXTRACT_16BITS(obj_tptr + 2))));
  948. ND_PRINT((ndo, "%s Minimum/Maximum DLCI: %u/%u, %s%s bit DLCI",
  949. ident,
  950. (EXTRACT_32BITS(obj_tptr+4))&0x7fffff,
  951. (EXTRACT_32BITS(obj_tptr+8))&0x7fffff,
  952. (((EXTRACT_16BITS(obj_tptr+4)>>7)&3) == 0 ) ? "10" : "",
  953. (((EXTRACT_16BITS(obj_tptr + 4) >> 7) & 3) == 2 ) ? "23" : ""));
  954. obj_tlen-=12;
  955. obj_tptr+=12;
  956. break;
  957. case RSVP_CTYPE_4:
  958. if (obj_tlen < 4)
  959. return-1;
  960. ND_PRINT((ndo, "%s LSP Encoding Type: %s (%u)",
  961. ident,
  962. tok2str(gmpls_encoding_values,
  963. "Unknown",
  964. *obj_tptr),
  965. *obj_tptr));
  966. ND_PRINT((ndo, "%s Switching Type: %s (%u), Payload ID: %s (0x%04x)",
  967. ident,
  968. tok2str(gmpls_switch_cap_values,
  969. "Unknown",
  970. *(obj_tptr+1)),
  971. *(obj_tptr+1),
  972. tok2str(gmpls_payload_values,
  973. "Unknown",
  974. EXTRACT_16BITS(obj_tptr+2)),
  975. EXTRACT_16BITS(obj_tptr + 2)));
  976. obj_tlen-=4;
  977. obj_tptr+=4;
  978. break;
  979. default:
  980. hexdump=TRUE;
  981. }
  982. break;
  983. case RSVP_OBJ_RRO:
  984. case RSVP_OBJ_ERO:
  985. switch(rsvp_obj_ctype) {
  986. case RSVP_CTYPE_IPV4:
  987. while(obj_tlen >= 4 ) {
  988. u_char length;
  989. ND_TCHECK2(*obj_tptr, 4);
  990. length = *(obj_tptr + 1);
  991. ND_PRINT((ndo, "%s Subobject Type: %s, length %u",
  992. ident,
  993. tok2str(rsvp_obj_xro_values,
  994. "Unknown %u",
  995. RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)),
  996. length));
  997. if (length == 0) { /* prevent infinite loops */
  998. ND_PRINT((ndo, "%s ERROR: zero length ERO subtype", ident));
  999. break;
  1000. }
  1001. switch(RSVP_OBJ_XRO_MASK_SUBOBJ(*obj_tptr)) {
  1002. u_char prefix_length;
  1003. case RSVP_OBJ_XRO_IPV4:
  1004. if (length != 8) {
  1005. ND_PRINT((ndo, " ERROR: length != 8"));
  1006. goto invalid;
  1007. }
  1008. ND_TCHECK2(*obj_tptr, 8);
  1009. prefix_length = *(obj_tptr+6);
  1010. if (prefix_length != 32) {
  1011. ND_PRINT((ndo, " ERROR: Prefix length %u != 32",
  1012. prefix_length));
  1013. goto invalid;
  1014. }
  1015. ND_PRINT((ndo, ", %s, %s/%u, Flags: [%s]",
  1016. RSVP_OBJ_XRO_MASK_LOOSE(*obj_tptr) ? "Loose" : "Strict",
  1017. ipaddr_string(ndo, obj_tptr+2),
  1018. *(obj_tptr+6),
  1019. bittok2str(rsvp_obj_rro_flag_values,
  1020. "none",
  1021. *(obj_tptr + 7)))); /* rfc3209 says that this field is rsvd. */
  1022. break;
  1023. case RSVP_OBJ_XRO_LABEL:
  1024. if (length != 8) {
  1025. ND_PRINT((ndo, " ERROR: length != 8"));
  1026. goto invalid;
  1027. }
  1028. ND_TCHECK2(*obj_tptr, 8);
  1029. ND_PRINT((ndo, ", Flags: [%s] (%#x), Class-Type: %s (%u), %u",
  1030. bittok2str(rsvp_obj_rro_label_flag_values,
  1031. "none",
  1032. *(obj_tptr+2)),
  1033. *(obj_tptr+2),
  1034. tok2str(rsvp_ctype_values,
  1035. "Unknown",
  1036. *(obj_tptr+3) + 256*RSVP_OBJ_RRO),
  1037. *(obj_tptr+3),
  1038. EXTRACT_32BITS(obj_tptr + 4)));
  1039. }
  1040. obj_tlen-=*(obj_tptr+1);
  1041. obj_tptr+=*(obj_tptr+1);
  1042. }
  1043. break;
  1044. default:
  1045. hexdump=TRUE;
  1046. }
  1047. break;
  1048. case RSVP_OBJ_HELLO:
  1049. switch(rsvp_obj_ctype) {
  1050. case RSVP_CTYPE_1:
  1051. case RSVP_CTYPE_2:
  1052. if (obj_tlen < 8)
  1053. return-1;
  1054. ND_PRINT((ndo, "%s Source Instance: 0x%08x, Destination Instance: 0x%08x",
  1055. ident,
  1056. EXTRACT_32BITS(obj_tptr),
  1057. EXTRACT_32BITS(obj_tptr + 4)));
  1058. obj_tlen-=8;
  1059. obj_tptr+=8;
  1060. break;
  1061. default:
  1062. hexdump=TRUE;
  1063. }
  1064. break;
  1065. case RSVP_OBJ_RESTART_CAPABILITY:
  1066. switch(rsvp_obj_ctype) {
  1067. case RSVP_CTYPE_1:
  1068. if (obj_tlen < 8)
  1069. return-1;
  1070. ND_PRINT((ndo, "%s Restart Time: %ums, Recovery Time: %ums",
  1071. ident,
  1072. EXTRACT_32BITS(obj_tptr),
  1073. EXTRACT_32BITS(obj_tptr + 4)));
  1074. obj_tlen-=8;
  1075. obj_tptr+=8;
  1076. break;
  1077. default:
  1078. hexdump=TRUE;
  1079. }
  1080. break;
  1081. case RSVP_OBJ_SESSION_ATTRIBUTE:
  1082. switch(rsvp_obj_ctype) {
  1083. case RSVP_CTYPE_TUNNEL_IPV4:
  1084. if (obj_tlen < 4)
  1085. return-1;
  1086. namelen = *(obj_tptr+3);
  1087. if (obj_tlen < 4+namelen)
  1088. return-1;
  1089. ND_PRINT((ndo, "%s Session Name: ", ident));
  1090. for (i = 0; i < namelen; i++)
  1091. safeputchar(ndo, *(obj_tptr + 4 + i));
  1092. ND_PRINT((ndo, "%s Setup Priority: %u, Holding Priority: %u, Flags: [%s] (%#x)",
  1093. ident,
  1094. (int)*obj_tptr,
  1095. (int)*(obj_tptr+1),
  1096. bittok2str(rsvp_session_attribute_flag_values,
  1097. "none",
  1098. *(obj_tptr+2)),
  1099. *(obj_tptr + 2)));
  1100. obj_tlen-=4+*(obj_tptr+3);
  1101. obj_tptr+=4+*(obj_tptr+3);
  1102. break;
  1103. default:
  1104. hexdump=TRUE;
  1105. }
  1106. break;
  1107. case RSVP_OBJ_GENERALIZED_UNI:
  1108. switch(rsvp_obj_ctype) {
  1109. int subobj_type,af,subobj_len,total_subobj_len;
  1110. case RSVP_CTYPE_1:
  1111. if (obj_tlen < 4)
  1112. return-1;
  1113. /* read variable length subobjects */
  1114. total_subobj_len = obj_tlen;
  1115. while(total_subobj_len > 0) {
  1116. /* If RFC 3476 Section 3.1 defined that a sub-object of the
  1117. * GENERALIZED_UNI RSVP object must have the Length field as
  1118. * a multiple of 4, instead of the check below it would be
  1119. * better to test total_subobj_len only once before the loop.
  1120. * So long as it does not define it and this while loop does
  1121. * not implement such a requirement, let's accept that within
  1122. * each iteration subobj_len may happen to be a multiple of 1
  1123. * and test it and total_subobj_len respectively.
  1124. */
  1125. if (total_subobj_len < 4)
  1126. goto invalid;
  1127. subobj_len = EXTRACT_16BITS(obj_tptr);
  1128. subobj_type = (EXTRACT_16BITS(obj_tptr+2))>>8;
  1129. af = (EXTRACT_16BITS(obj_tptr+2))&0x00FF;
  1130. ND_PRINT((ndo, "%s Subobject Type: %s (%u), AF: %s (%u), length: %u",
  1131. ident,
  1132. tok2str(rsvp_obj_generalized_uni_values, "Unknown", subobj_type),
  1133. subobj_type,
  1134. tok2str(af_values, "Unknown", af), af,
  1135. subobj_len));
  1136. /* In addition to what is explained above, the same spec does not
  1137. * explicitly say that the same Length field includes the 4-octet
  1138. * sub-object header, but as long as this while loop implements it
  1139. * as it does include, let's keep the check below consistent with
  1140. * the rest of the code.
  1141. */
  1142. if(subobj_len < 4 || subobj_len > total_subobj_len)
  1143. goto invalid;
  1144. switch(subobj_type) {
  1145. case RSVP_GEN_UNI_SUBOBJ_SOURCE_TNA_ADDRESS:
  1146. case RSVP_GEN_UNI_SUBOBJ_DESTINATION_TNA_ADDRESS:
  1147. switch(af) {
  1148. case AFNUM_INET:
  1149. if (subobj_len < 8)
  1150. return -1;
  1151. ND_PRINT((ndo, "%s UNI IPv4 TNA address: %s",
  1152. ident, ipaddr_string(ndo, obj_tptr + 4)));
  1153. break;
  1154. case AFNUM_INET6:
  1155. if (subobj_len < 20)
  1156. return -1;
  1157. ND_PRINT((ndo, "%s UNI IPv6 TNA address: %s",
  1158. ident, ip6addr_string(ndo, obj_tptr + 4)));
  1159. break;
  1160. case AFNUM_NSAP:
  1161. if (subobj_len) {
  1162. /* unless we have a TLV parser lets just hexdump */
  1163. hexdump=TRUE;
  1164. }
  1165. break;
  1166. }
  1167. break;
  1168. case RSVP_GEN_UNI_SUBOBJ_DIVERSITY:
  1169. if (subobj_len) {
  1170. /* unless we have a TLV parser lets just hexdump */
  1171. hexdump=TRUE;
  1172. }
  1173. break;
  1174. case RSVP_GEN_UNI_SUBOBJ_EGRESS_LABEL:
  1175. if (subobj_len < 16) {
  1176. return -1;
  1177. }
  1178. ND_PRINT((ndo, "%s U-bit: %x, Label type: %u, Logical port id: %u, Label: %u",
  1179. ident,
  1180. ((EXTRACT_32BITS(obj_tptr+4))>>31),
  1181. ((EXTRACT_32BITS(obj_tptr+4))&0xFF),
  1182. EXTRACT_32BITS(obj_tptr+8),
  1183. EXTRACT_32BITS(obj_tptr + 12)));
  1184. break;
  1185. case RSVP_GEN_UNI_SUBOBJ_SERVICE_LEVEL:
  1186. if (subobj_len < 8) {
  1187. return -1;
  1188. }
  1189. ND_PRINT((ndo, "%s Service level: %u",
  1190. ident, (EXTRACT_32BITS(obj_tptr + 4)) >> 24));
  1191. break;
  1192. default:
  1193. hexdump=TRUE;
  1194. break;
  1195. }
  1196. total_subobj_len-=subobj_len;
  1197. obj_tptr+=subobj_len;
  1198. obj_tlen+=subobj_len;
  1199. }
  1200. if (total_subobj_len) {
  1201. /* unless we have a TLV parser lets just hexdump */
  1202. hexdump=TRUE;
  1203. }
  1204. break;
  1205. default:
  1206. hexdump=TRUE;
  1207. }
  1208. break;
  1209. case RSVP_OBJ_RSVP_HOP:
  1210. switch(rsvp_obj_ctype) {
  1211. case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
  1212. case RSVP_CTYPE_IPV4:
  1213. if (obj_tlen < 8)
  1214. return-1;
  1215. ND_PRINT((ndo, "%s Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
  1216. ident,
  1217. ipaddr_string(ndo, obj_tptr),
  1218. EXTRACT_32BITS(obj_tptr + 4)));
  1219. obj_tlen-=8;
  1220. obj_tptr+=8;
  1221. if (obj_tlen)
  1222. hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
  1223. break;
  1224. case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
  1225. case RSVP_CTYPE_IPV6:
  1226. if (obj_tlen < 20)
  1227. return-1;
  1228. ND_PRINT((ndo, "%s Previous/Next Interface: %s, Logical Interface Handle: 0x%08x",
  1229. ident,
  1230. ip6addr_string(ndo, obj_tptr),
  1231. EXTRACT_32BITS(obj_tptr + 16)));
  1232. obj_tlen-=20;
  1233. obj_tptr+=20;
  1234. hexdump=TRUE; /* unless we have a TLV parser lets just hexdump */
  1235. break;
  1236. default:
  1237. hexdump=TRUE;
  1238. }
  1239. break;
  1240. case RSVP_OBJ_TIME_VALUES:
  1241. switch(rsvp_obj_ctype) {
  1242. case RSVP_CTYPE_1:
  1243. if (obj_tlen < 4)
  1244. return-1;
  1245. ND_PRINT((ndo, "%s Refresh Period: %ums",
  1246. ident,
  1247. EXTRACT_32BITS(obj_tptr)));
  1248. obj_tlen-=4;
  1249. obj_tptr+=4;
  1250. break;
  1251. default:
  1252. hexdump=TRUE;
  1253. }
  1254. break;
  1255. /* those three objects do share the same semantics */
  1256. case RSVP_OBJ_SENDER_TSPEC:
  1257. case RSVP_OBJ_ADSPEC:
  1258. case RSVP_OBJ_FLOWSPEC:
  1259. switch(rsvp_obj_ctype) {
  1260. case RSVP_CTYPE_2:
  1261. if (obj_tlen < 4)
  1262. return-1;
  1263. ND_PRINT((ndo, "%s Msg-Version: %u, length: %u",
  1264. ident,
  1265. (*obj_tptr & 0xf0) >> 4,
  1266. EXTRACT_16BITS(obj_tptr + 2) << 2));
  1267. obj_tptr+=4; /* get to the start of the service header */
  1268. obj_tlen-=4;
  1269. while (obj_tlen >= 4) {
  1270. intserv_serv_tlen=EXTRACT_16BITS(obj_tptr+2)<<2;
  1271. ND_PRINT((ndo, "%s Service Type: %s (%u), break bit %s set, Service length: %u",
  1272. ident,
  1273. tok2str(rsvp_intserv_service_type_values,"unknown",*(obj_tptr)),
  1274. *(obj_tptr),
  1275. (*(obj_tptr+1)&0x80) ? "" : "not",
  1276. intserv_serv_tlen));
  1277. obj_tptr+=4; /* get to the start of the parameter list */
  1278. obj_tlen-=4;
  1279. while (intserv_serv_tlen>=4) {
  1280. processed = rsvp_intserv_print(ndo, obj_tptr, obj_tlen);
  1281. if (processed == 0)
  1282. break;
  1283. obj_tlen-=processed;
  1284. intserv_serv_tlen-=processed;
  1285. obj_tptr+=processed;
  1286. }
  1287. }
  1288. break;
  1289. default:
  1290. hexdump=TRUE;
  1291. }
  1292. break;
  1293. case RSVP_OBJ_FILTERSPEC:
  1294. switch(rsvp_obj_ctype) {
  1295. case RSVP_CTYPE_IPV4:
  1296. if (obj_tlen < 8)
  1297. return-1;
  1298. ND_PRINT((ndo, "%s Source Address: %s, Source Port: %u",
  1299. ident,
  1300. ipaddr_string(ndo, obj_tptr),
  1301. EXTRACT_16BITS(obj_tptr + 6)));
  1302. obj_tlen-=8;
  1303. obj_tptr+=8;
  1304. break;
  1305. case RSVP_CTYPE_IPV6:
  1306. if (obj_tlen < 20)
  1307. return-1;
  1308. ND_PRINT((ndo, "%s Source Address: %s, Source Port: %u",
  1309. ident,
  1310. ip6addr_string(ndo, obj_tptr),
  1311. EXTRACT_16BITS(obj_tptr + 18)));
  1312. obj_tlen-=20;
  1313. obj_tptr+=20;
  1314. break;
  1315. case RSVP_CTYPE_3:
  1316. if (obj_tlen < 20)
  1317. return-1;
  1318. ND_PRINT((ndo, "%s Source Address: %s, Flow Label: %u",
  1319. ident,
  1320. ip6addr_string(ndo, obj_tptr),
  1321. EXTRACT_24BITS(obj_tptr + 17)));
  1322. obj_tlen-=20;
  1323. obj_tptr+=20;
  1324. break;
  1325. case RSVP_CTYPE_TUNNEL_IPV6:
  1326. if (obj_tlen < 20)
  1327. return-1;
  1328. ND_PRINT((ndo, "%s Source Address: %s, LSP-ID: 0x%04x",
  1329. ident,
  1330. ipaddr_string(ndo, obj_tptr),
  1331. EXTRACT_16BITS(obj_tptr + 18)));
  1332. obj_tlen-=20;
  1333. obj_tptr+=20;
  1334. break;
  1335. case RSVP_CTYPE_13: /* IPv6 p2mp LSP tunnel */
  1336. if (obj_tlen < 40)
  1337. return-1;
  1338. ND_PRINT((ndo, "%s IPv6 Tunnel Sender Address: %s, LSP ID: 0x%04x"
  1339. "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
  1340. ident,
  1341. ip6addr_string(ndo, obj_tptr),
  1342. EXTRACT_16BITS(obj_tptr+18),
  1343. ident,
  1344. ip6addr_string(ndo, obj_tptr+20),
  1345. EXTRACT_16BITS(obj_tptr + 38)));
  1346. obj_tlen-=40;
  1347. obj_tptr+=40;
  1348. break;
  1349. case RSVP_CTYPE_TUNNEL_IPV4:
  1350. if (obj_tlen < 8)
  1351. return-1;
  1352. ND_PRINT((ndo, "%s Source Address: %s, LSP-ID: 0x%04x",
  1353. ident,
  1354. ipaddr_string(ndo, obj_tptr),
  1355. EXTRACT_16BITS(obj_tptr + 6)));
  1356. obj_tlen-=8;
  1357. obj_tptr+=8;
  1358. break;
  1359. case RSVP_CTYPE_12: /* IPv4 p2mp LSP tunnel */
  1360. if (obj_tlen < 16)
  1361. return-1;
  1362. ND_PRINT((ndo, "%s IPv4 Tunnel Sender Address: %s, LSP ID: 0x%04x"
  1363. "%s Sub-Group Originator ID: %s, Sub-Group ID: 0x%04x",
  1364. ident,
  1365. ipaddr_string(ndo, obj_tptr),
  1366. EXTRACT_16BITS(obj_tptr+6),
  1367. ident,
  1368. ipaddr_string(ndo, obj_tptr+8),
  1369. EXTRACT_16BITS(obj_tptr + 12)));
  1370. obj_tlen-=16;
  1371. obj_tptr+=16;
  1372. break;
  1373. default:
  1374. hexdump=TRUE;
  1375. }
  1376. break;
  1377. case RSVP_OBJ_FASTREROUTE:
  1378. /* the differences between c-type 1 and 7 are minor */
  1379. obj_ptr.rsvp_obj_frr = (const struct rsvp_obj_frr_t *)obj_tptr;
  1380. switch(rsvp_obj_ctype) {
  1381. case RSVP_CTYPE_1: /* new style */
  1382. if (obj_tlen < sizeof(struct rsvp_obj_frr_t))
  1383. return-1;
  1384. bw.i = EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->bandwidth);
  1385. ND_PRINT((ndo, "%s Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
  1386. ident,
  1387. (int)obj_ptr.rsvp_obj_frr->setup_prio,
  1388. (int)obj_ptr.rsvp_obj_frr->hold_prio,
  1389. (int)obj_ptr.rsvp_obj_frr->hop_limit,
  1390. bw.f * 8 / 1000000));
  1391. ND_PRINT((ndo, "%s Include-any: 0x%08x, Exclude-any: 0x%08x, Include-all: 0x%08x",
  1392. ident,
  1393. EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->include_any),
  1394. EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->exclude_any),
  1395. EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->include_all)));
  1396. obj_tlen-=sizeof(struct rsvp_obj_frr_t);
  1397. obj_tptr+=sizeof(struct rsvp_obj_frr_t);
  1398. break;
  1399. case RSVP_CTYPE_TUNNEL_IPV4: /* old style */
  1400. if (obj_tlen < 16)
  1401. return-1;
  1402. bw.i = EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->bandwidth);
  1403. ND_PRINT((ndo, "%s Setup Priority: %u, Holding Priority: %u, Hop-limit: %u, Bandwidth: %.10g Mbps",
  1404. ident,
  1405. (int)obj_ptr.rsvp_obj_frr->setup_prio,
  1406. (int)obj_ptr.rsvp_obj_frr->hold_prio,
  1407. (int)obj_ptr.rsvp_obj_frr->hop_limit,
  1408. bw.f * 8 / 1000000));
  1409. ND_PRINT((ndo, "%s Include Colors: 0x%08x, Exclude Colors: 0x%08x",
  1410. ident,
  1411. EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->include_any),
  1412. EXTRACT_32BITS(obj_ptr.rsvp_obj_frr->exclude_any)));
  1413. obj_tlen-=16;
  1414. obj_tptr+=16;
  1415. break;
  1416. default:
  1417. hexdump=TRUE;
  1418. }
  1419. break;
  1420. case RSVP_OBJ_DETOUR:
  1421. switch(rsvp_obj_ctype) {
  1422. case RSVP_CTYPE_TUNNEL_IPV4:
  1423. while(obj_tlen >= 8) {
  1424. ND_PRINT((ndo, "%s PLR-ID: %s, Avoid-Node-ID: %s",
  1425. ident,
  1426. ipaddr_string(ndo, obj_tptr),
  1427. ipaddr_string(ndo, obj_tptr + 4)));
  1428. obj_tlen-=8;
  1429. obj_tptr+=8;
  1430. }
  1431. break;
  1432. default:
  1433. hexdump=TRUE;
  1434. }
  1435. break;
  1436. case RSVP_OBJ_CLASSTYPE:
  1437. case RSVP_OBJ_CLASSTYPE_OLD: /* fall through */
  1438. switch(rsvp_obj_ctype) {
  1439. case RSVP_CTYPE_1:
  1440. ND_PRINT((ndo, "%s CT: %u",
  1441. ident,
  1442. EXTRACT_32BITS(obj_tptr) & 0x7));
  1443. obj_tlen-=4;
  1444. obj_tptr+=4;
  1445. break;
  1446. default:
  1447. hexdump=TRUE;
  1448. }
  1449. break;
  1450. case RSVP_OBJ_ERROR_SPEC:
  1451. switch(rsvp_obj_ctype) {
  1452. case RSVP_CTYPE_3: /* fall through - FIXME add TLV parser */
  1453. case RSVP_CTYPE_IPV4:
  1454. if (obj_tlen < 8)
  1455. return-1;
  1456. error_code=*(obj_tptr+5);
  1457. error_value=EXTRACT_16BITS(obj_tptr+6);
  1458. ND_PRINT((ndo, "%s Error Node Address: %s, Flags: [0x%02x]%s Error Code: %s (%u)",
  1459. ident,
  1460. ipaddr_string(ndo, obj_tptr),
  1461. *(obj_tptr+4),
  1462. ident,
  1463. tok2str(rsvp_obj_error_code_values,"unknown",error_code),
  1464. error_code));
  1465. switch (error_code) {
  1466. case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
  1467. ND_PRINT((ndo, ", Error Value: %s (%u)",
  1468. tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
  1469. error_value));
  1470. break;
  1471. case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE: /* fall through */
  1472. case RSVP_OBJ_ERROR_SPEC_CODE_DIFFSERV_TE_OLD:
  1473. ND_PRINT((ndo, ", Error Value: %s (%u)",
  1474. tok2str(rsvp_obj_error_code_diffserv_te_values,"unknown",error_value),
  1475. error_value));
  1476. break;
  1477. default:
  1478. ND_PRINT((ndo, ", Unknown Error Value (%u)", error_value));
  1479. break;
  1480. }
  1481. obj_tlen-=8;
  1482. obj_tptr+=8;
  1483. break;
  1484. case RSVP_CTYPE_4: /* fall through - FIXME add TLV parser */
  1485. case RSVP_CTYPE_IPV6:
  1486. if (obj_tlen < 20)
  1487. return-1;
  1488. error_code=*(obj_tptr+17);
  1489. error_value=EXTRACT_16BITS(obj_tptr+18);
  1490. ND_PRINT((ndo, "%s Error Node Address: %s, Flags: [0x%02x]%s Error Code: %s (%u)",
  1491. ident,
  1492. ip6addr_string(ndo, obj_tptr),
  1493. *(obj_tptr+16),
  1494. ident,
  1495. tok2str(rsvp_obj_error_code_values,"unknown",error_code),
  1496. error_code));
  1497. switch (error_code) {
  1498. case RSVP_OBJ_ERROR_SPEC_CODE_ROUTING:
  1499. ND_PRINT((ndo, ", Error Value: %s (%u)",
  1500. tok2str(rsvp_obj_error_code_routing_values,"unknown",error_value),
  1501. error_value));
  1502. break;
  1503. default:
  1504. break;
  1505. }
  1506. obj_tlen-=20;
  1507. obj_tptr+=20;
  1508. break;
  1509. default:
  1510. hexdump=TRUE;
  1511. }
  1512. break;
  1513. case RSVP_OBJ_PROPERTIES:
  1514. switch(rsvp_obj_ctype) {
  1515. case RSVP_CTYPE_1:
  1516. if (obj_tlen < 4)
  1517. return-1;
  1518. padbytes = EXTRACT_16BITS(obj_tptr+2);
  1519. ND_PRINT((ndo, "%s TLV count: %u, padding bytes: %u",
  1520. ident,
  1521. EXTRACT_16BITS(obj_tptr),
  1522. padbytes));
  1523. obj_tlen-=4;
  1524. obj_tptr+=4;
  1525. /* loop through as long there is anything longer than the TLV header (2) */
  1526. while(obj_tlen >= 2 + padbytes) {
  1527. ND_PRINT((ndo, "%s %s TLV (0x%02x), length: %u", /* length includes header */
  1528. ident,
  1529. tok2str(rsvp_obj_prop_tlv_values,"unknown",*obj_tptr),
  1530. *obj_tptr,
  1531. *(obj_tptr + 1)));
  1532. if (obj_tlen < *(obj_tptr+1))
  1533. return-1;
  1534. if (*(obj_tptr+1) < 2)
  1535. return -1;
  1536. print_unknown_data(ndo, obj_tptr + 2, "\n\t\t", *(obj_tptr + 1) - 2);
  1537. obj_tlen-=*(obj_tptr+1);
  1538. obj_tptr+=*(obj_tptr+1);
  1539. }
  1540. break;
  1541. default:
  1542. hexdump=TRUE;
  1543. }
  1544. break;
  1545. case RSVP_OBJ_MESSAGE_ID: /* fall through */
  1546. case RSVP_OBJ_MESSAGE_ID_ACK: /* fall through */
  1547. case RSVP_OBJ_MESSAGE_ID_LIST:
  1548. switch(rsvp_obj_ctype) {
  1549. case RSVP_CTYPE_1:
  1550. case RSVP_CTYPE_2:
  1551. if (obj_tlen < 8)
  1552. return-1;
  1553. ND_PRINT((ndo, "%s Flags [0x%02x], epoch: %u",
  1554. ident,
  1555. *obj_tptr,
  1556. EXTRACT_24BITS(obj_tptr + 1)));
  1557. obj_tlen-=4;
  1558. obj_tptr+=4;
  1559. /* loop through as long there are no messages left */
  1560. while(obj_tlen >= 4) {
  1561. ND_PRINT((ndo, "%s Message-ID 0x%08x (%u)",
  1562. ident,
  1563. EXTRACT_32BITS(obj_tptr),
  1564. EXTRACT_32BITS(obj_tptr)));
  1565. obj_tlen-=4;
  1566. obj_tptr+=4;
  1567. }
  1568. break;
  1569. default:
  1570. hexdump=TRUE;
  1571. }
  1572. break;
  1573. case RSVP_OBJ_INTEGRITY:
  1574. switch(rsvp_obj_ctype) {
  1575. case RSVP_CTYPE_1:
  1576. if (obj_tlen < sizeof(struct rsvp_obj_integrity_t))
  1577. return-1;
  1578. obj_ptr.rsvp_obj_integrity = (const struct rsvp_obj_integrity_t *)obj_tptr;
  1579. ND_PRINT((ndo, "%s Key-ID 0x%04x%08x, Sequence 0x%08x%08x, Flags [%s]",
  1580. ident,
  1581. EXTRACT_16BITS(obj_ptr.rsvp_obj_integrity->key_id),
  1582. EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->key_id+2),
  1583. EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->sequence),
  1584. EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->sequence+4),
  1585. bittok2str(rsvp_obj_integrity_flag_values,
  1586. "none",
  1587. obj_ptr.rsvp_obj_integrity->flags)));
  1588. ND_PRINT((ndo, "%s MD5-sum 0x%08x%08x%08x%08x ",
  1589. ident,
  1590. EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->digest),
  1591. EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->digest+4),
  1592. EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->digest+8),
  1593. EXTRACT_32BITS(obj_ptr.rsvp_obj_integrity->digest + 12)));
  1594. sigcheck = signature_verify(ndo, pptr, plen,
  1595. obj_ptr.rsvp_obj_integrity->digest,
  1596. rsvp_clear_checksum,
  1597. rsvp_com_header);
  1598. ND_PRINT((ndo, " (%s)", tok2str(signature_check_values, "Unknown", sigcheck)));
  1599. obj_tlen+=sizeof(struct rsvp_obj_integrity_t);
  1600. obj_tptr+=sizeof(struct rsvp_obj_integrity_t);
  1601. break;
  1602. default:
  1603. hexdump=TRUE;
  1604. }
  1605. break;
  1606. case RSVP_OBJ_ADMIN_STATUS:
  1607. switch(rsvp_obj_ctype) {
  1608. case RSVP_CTYPE_1:
  1609. if (obj_tlen < 4)
  1610. return-1;
  1611. ND_PRINT((ndo, "%s Flags [%s]", ident,
  1612. bittok2str(rsvp_obj_admin_status_flag_values, "none",
  1613. EXTRACT_32BITS(obj_tptr))));
  1614. obj_tlen-=4;
  1615. obj_tptr+=4;
  1616. break;
  1617. default:
  1618. hexdump=TRUE;
  1619. }
  1620. break;
  1621. case RSVP_OBJ_LABEL_SET:
  1622. switch(rsvp_obj_ctype) {
  1623. case RSVP_CTYPE_1:
  1624. if (obj_tlen < 4)
  1625. return-1;
  1626. action = (EXTRACT_16BITS(obj_tptr)>>8);
  1627. ND_PRINT((ndo, "%s Action: %s (%u), Label type: %u", ident,
  1628. tok2str(rsvp_obj_label_set_action_values, "Unknown", action),
  1629. action, ((EXTRACT_32BITS(obj_tptr) & 0x7F))));
  1630. switch (action) {
  1631. case LABEL_SET_INCLUSIVE_RANGE:
  1632. case LABEL_SET_EXCLUSIVE_RANGE: /* fall through */
  1633. /* only a couple of subchannels are expected */
  1634. if (obj_tlen < 12)
  1635. return -1;
  1636. ND_PRINT((ndo, "%s Start range: %u, End range: %u", ident,
  1637. EXTRACT_32BITS(obj_tptr+4),
  1638. EXTRACT_32BITS(obj_tptr + 8)));
  1639. obj_tlen-=12;
  1640. obj_tptr+=12;
  1641. break;
  1642. default:
  1643. obj_tlen-=4;
  1644. obj_tptr+=4;
  1645. subchannel = 1;
  1646. while(obj_tlen >= 4 ) {
  1647. ND_PRINT((ndo, "%s Subchannel #%u: %u", ident, subchannel,
  1648. EXTRACT_32BITS(obj_tptr)));
  1649. obj_tptr+=4;
  1650. obj_tlen-=4;
  1651. subchannel++;
  1652. }
  1653. break;
  1654. }
  1655. break;
  1656. default:
  1657. hexdump=TRUE;
  1658. }
  1659. case RSVP_OBJ_S2L:
  1660. switch (rsvp_obj_ctype) {
  1661. case RSVP_CTYPE_IPV4:
  1662. if (obj_tlen < 4)
  1663. return-1;
  1664. ND_PRINT((ndo, "%s Sub-LSP destination address: %s",
  1665. ident, ipaddr_string(ndo, obj_tptr)));
  1666. obj_tlen-=4;
  1667. obj_tptr+=4;
  1668. break;
  1669. case RSVP_CTYPE_IPV6:
  1670. if (obj_tlen < 16)
  1671. return-1;
  1672. ND_PRINT((ndo, "%s Sub-LSP destination address: %s",
  1673. ident, ip6addr_string(ndo, obj_tptr)));
  1674. obj_tlen-=16;
  1675. obj_tptr+=16;
  1676. break;
  1677. default:
  1678. hexdump=TRUE;
  1679. }
  1680. /*
  1681. * FIXME those are the defined objects that lack a decoder
  1682. * you are welcome to contribute code ;-)
  1683. */
  1684. case RSVP_OBJ_SCOPE:
  1685. case RSVP_OBJ_POLICY_DATA:
  1686. case RSVP_OBJ_ACCEPT_LABEL_SET:
  1687. case RSVP_OBJ_PROTECTION:
  1688. default:
  1689. if (ndo->ndo_vflag <= 1)
  1690. print_unknown_data(ndo, obj_tptr, "\n\t ", obj_tlen); /* FIXME indentation */
  1691. break;
  1692. }
  1693. /* do we also want to see a hex dump ? */
  1694. if (ndo->ndo_vflag > 1 || hexdump == TRUE)
  1695. print_unknown_data(ndo, tptr + sizeof(struct rsvp_object_header), "\n\t ", /* FIXME indentation */
  1696. rsvp_obj_len - sizeof(struct rsvp_object_header));
  1697. tptr+=rsvp_obj_len;
  1698. tlen-=rsvp_obj_len;
  1699. }
  1700. return 0;
  1701. invalid:
  1702. ND_PRINT((ndo, "%s", istr));
  1703. return -1;
  1704. trunc:
  1705. ND_PRINT((ndo, "\n\t\t"));
  1706. ND_PRINT((ndo, "%s", tstr));
  1707. return -1;
  1708. }
  1709. void
  1710. rsvp_print(netdissect_options *ndo,
  1711. register const u_char *pptr, register u_int len)
  1712. {
  1713. const struct rsvp_common_header *rsvp_com_header;
  1714. const u_char *tptr;
  1715. u_short plen, tlen;
  1716. tptr=pptr;
  1717. rsvp_com_header = (const struct rsvp_common_header *)pptr;
  1718. ND_TCHECK(*rsvp_com_header);
  1719. /*
  1720. * Sanity checking of the header.
  1721. */
  1722. if (RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags) != RSVP_VERSION) {
  1723. ND_PRINT((ndo, "ERROR: RSVP version %u packet not supported",
  1724. RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags)));
  1725. return;
  1726. }
  1727. /* in non-verbose mode just lets print the basic Message Type*/
  1728. if (ndo->ndo_vflag < 1) {
  1729. ND_PRINT((ndo, "RSVPv%u %s Message, length: %u",
  1730. RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags),
  1731. tok2str(rsvp_msg_type_values, "unknown (%u)",rsvp_com_header->msg_type),
  1732. len));
  1733. return;
  1734. }
  1735. /* ok they seem to want to know everything - lets fully decode it */
  1736. plen = tlen = EXTRACT_16BITS(rsvp_com_header->length);
  1737. ND_PRINT((ndo, "\n\tRSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
  1738. RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags),
  1739. tok2str(rsvp_msg_type_values, "unknown, type: %u",rsvp_com_header->msg_type),
  1740. rsvp_com_header->msg_type,
  1741. bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(rsvp_com_header->version_flags)),
  1742. tlen,
  1743. rsvp_com_header->ttl,
  1744. EXTRACT_16BITS(rsvp_com_header->checksum)));
  1745. if (tlen < sizeof(const struct rsvp_common_header)) {
  1746. ND_PRINT((ndo, "ERROR: common header too short %u < %lu", tlen,
  1747. (unsigned long)sizeof(const struct rsvp_common_header)));
  1748. return;
  1749. }
  1750. tptr+=sizeof(const struct rsvp_common_header);
  1751. tlen-=sizeof(const struct rsvp_common_header);
  1752. switch(rsvp_com_header->msg_type) {
  1753. case RSVP_MSGTYPE_BUNDLE:
  1754. /*
  1755. * Process each submessage in the bundle message.
  1756. * Bundle messages may not contain bundle submessages, so we don't
  1757. * need to handle bundle submessages specially.
  1758. */
  1759. while(tlen > 0) {
  1760. const u_char *subpptr=tptr, *subtptr;
  1761. u_short subplen, subtlen;
  1762. subtptr=subpptr;
  1763. rsvp_com_header = (const struct rsvp_common_header *)subpptr;
  1764. ND_TCHECK(*rsvp_com_header);
  1765. /*
  1766. * Sanity checking of the header.
  1767. */
  1768. if (RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags) != RSVP_VERSION) {
  1769. ND_PRINT((ndo, "ERROR: RSVP version %u packet not supported",
  1770. RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags)));
  1771. return;
  1772. }
  1773. subplen = subtlen = EXTRACT_16BITS(rsvp_com_header->length);
  1774. ND_PRINT((ndo, "\n\t RSVPv%u %s Message (%u), Flags: [%s], length: %u, ttl: %u, checksum: 0x%04x",
  1775. RSVP_EXTRACT_VERSION(rsvp_com_header->version_flags),
  1776. tok2str(rsvp_msg_type_values, "unknown, type: %u",rsvp_com_header->msg_type),
  1777. rsvp_com_header->msg_type,
  1778. bittok2str(rsvp_header_flag_values,"none",RSVP_EXTRACT_FLAGS(rsvp_com_header->version_flags)),
  1779. subtlen,
  1780. rsvp_com_header->ttl,
  1781. EXTRACT_16BITS(rsvp_com_header->checksum)));
  1782. if (subtlen < sizeof(const struct rsvp_common_header)) {
  1783. ND_PRINT((ndo, "ERROR: common header too short %u < %lu", subtlen,
  1784. (unsigned long)sizeof(const struct rsvp_common_header)));
  1785. return;
  1786. }
  1787. if (tlen < subtlen) {
  1788. ND_PRINT((ndo, "ERROR: common header too large %u > %u", subtlen,
  1789. tlen));
  1790. return;
  1791. }
  1792. subtptr+=sizeof(const struct rsvp_common_header);
  1793. subtlen-=sizeof(const struct rsvp_common_header);
  1794. /*
  1795. * Print all objects in the submessage.
  1796. */
  1797. if (rsvp_obj_print(ndo, subpptr, subplen, subtptr, "\n\t ", subtlen, rsvp_com_header) == -1)
  1798. return;
  1799. tptr+=subtlen+sizeof(const struct rsvp_common_header);
  1800. tlen-=subtlen+sizeof(const struct rsvp_common_header);
  1801. }
  1802. break;
  1803. case RSVP_MSGTYPE_PATH:
  1804. case RSVP_MSGTYPE_RESV:
  1805. case RSVP_MSGTYPE_PATHERR:
  1806. case RSVP_MSGTYPE_RESVERR:
  1807. case RSVP_MSGTYPE_PATHTEAR:
  1808. case RSVP_MSGTYPE_RESVTEAR:
  1809. case RSVP_MSGTYPE_RESVCONF:
  1810. case RSVP_MSGTYPE_HELLO_OLD:
  1811. case RSVP_MSGTYPE_HELLO:
  1812. case RSVP_MSGTYPE_ACK:
  1813. case RSVP_MSGTYPE_SREFRESH:
  1814. /*
  1815. * Print all objects in the message.
  1816. */
  1817. if (rsvp_obj_print(ndo, pptr, plen, tptr, "\n\t ", tlen, rsvp_com_header) == -1)
  1818. return;
  1819. break;
  1820. default:
  1821. print_unknown_data(ndo, tptr, "\n\t ", tlen);
  1822. break;
  1823. }
  1824. return;
  1825. trunc:
  1826. ND_PRINT((ndo, "\n\t\t"));
  1827. ND_PRINT((ndo, "%s", tstr));
  1828. }