PageRenderTime 32ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/plugins/epan/ethercat/packet-ams.c

https://gitlab.com/jvelando/wireshark
C | 1129 lines | 1003 code | 88 blank | 38 comment | 49 complexity | 407a43dc80e773405ff8e351557a79a3 MD5 | raw file
  1. /* packet-ams.c
  2. * Routines for ethercat packet disassembly
  3. *
  4. * Copyright (c) 2007 by Beckhoff Automation GmbH
  5. *
  6. * Wireshark - Network traffic analyzer
  7. * By Gerald Combs <gerald@wireshark.org>
  8. * Copyright 1998 Gerald Combs
  9. *
  10. * SPDX-License-Identifier: GPL-2.0-or-later
  11. */
  12. /* Include files */
  13. #include "config.h"
  14. #include <epan/packet.h>
  15. #include "packet-ams.h"
  16. void proto_register_ams(void);
  17. void proto_reg_handoff_ams(void);
  18. #define AMS_TCP_PORT 48898 /* Not IANA registered */
  19. /* Define the ams proto */
  20. int proto_ams = -1;
  21. /* Define the tree for ams */
  22. static int ett_ams = -1;
  23. static int ett_ams_stateflags = -1;
  24. static int ett_ams_adsreadrequest = -1;
  25. static int ett_ams_adsreadresponse = -1;
  26. static int ett_ams_adswriterequest = -1;
  27. static int ett_ams_adswriteresponse = -1;
  28. static int ett_ams_adsreadwriterequest = -1;
  29. static int ett_ams_adsreadwriteresponse = -1;
  30. static int ett_ams_adsreadstaterequest = -1;
  31. static int ett_ams_adsreadstateresponse = -1;
  32. static int ett_ams_adswritectrlrequest = -1;
  33. static int ett_ams_adswritectrlresponse = -1;
  34. static int ett_ams_adsreaddinforequest = -1;
  35. static int ett_ams_adsreaddinforesponse = -1;
  36. static int ett_ams_adsadddnrequest = -1;
  37. static int ett_ams_adsadddnresponse = -1;
  38. static int ett_ams_adsdeldnrequest = -1;
  39. static int ett_ams_adsdeldnresponse = -1;
  40. static int ett_ams_adsdnrequest = -1;
  41. static int hf_ams_sendernetid = -1;
  42. static int hf_ams_senderport = -1;
  43. static int hf_ams_targetnetid = -1;
  44. static int hf_ams_targetport = -1;
  45. static int hf_ams_cmdid = -1;
  46. static int hf_ams_stateflags = -1;
  47. static int hf_ams_stateresponse = -1;
  48. static int hf_ams_statenoreturn = -1;
  49. static int hf_ams_stateadscmd = -1;
  50. static int hf_ams_statesyscmd = -1;
  51. static int hf_ams_statehighprio = -1;
  52. static int hf_ams_statetimestampadded = -1;
  53. static int hf_ams_stateudp = -1;
  54. static int hf_ams_stateinitcmd = -1;
  55. static int hf_ams_statebroadcast = -1;
  56. static int hf_ams_cbdata = -1;
  57. static int hf_ams_errorcode = -1;
  58. static int hf_ams_invokeid = -1;
  59. static int hf_ams_data = -1;
  60. /*ads Commands */
  61. static int hf_ams_adsindexgroup = -1;
  62. static int hf_ams_adsindexoffset = -1;
  63. static int hf_ams_adscblength = -1;
  64. static int hf_ams_adsreadrequest = -1;
  65. static int hf_ams_adsreadresponse = -1;
  66. static int hf_ams_adsinvokeid = -1;
  67. static int hf_ams_adsresult = -1;
  68. static int hf_ams_adsdata = -1;
  69. static int hf_ams_adswriterequest = -1;
  70. static int hf_ams_adswriteresponse = -1;
  71. static int hf_ams_adsreadwriterequest = -1;
  72. static int hf_ams_adsreadwriteresponse = -1;
  73. static int hf_ams_adscbreadlength = -1;
  74. static int hf_ams_adscbwritelength = -1;
  75. static int hf_ams_adsstate = -1;
  76. static int hf_ams_adsdevicestate = -1;
  77. static int hf_ams_adsnotificationhandle = -1;
  78. static int hf_ams_adsreadstaterequest = -1;
  79. static int hf_ams_adsreadstateresponse = -1;
  80. static int hf_ams_adswritectrlrequest = -1;
  81. static int hf_ams_adswritectrlresponse = -1;
  82. static int hf_ams_adsreaddinforequest = -1;
  83. static int hf_ams_adsreaddinforesponse = -1;
  84. static int hf_ams_adsadddnrequest = -1;
  85. static int hf_ams_adsadddnresponse = -1;
  86. static int hf_ams_adsdeldnrequest = -1;
  87. static int hf_ams_adsdeldnresponse = -1;
  88. static int hf_ams_adsdnrequest = -1;
  89. /* static int hf_ams_adsdnresponse = -1; */
  90. /* static int hf_ams_adsnoteattrib = -1; */
  91. /* static int hf_ams_adsnoteblocks = -1; */
  92. /* static int hf_ams_adsversion = -1; */
  93. static int hf_ams_adsdevicename = -1;
  94. static int hf_ams_adsversionversion = -1;
  95. static int hf_ams_adsversionrevision = -1;
  96. static int hf_ams_adsversionbuild = -1;
  97. static int hf_ams_adsnoteblocksstamps = -1;
  98. /* static int hf_ams_adsnoteblocksstamp = -1; */
  99. /* static int hf_ams_adstimestamp = -1; */
  100. /* static int hf_ams_adssamplecnt = -1; */
  101. /* static int hf_ams_adsnoteblockssample = -1; */
  102. static int hf_ams_adstransmode = -1;
  103. static int hf_ams_adsmaxdelay = -1;
  104. static int hf_ams_adscycletime = -1;
  105. /* static int hf_ams_adscmpmax = -1; */
  106. /* static int hf_ams_adscmpmin = -1; */
  107. static dissector_handle_t ams_handle;
  108. static const value_string TransMode[] =
  109. {
  110. { 0, "NO TRANS"},
  111. { 1, "CLIENT CYCLE"},
  112. { 2, "CLIENT ON CHANGE"},
  113. { 3, "SERVER CYCLE"},
  114. { 4, "SERVER ON CHANGE"},
  115. { 10, "CLIENT FIRST REQUEST"},
  116. { 0, NULL }
  117. };
  118. static const value_string ErrorCode[] =
  119. {
  120. { ERR_NOERROR, "NO ERROR"},
  121. { ERR_INTERNAL, "INTERNAL"},
  122. { ERR_NORTIME, "NO RTIME"},
  123. { ERR_ALLOCLOCKEDMEM, "ALLOC LOCKED MEM"},
  124. { ERR_INSERTMAILBOX, "INSERT MAILBOX"},
  125. { ERR_WRONGRECEIVEHMSG, "WRONGRECEIVEHMSG"},
  126. { ERR_TARGETPORTNOTFOUND, "TARGET PORT NOT FOUND"},
  127. { ERR_TARGETMACHINENOTFOUND, "TARGET MACHINE NOT FOUND"},
  128. { ERR_UNKNOWNCMDID, "UNKNOWN CMDID"},
  129. { ERR_BADTASKID, "BAD TASKID"},
  130. { ERR_NOIO, "NOIO"},
  131. { ERR_UNKNOWNAMSCMD, "UNKNOWN AMSCMD"},
  132. { ERR_WIN32ERROR, "WIN32 ERROR"},
  133. { ERR_PORTNOTCONNECTED, "PORT NOT CONNECTED"},
  134. { ERR_INVALIDAMSLENGTH, "INVALID AMS LENGTH"},
  135. { ERR_INVALIDAMSNETID, "INVALID AMS NETID"},
  136. { ERR_LOWINSTLEVEL, "LOW INST LEVEL"},
  137. { ERR_NODEBUGINTAVAILABLE, "NO DEBUG INT AVAILABLE"},
  138. { ERR_PORTDISABLED, "PORT DISABLED"},
  139. { ERR_PORTALREADYCONNECTED, "PORT ALREADY CONNECTED"},
  140. { ERR_AMSSYNC_W32ERROR, "AMSSYNC_W32ERROR"},
  141. { ERR_AMSSYNC_TIMEOUT, "AMSSYNC_TIMEOUT"},
  142. { ERR_AMSSYNC_AMSERROR, "AMSSYNC_AMSERROR"},
  143. { ERR_AMSSYNC_NOINDEXINMAP, "AMSSYNC_NOINDEXINMAP"},
  144. { ERR_INVALIDAMSPORT, "INVALID AMSPORT"},
  145. { ERR_NOMEMORY, "NO MEMORY"},
  146. { ERR_TCPSEND, "TCP SEND"},
  147. { ERR_HOSTUNREACHABLE, "HOST UNREACHABLE"},
  148. { ROUTERERR_NOLOCKEDMEMORY, "ROUTERERR_NOLOCKEDMEMORY"},
  149. { ROUTERERR_RESIZEMEMORY, "ROUTERERR_RESIZEMEMORY"},
  150. { ROUTERERR_MAILBOXFULL, "ROUTERERR_MAILBOXFULL"},
  151. { ROUTERERR_DEBUGBOXFULL, "ROUTERERR_DEBUGBOXFULL"},
  152. { ROUTERERR_UNKNOWNPORTTYPE, "ROUTERERR_UNKNOWNPORTTYPE"},
  153. { ROUTERERR_NOTINITIALIZED, "ROUTERERR_NOTINITIALIZED"},
  154. { ROUTERERR_PORTALREADYINUSE, "ROUTERERR_PORTALREADYINUSE"},
  155. { ROUTERERR_NOTREGISTERED, "ROUTERERR_NOTREGISTERED "},
  156. { ROUTERERR_NOMOREQUEUES, "ROUTERERR_NOMOREQUEUES"},
  157. { ROUTERERR_INVALIDPORT, "ROUTERERR_INVALIDPORT"},
  158. { ROUTERERR_NOTACTIVATED, "ROUTERERR_NOTACTIVATED"},
  159. { IOERR_INTERNAL, "IOERR_INTERNAL"},
  160. { IOERR_BADCARDNO, "IOERR_BADCARDNO"},
  161. { IOERR_INVALIDCARDADDR, "IOERR_INVALIDCARDADDR"},
  162. { IOERR_CDLLISTFULL, "IOERR_CDLLISTFULL"},
  163. { IOERR_BADCDLPARAM, "IOERR_BADCDLPARAM"},
  164. { IOERR_OPENIOFAILED, "IOERR_OPENIOFAILED"},
  165. { IOERR_RESETIOFAILED, "IOERR_RESETIOFAILED"},
  166. { IOERR_UNKNOWNDEVICE, "IOERR_UNKNOWNDEVICE"},
  167. { IOERR_UNKNOWNDEVICEID, "IOERR_UNKNOWNDEVICEID"},
  168. { IOERR_UNKNOWNIMAGEID, "IOERR_UNKNOWNIMAGEID"},
  169. { IOERR_GETIOSTATE, "IOERR_GETIOSTATE"},
  170. { IOERR_BADIMAGEID, "IOERR_BADIMAGEID"},
  171. { IOERR_NOMORECLIENTSPACE, "IOERR_NOMORECLIENTSPACE"},
  172. { IOERR_CLIENTINFONOTFOUND, "IOERR_CLIENTINFONOTFOUND"},
  173. { IOERR_CDLNOTINUSE, "IOERR_CDLNOTINUSE"},
  174. { IOERR_TIMEOUTWITHDEVICE, "IOERR_TIMEOUTWITHDEVICE"},
  175. { IOERR_C1220FUNC_1, "IOERR_C1220FUNC_1"},
  176. { IOERR_C1220FUNC_9, "IOERR_C1220FUNC_9"},
  177. { IOERR_C1220FUNC_C, "IOERR_C1220FUNC_C"},
  178. { IOERR_C1220FUNC_10, "IOERR_C1220FUNC_10"},
  179. { IOERR_C1220FUNC_1_MAXSEND, "IOERR_C1220FUNC_1_MAXSEND"},
  180. { IOERR_C1220FUNC_1_ADDRSET, "IOERR_C1220FUNC_1_ADDRSET"},
  181. { IOERR_C1220FUNC_1_BREAK, "IOERR_C1220FUNC_1_BREAK"},
  182. { IOERR_C1220FUNC_1_BREAK0, "IOERR_C1220FUNC_1_BREAK0"},
  183. { IOERR_C1220FUNC_1_BREAK1, "IOERR_C1220FUNC_1_BREAK1"},
  184. { IOERR_C1220FUNC_1_BREAK2, "IOERR_C1220FUNC_1_BREAK2"},
  185. { IOERR_C1220FUNC_1_BREAK3, "IOERR_C1220FUNC_1_BREAK3"},
  186. { IOERR_C1220FUNC_1_BREAK4, "IOERR_C1220FUNC_1_BREAK4"},
  187. { IOERR_C1220FUNC_1_BREAK5, "IOERR_C1220FUNC_1_BREAK5"},
  188. { IOERR_C1220FUNC_1_BREAK6, "IOERR_C1220FUNC_1_BREAK6"},
  189. { IOERR_C1220FUNC_1_BREAK7, "IOERR_C1220FUNC_1_BREAK7"},
  190. { IOERR_C1220FUNC_1_BREAK8, "IOERR_C1220FUNC_1_BREAK8"},
  191. { IOERR_C1220FUNC_1_BREAK9, "IOERR_C1220FUNC_1_BREAK9"},
  192. { IOERR_C1220FUNC_1_BREAK10, "IOERR_C1220FUNC_1_BREAK10"},
  193. { IOERR_C1220FUNC_1_BREAK11, "IOERR_C1220FUNC_1_BREAK11"},
  194. { IOERR_C1220FUNC_1_BREAK12, "IOERR_C1220FUNC_1_BREAK12"},
  195. { IOERR_C1220FUNC_1_BREAK13, "IOERR_C1220FUNC_1_BREAK13"},
  196. { IOERR_C1220FUNC_1_BREAK14, "IOERR_C1220FUNC_1_BREAK14"},
  197. { IOERR_C1220FUNC_1_BREAK15, "IOERR_C1220FUNC_1_BREAK15"},
  198. { IOERR_C1220FUNC_1_BREAK16, "IOERR_C1220FUNC_1_BREAK16"},
  199. { IOERR_SPC3DEVINITDP, "IOERR_SPC3DEVINITDP"},
  200. { IOERR_SPC3UPDATEOUTPUT, "IOERR_SPC3UPDATEOUTPUT"},
  201. { IOERR_CIF30READDIAG, "IOERR_CIF30READDIAG"},
  202. { IOERR_CIF30COMMNOTSTARTED, "IOERR_CIF30COMMNOTSTARTED"},
  203. { IOERR_CIF30SLAVEPARASIZE, "IOERR_CIF30SLAVEPARASIZE"},
  204. { IOERR_CIF30NOPARAS, "IOERR_CIF30NOPARAS"},
  205. { IOERR_CIF30SLAVEERROR, "IOERR_CIF30SLAVEERROR"},
  206. { IOERR_CIF30WATCHDOGEXPIRED, "IOERR_CIF30WATCHDOGEXPIRED"},
  207. { IOERR_UNKNOWNDEVICECMD, "IOERR_UNKNOWNDEVICECMD"},
  208. { IOERR_CIF40MESSAGEHANDLING, "IOERR_CIF40MESSAGEHANDLING"},
  209. { IOERR_CIF40PARAERROR, "IOERR_CIF40PARAERROR"},
  210. { IOERR_CIF40WATCHDOGEXPIRED, "IOERR_CIF40WATCHDOGEXPIRED"},
  211. { IOERR_CIF40FLAGERROR, "IOERR_CIF40FLAGERROR"},
  212. { IOERR_CIF40COMMNOTSTARTED, "IOERR_CIF40COMMNOTSTARTED"},
  213. { IOERR_CIF40READDIAG, "IOERR_CIF40READDIAG"},
  214. { IOERR_CIF40SLAVEERROR, "IOERR_CIF40SLAVEERROR"},
  215. { IOERR_CIF40GLOBALERROR, "IOERR_CIF40GLOBALERROR"},
  216. { IOERR_CIF40CONFIGLIST, "IOERR_CIF40CONFIGLIST"},
  217. { IOERR_CP5412A2SLAVEPARASIZE, "IOERR_CP5412A2SLAVEPARASIZE"},
  218. { IOERR_CP5412A2NOPARAS, "IOERR_CP5412A2NOPARAS"},
  219. { IOERR_CP5412A2SLAVEERROR, "IOERR_CP5412A2SLAVEERROR"},
  220. { IOERR_CP5412A2FATAL, "IOERR_CP5412A2FATAL"},
  221. { IOERR_CP5412A2MAILBOXUSED, "IOERR_CP5412A2MAILBOXUSED"},
  222. { IOERR_BEGINCONFIGWHILETICKER, "IOERR_BEGINCONFIGWHILETICKER"},
  223. { IOERR_UNEXPECTEDBOXCOUNT, "IOERR_UNEXPECTEDBOXCOUNT"},
  224. { IOERR_C1200CHECKADDR, "IOERR_C1200CHECKADDR"},
  225. { IOERR_C1200INTENSITYTEST, "IOERR_C1200INTENSITYTEST"},
  226. { IOERR_NOIMAGE, "IOERR_NOIMAGE"},
  227. { IOERR_INVALIDIMAGEOFFSSIZE, "IOERR_INVALIDIMAGEOFFSSIZE"},
  228. { IOERR_FORCESCOUNTEXCEEDEDMAXIMUM, "IOERR_FORCESCOUNTEXCEEDEDMAXIMUM"},
  229. { IOERR_SERCOSLIFECOUNTERERR, "IOERR_SERCOSLIFECOUNTERERR"},
  230. { IOERR_C1220NOTFOUND, "IOERR_C1220NOTFOUND"},
  231. { IOERR_AMSDEVICENOAMSINTF, "IOERR_AMSDEVICENOAMSINTF"},
  232. { IOERR_AMSDEVICEAMSCMDIDNOTSUPP, "IOERR_AMSDEVICEAMSCMDIDNOTSUPP"},
  233. { IOERR_AMSDEVICEAMSSERVICERUNNING, "IOERR_AMSDEVICEAMSSERVICERUNNING"},
  234. { IOERR_PLCINTERFACE_BUSY, "IOERR_PLCINTERFACE_BUSY"},
  235. { IOERR_PLCINTERFACE_FAULT, "IOERR_PLCINTERFACE_FAULT"},
  236. { IOERR_PLCINTERFACE_TIMEOUT, "IOERR_PLCINTERFACE_TIMEOUT"},
  237. { IOERR_PLCINTERFACE_RESETTIMEOUT, "IOERR_PLCINTERFACE_RESETTIMEOUT"},
  238. { IOERR_PLCINTERFACE_NODATAEXCH, "IOERR_PLCINTERFACE_NODATAEXCH"},
  239. { IOERR_PLCINTERFACE_RESET, "IOERR_PLCINTERFACE_RESET"},
  240. { IOERR_CP5412A2INVALIDADDR, "IOERR_CP5412A2INVALIDADDR"},
  241. { IOERR_CP5412A2INVALIDPORT, "IOERR_CP5412A2INVALIDPORT"},
  242. { IOERR_AMSDEVICEBADBOXNO, "IOERR_AMSDEVICEBADBOXNO"},
  243. { IOERR_AMSDEVICEBADTYPE, "IOERR_AMSDEVICEBADTYPE"},
  244. { IOERR_AMSDEVICEILLEGALADDRESS, "IOERR_AMSDEVICEILLEGALADDRESS"},
  245. { IOERR_CP5412A2INVALIDBOX, "IOERR_CP5412A2INVALIDBOX"},
  246. { IOERR_AMSDEVICEFIFOOVERFLOW, "IOERR_AMSDEVICEFIFOOVERFLOW"},
  247. { IOERR_AMSDEVICEAMSSEQUENCEERROR, "IOERR_AMSDEVICEAMSSEQUENCEERROR"},
  248. { IOERR_CP5412A2DPV1SYNTAXERROR, "IOERR_CP5412A2DPV1SYNTAXERROR"},
  249. { IOERR_CP5412A2DEVICENOTRUNNING, "IOERR_CP5412A2DEVICENOTRUNNING"},
  250. { IOERR_AMSDEVICENOTRUNNING, "IOERR_AMSDEVICENOTRUNNING"},
  251. { IOERR_AMSDEVICEBOXNOTDEFINED, "IOERR_AMSDEVICEBOXNOTDEFINED"},
  252. { IOERR_CP5412A2BADSERVICEPARA, "IOERR_CP5412A2BADSERVICEPARA"},
  253. { IOERR_CP5412A2FIFOOVERFLOW, "IOERR_CP5412A2FIFOOVERFLOW"},
  254. { IOERR_COMPORTOPENFAILED, "IOERR_COMPORTOPENFAILED"},
  255. { IOERR_CIF30BADMESSAGERESPONSE, "IOERR_CIF30BADMESSAGERESPONSE"},
  256. { IOERR_CIF30DELETEDATABASE, "IOERR_CIF30DELETEDATABASE"},
  257. { IOERR_CIF30STARTSEQFAILED, "IOERR_CIF30STARTSEQFAILED"},
  258. { IOERR_CIF30DOWNLOADFAILED, "IOERR_CIF30DOWNLOADFAILED"},
  259. { IOERR_CIF30ENDSEQFAILED, "IOERR_CIF30ENDSEQFAILED"},
  260. { IOERR_CIF30BUSLOADFAILED, "IOERR_CIF30BUSLOADFAILED"},
  261. { IOERR_PLCINTERFACE_RESETREQ, "IOERR_PLCINTERFACE_RESETREQ"},
  262. { IOERR_CP5412A2INVALIDCYCLETICKS, "IOERR_CP5412A2INVALIDCYCLETICKS"},
  263. { IOERR_CP5412A2DPBUSFAULT, "IOERR_CP5412A2DPBUSFAULT"},
  264. { IOERR_INVALIDTERMCONFIG, "IOERR_INVALIDTERMCONFIG"},
  265. { IOERR_SERCANSBREAK, "IOERR_SERCANSBREAK"},
  266. { IOERR_SERCANSPHASE0, "IOERR_SERCANSPHASE0"},
  267. { IOERR_SERCANSPHASE1, "IOERR_SERCANSPHASE1"},
  268. { IOERR_SERCANSPHASE2, "IOERR_SERCANSPHASE2"},
  269. { IOERR_SERCANSPHASE3, "IOERR_SERCANSPHASE3"},
  270. { IOERR_SERCANSPHASE4, "IOERR_SERCANSPHASE4"},
  271. { IOERR_SERCANSNCSERVICECHNFAILED, "IOERR_SERCANSNCSERVICECHNFAILED"},
  272. { IOERR_RESOURCECONFICT, "IOERR_RESOURCECONFICT"},
  273. { IOERR_C1220INITSTRINGCOMM, "IOERR_C1220INITSTRINGCOMM"},
  274. { IOERR_C1220REGSTRINGSLAVE, "IOERR_C1220REGSTRINGSLAVE"},
  275. { IOERR_C1220STRREGFAULT, "IOERR_C1220STRREGFAULT"},
  276. { IOERR_IOSTATEBUSY, "IOERR_IOSTATEBUSY"},
  277. { IOERR_IBSSCITWATCHDOGEXPIRED, "IOERR_IBSSCITWATCHDOGEXPIRED"},
  278. { IOERR_IBSSCITSYNCMAILBOXERROR, "IOERR_IBSSCITSYNCMAILBOXERROR"},
  279. { IOERR_IBSSCITCONFIRMDIAGERROR, "IOERR_IBSSCITCONFIRMDIAGERROR"},
  280. { IOERR_IBSSCITCREATECFGERROR, "IOERR_IBSSCITCREATECFGERROR"},
  281. { 0, NULL }
  282. };
  283. static const value_string AdsErrorMode[] =
  284. {
  285. { ADSERR_NOERR, "NO ERROR", },
  286. { ADSERR_DEVICE_ERROR, "ERROR", },
  287. { ADSERR_DEVICE_SRVNOTSUPP, "SRV NOT SUPP", },
  288. { ADSERR_DEVICE_INVALIDGRP, "INVALID GRP", },
  289. { ADSERR_DEVICE_INVALIDOFFSET, "INVALID OFFSET", },
  290. { ADSERR_DEVICE_INVALIDACCESS, "INVALID ACCESS", },
  291. { ADSERR_DEVICE_INVALIDSIZE, "INVALID SIZE", },
  292. { ADSERR_DEVICE_INVALIDDATA, "INVALID DATA", },
  293. { ADSERR_DEVICE_NOTREADY, "NOT READY", },
  294. { ADSERR_DEVICE_BUSY, "BUSY", },
  295. { ADSERR_DEVICE_INVALIDCONTEXT, "INVALID CONTEXT", },
  296. { ADSERR_DEVICE_NOMEMORY, "NO MEMORY", },
  297. { ADSERR_DEVICE_INVALIDPARM, "INVALID PARM", },
  298. { ADSERR_DEVICE_NOTFOUND, "NOT FOUND", },
  299. { ADSERR_DEVICE_SYNTAX, "SYNTAX", },
  300. { ADSERR_DEVICE_INCOMPATIBLE, "INCOMPATIBLE", },
  301. { ADSERR_DEVICE_EXISTS, "EXISTS", },
  302. { ADSERR_DEVICE_SYMBOLNOTFOUND, "SYMBOL NOT FOUND", },
  303. { ADSERR_DEVICE_SYMBOLVERSIONINVALID, "SYMBOL VERSION INVALID", },
  304. { ADSERR_DEVICE_INVALIDSTATE, "INVALID STATE", },
  305. { ADSERR_DEVICE_TRANSMODENOTSUPP, "TRANS MODE NOT SUPP", },
  306. { ADSERR_DEVICE_NOTIFYHNDINVALID, "NOTIFY HND INVALID", },
  307. { ADSERR_DEVICE_CLIENTUNKNOWN, "CLIENT UNKNOWN", },
  308. { ADSERR_DEVICE_NOMOREHDLS, "NO MORE HDLS", },
  309. { ADSERR_DEVICE_INVALIDWATCHSIZE, "INVALID WATCHSIZE", },
  310. { ADSERR_DEVICE_NOTINIT, "NOT INIT", },
  311. { ADSERR_DEVICE_TIMEOUT, "TIMEOUT", },
  312. { ADSERR_DEVICE_NOINTERFACE, "NO INTERFACE", },
  313. { ADSERR_DEVICE_INVALIDINTERFACE, "INVALID INTERFACE", },
  314. { ADSERR_DEVICE_INVALIDCLSID, "INVALID CLSID", },
  315. { ADSERR_DEVICE_INVALIDOBJID, "INVALID OBJID", },
  316. { ADSERR_DEVICE_PENDING, "PENDING", },
  317. { ADSERR_DEVICE_ABORTED, "ABORTED", },
  318. { ADSERR_DEVICE_WARNING, "WARNING", },
  319. { ADSERR_DEVICE_INVALIDARRAYIDX, "INVALID ARRAY IDX", },
  320. { ADSERR_CLIENT_ERROR, "CLIENT ERROR", },
  321. { ADSERR_CLIENT_INVALIDPARM, "CLIENT INVALID PARM", },
  322. { ADSERR_CLIENT_LISTEMPTY, "CLIENT LIST EMPTY", },
  323. { ADSERR_CLIENT_VARUSED, "CLIENT VAR USED", },
  324. { ADSERR_CLIENT_DUPLINVOKEID, "CLIENT DUPL INVOKEID", },
  325. { ADSERR_CLIENT_SYNCTIMEOUT, "CLIENT SYNC TIMEOUT", },
  326. { ADSERR_CLIENT_W32ERROR, "CLIENT W32ERROR", },
  327. { ADSERR_CLIENT_TIMEOUTINVALID, "CLIENT TIMEOUT INVALID", },
  328. { ADSERR_CLIENT_PORTNOTOPEN, "CLIENT PORT NOT OPEN", },
  329. { ADSERR_CLIENT_NOAMSADDR, "CLIENT NO AMS ADDR", },
  330. { ADSERR_CLIENT_SYNCINTERNAL, "CLIENT SYNC INTERNAL", },
  331. { ADSERR_CLIENT_ADDHASH, "CLIENT ADD HASH", },
  332. { ADSERR_CLIENT_REMOVEHASH, "CLIENT REMOVE HASH", },
  333. { ADSERR_CLIENT_NOMORESYM, "CLIENT NO MORE SYM", },
  334. { ADSERR_CLIENT_SYNCRESINVALID, "CLIENT SYNC RES INVALID", },
  335. { ADSERR_CLIENT_SYNCPORTLOCKED, "CLIENT SYNC PORT LOCKED", },
  336. { 0, NULL }
  337. };
  338. /* AMS Command Id
  339. * https://infosys.beckhoff.com/english.php?content=../content/1033/tcadsamsspec/html/tcadsamsspec_adscmd_readstate.htm&id=10652
  340. */
  341. static const value_string AMS_CommandId_vals[] =
  342. {
  343. { ADSSRVID_INVALID, "Invalid", },
  344. { ADSSRVID_READDEVICEINFO, "ADS Read Device Info", },
  345. { ADSSRVID_READ, "ADS Read", },
  346. { ADSSRVID_WRITE, "ADS Write", },
  347. { ADSSRVID_READSTATE, "ADS Read State", },
  348. { ADSSRVID_WRITECTRL, "ADS Write Control", },
  349. { ADSSRVID_ADDDEVICENOTE, "ADS Add Device Notification", },
  350. { ADSSRVID_DELDEVICENOTE, "ADS Delete Device Notification", },
  351. { ADSSRVID_DEVICENOTE, "ADS Device Notification", },
  352. { ADSSRVID_READWRITE, "ADS Read Write", },
  353. { 0, NULL }
  354. };
  355. static void NetIdFormater(tvbuff_t *tvb, guint offset, char *szText, gint nMax)
  356. {
  357. snprintf ( szText, nMax, "%d.%d.%d.%d.%d.%d", tvb_get_guint8(tvb, offset),
  358. tvb_get_guint8(tvb, offset+1),
  359. tvb_get_guint8(tvb, offset+2),
  360. tvb_get_guint8(tvb, offset+3),
  361. tvb_get_guint8(tvb, offset+4),
  362. tvb_get_guint8(tvb, offset+5)
  363. );
  364. }
  365. /*ams*/
  366. static gint dissect_ams_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset)
  367. {
  368. proto_item *ti, *anItem;
  369. proto_tree *ams_tree = NULL, *ams_adstree, *ams_statetree;
  370. guint ams_length = tvb_reported_length(tvb);
  371. guint16 stateflags = 0;
  372. guint16 cmdId = 0;
  373. guint32 cbdata = 0;
  374. char szText[200];
  375. int nMax = sizeof(szText)-1;
  376. col_set_str(pinfo->cinfo, COL_PROTOCOL, "AMS");
  377. col_clear(pinfo->cinfo, COL_INFO);
  378. if( ams_length < AmsHead_Len )
  379. return offset;
  380. if (tree)
  381. {
  382. ti = proto_tree_add_item(tree, proto_ams, tvb, 0, -1, ENC_NA);
  383. ams_tree = proto_item_add_subtree(ti, ett_ams);
  384. NetIdFormater(tvb, offset, szText, nMax);
  385. proto_tree_add_string(ams_tree, hf_ams_targetnetid, tvb, offset, AmsNetId_Len, szText);
  386. offset += AmsNetId_Len;
  387. proto_tree_add_item(ams_tree, hf_ams_targetport, tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  388. offset += (int)sizeof(guint16);
  389. NetIdFormater(tvb, offset, szText, nMax);
  390. proto_tree_add_string(ams_tree, hf_ams_sendernetid, tvb, offset, AmsNetId_Len, szText);
  391. offset += AmsNetId_Len;
  392. proto_tree_add_item(ams_tree, hf_ams_senderport, tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  393. offset += (int)sizeof(guint16);
  394. proto_tree_add_item(ams_tree, hf_ams_cmdid, tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  395. cmdId = tvb_get_letohs(tvb, offset);
  396. offset+=(int)sizeof(guint16);
  397. anItem = proto_tree_add_item(ams_tree, hf_ams_stateflags, tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  398. ams_statetree = proto_item_add_subtree(anItem, ett_ams_stateflags);
  399. proto_tree_add_item(ams_statetree, hf_ams_stateresponse,tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  400. proto_tree_add_item(ams_statetree, hf_ams_statenoreturn,tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  401. proto_tree_add_item(ams_statetree, hf_ams_stateadscmd,tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  402. proto_tree_add_item(ams_statetree, hf_ams_statesyscmd,tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  403. proto_tree_add_item(ams_statetree, hf_ams_statehighprio,tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  404. proto_tree_add_item(ams_statetree, hf_ams_statetimestampadded,tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  405. proto_tree_add_item(ams_statetree, hf_ams_stateudp,tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  406. proto_tree_add_item(ams_statetree, hf_ams_stateinitcmd,tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  407. proto_tree_add_item(ams_statetree, hf_ams_statebroadcast,tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  408. stateflags = tvb_get_letohs(tvb, offset);
  409. offset+=(int)sizeof(guint16);
  410. proto_tree_add_item(ams_tree, hf_ams_cbdata, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  411. cbdata = tvb_get_letohl(tvb,offset);
  412. offset+=(int)sizeof(guint32);
  413. proto_tree_add_item(ams_tree, hf_ams_errorcode, tvb, offset, (int)sizeof(guint32),ENC_LITTLE_ENDIAN);
  414. offset+=(int)sizeof(guint32);
  415. proto_tree_add_item(ams_tree, hf_ams_invokeid, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  416. offset+=(int)sizeof(guint32);
  417. }
  418. else
  419. {
  420. offset+=AmsHead_Len;
  421. }
  422. if ( (stateflags & AMSCMDSF_ADSCMD) != 0 )
  423. {
  424. /* ADS */
  425. if ( (stateflags & AMSCMDSF_RESPONSE) == 0 )
  426. {
  427. /* Request */
  428. switch ( cmdId )
  429. {
  430. case ADSSRVID_READ:
  431. {
  432. col_append_str(pinfo->cinfo, COL_INFO, "ADS Read Request");
  433. if( tree )
  434. {
  435. anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadrequest, tvb, offset, ams_length-offset, ENC_NA);
  436. if( ams_length-offset >= TAdsReadReq_Len )
  437. {
  438. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadrequest);
  439. proto_tree_add_item(ams_adstree, hf_ams_adsindexgroup, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  440. offset+=(int)sizeof(guint32);
  441. proto_tree_add_item(ams_adstree, hf_ams_adsindexoffset, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  442. offset+=(int)sizeof(guint32);
  443. proto_tree_add_item(ams_adstree, hf_ams_adscblength, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  444. offset+=(int)sizeof(guint32);
  445. }
  446. }
  447. }
  448. break;
  449. case ADSSRVID_WRITE:
  450. {
  451. col_append_str(pinfo->cinfo, COL_INFO, "ADS Write Request");
  452. if( tree )
  453. {
  454. anItem = proto_tree_add_item(ams_tree, hf_ams_adswriterequest, tvb, offset, ams_length-offset, ENC_NA);
  455. if( ams_length-offset >= TAdsWriteReq_Len - (int)sizeof(guint16) )
  456. {
  457. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adswriterequest);
  458. proto_tree_add_item(ams_adstree, hf_ams_adsindexgroup, tvb, offset, 4, ENC_LITTLE_ENDIAN);
  459. offset+=(int)sizeof(guint32);
  460. proto_tree_add_item(ams_adstree, hf_ams_adsindexoffset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
  461. offset+=(int)sizeof(guint32);
  462. proto_tree_add_item(ams_adstree, hf_ams_adscblength, tvb, offset, 4, ENC_LITTLE_ENDIAN);
  463. offset+=(int)sizeof(guint32);
  464. proto_tree_add_item(ams_adstree, hf_ams_adsdata, tvb, offset, ams_length-offset, ENC_NA);
  465. }
  466. }
  467. }
  468. break;
  469. case ADSSRVID_READWRITE:
  470. {
  471. col_append_str(pinfo->cinfo, COL_INFO, "ADS Read Write Request");
  472. if( tree )
  473. {
  474. anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadwriterequest, tvb, offset, ams_length-offset, ENC_NA);
  475. if( ams_length-offset >= TAdsReadWriteReq_Len - (int)sizeof(guint16))
  476. {
  477. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadwriterequest);
  478. proto_tree_add_item(ams_adstree, hf_ams_adsindexgroup, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  479. offset+=(int)sizeof(guint32);
  480. proto_tree_add_item(ams_adstree, hf_ams_adsindexoffset, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  481. offset+=(int)sizeof(guint32);
  482. proto_tree_add_item(ams_adstree, hf_ams_adscbreadlength, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  483. offset+=(int)sizeof(guint32);
  484. proto_tree_add_item(ams_adstree, hf_ams_adscbwritelength, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  485. offset+=(int)sizeof(guint32);
  486. proto_tree_add_item(ams_adstree, hf_ams_adsdata, tvb, offset, ams_length-offset, ENC_NA);
  487. }
  488. }
  489. }
  490. break;
  491. case ADSSRVID_READSTATE:
  492. {
  493. col_append_str(pinfo->cinfo, COL_INFO, "ADS Read State Request");
  494. if( tree && cbdata !=0 )
  495. {
  496. anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadstaterequest, tvb, offset, ams_length-offset, ENC_NA);
  497. if( ams_length-offset >= TAdsReadStateReq_Len )
  498. {
  499. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadstaterequest);
  500. proto_tree_add_item(ams_adstree, hf_ams_adsinvokeid, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  501. }
  502. }
  503. }
  504. break;
  505. case ADSSRVID_WRITECTRL:
  506. {
  507. col_append_str(pinfo->cinfo, COL_INFO, "ADS Write Control Request");
  508. if( tree )
  509. {
  510. anItem = proto_tree_add_item(ams_tree, hf_ams_adswritectrlrequest, tvb, offset, ams_length-offset, ENC_NA);
  511. if( ams_length-offset >= TAdsWriteControlReq_Len - (int)sizeof(guint16) )
  512. {
  513. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adswritectrlrequest);
  514. proto_tree_add_item(ams_adstree, hf_ams_adsstate, tvb, offset, 2, ENC_LITTLE_ENDIAN);
  515. offset+=(int)sizeof(guint16);
  516. proto_tree_add_item(ams_adstree, hf_ams_adsdevicestate, tvb, offset, 2, ENC_LITTLE_ENDIAN);
  517. offset+=(int)sizeof(guint16);
  518. proto_tree_add_item(ams_adstree, hf_ams_adscblength, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  519. offset+=(int)sizeof(guint32);
  520. proto_tree_add_item(ams_adstree, hf_ams_adsdata, tvb, offset, ams_length-offset, ENC_NA);
  521. }
  522. }
  523. }
  524. break;
  525. case ADSSRVID_READDEVICEINFO:
  526. {
  527. col_append_str(pinfo->cinfo, COL_INFO, "ADS Read Device Info Request");
  528. if( tree && cbdata !=0 )
  529. {
  530. anItem = proto_tree_add_item(ams_tree, hf_ams_adsreaddinforequest, tvb, offset, ams_length-offset, ENC_NA);
  531. if( ams_length-offset >= TAdsReadDeviceInfoReq_Len )
  532. {
  533. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreaddinforequest);
  534. proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  535. }
  536. }
  537. }
  538. break;
  539. case ADSSRVID_ADDDEVICENOTE:
  540. {
  541. col_append_str(pinfo->cinfo, COL_INFO, "ADS Add Device Notification Request");
  542. if( tree )
  543. {
  544. anItem = proto_tree_add_item(ams_tree, hf_ams_adsadddnrequest, tvb, offset, ams_length-offset, ENC_NA);
  545. if( ams_length-offset >= TAdsAddDeviceNotificationReq_Len )
  546. {
  547. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsadddnrequest);
  548. proto_tree_add_item(ams_adstree, hf_ams_adsindexgroup, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  549. offset+=(int)sizeof(guint32);
  550. proto_tree_add_item(ams_adstree, hf_ams_adsindexoffset, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  551. offset+=(int)sizeof(guint32);
  552. proto_tree_add_item(ams_adstree, hf_ams_adscblength, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  553. offset+=(int)sizeof(guint32);
  554. proto_tree_add_item(ams_adstree, hf_ams_adstransmode, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  555. offset+=(int)sizeof(guint32);
  556. proto_tree_add_item(ams_adstree, hf_ams_adsmaxdelay, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  557. offset+=(int)sizeof(guint32);
  558. proto_tree_add_item(ams_adstree, hf_ams_adscycletime, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  559. offset+=(int)sizeof(guint32);
  560. }
  561. }
  562. }
  563. break;
  564. case ADSSRVID_DELDEVICENOTE:
  565. {
  566. col_append_str(pinfo->cinfo, COL_INFO, "ADS Delete Device Notification Request");
  567. if( tree )
  568. {
  569. anItem = proto_tree_add_item(ams_tree, hf_ams_adsdeldnrequest, tvb, offset, ams_length-offset, ENC_NA);
  570. if( ams_length-offset >= TAdsDelDeviceNotificationReq_Len )
  571. {
  572. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsdeldnrequest);
  573. proto_tree_add_item(ams_adstree, hf_ams_adsnotificationhandle, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  574. }
  575. }
  576. }
  577. break;
  578. case ADSSRVID_DEVICENOTE:
  579. {
  580. col_append_str(pinfo->cinfo, COL_INFO, "ADS Device Notification Request");
  581. if( tree )
  582. {
  583. /*guint32 cbLength;
  584. guint32 nStamps;*/
  585. anItem = proto_tree_add_item(ams_tree, hf_ams_adsdnrequest, tvb, offset, ams_length-offset, ENC_NA);
  586. if( ams_length-offset >= TAdsDeviceNotificationReq_Len )
  587. {
  588. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsdnrequest);
  589. proto_tree_add_item(ams_adstree, hf_ams_adscblength, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  590. /*cbLength = tvb_get_letohs(tvb, offset);*/
  591. offset+=(int)sizeof(guint32);
  592. proto_tree_add_item(ams_adstree, hf_ams_adsnoteblocksstamps, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  593. /*nStamps = tvb_get_letohs(tvb, offset);*/
  594. offset+=(int)sizeof(guint32);
  595. /*ToDo: dissect noteblocks*/
  596. }
  597. }
  598. }
  599. break;
  600. }
  601. }
  602. else
  603. {
  604. /* Response */
  605. switch ( cmdId )
  606. {
  607. case ADSSRVID_READ:
  608. {
  609. col_append_str(pinfo->cinfo, COL_INFO, "ADS Read Response");
  610. if( tree )
  611. {
  612. anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadresponse, tvb, offset, ams_length-offset, ENC_NA);
  613. if( ams_length-offset >= TAdsReadRes_Len - (int)sizeof(guint16) )
  614. {
  615. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadresponse);
  616. proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  617. offset+=(int)sizeof(guint32);
  618. proto_tree_add_item(ams_adstree, hf_ams_adscblength, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  619. offset+=(int)sizeof(guint32);
  620. proto_tree_add_item(ams_adstree, hf_ams_adsdata, tvb, offset, ams_length-offset, ENC_NA);
  621. }
  622. }
  623. }
  624. break;
  625. case ADSSRVID_WRITE:
  626. {
  627. col_append_str(pinfo->cinfo, COL_INFO, "ADS Write Response");
  628. if( tree )
  629. {
  630. anItem = proto_tree_add_item(ams_tree, hf_ams_adswriteresponse, tvb, offset, ams_length-offset, ENC_NA);
  631. if( ams_length-offset >= TAdsWriteRes_Len )
  632. {
  633. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adswriteresponse);
  634. proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  635. }
  636. }
  637. }
  638. break;
  639. case ADSSRVID_READWRITE:
  640. {
  641. col_append_str(pinfo->cinfo, COL_INFO, "ADS Read Write Response");
  642. if( tree )
  643. {
  644. anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadwriteresponse, tvb, offset, ams_length-offset, ENC_NA);
  645. if( ams_length-offset >= TAdsReadWriteRes_Len - (int)sizeof(guint16) )
  646. {
  647. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadwriteresponse);
  648. proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  649. offset+=(int)sizeof(guint32);
  650. proto_tree_add_item(ams_adstree, hf_ams_adscblength, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  651. offset+=(int)sizeof(guint32);
  652. proto_tree_add_item(ams_adstree, hf_ams_adsdata, tvb, offset, ams_length-offset, ENC_NA);
  653. }
  654. }
  655. }
  656. break;
  657. case ADSSRVID_READSTATE:
  658. {
  659. col_append_str(pinfo->cinfo, COL_INFO, "ADS Read State Response");
  660. if( tree )
  661. {
  662. anItem = proto_tree_add_item(ams_tree, hf_ams_adsreadstateresponse, tvb, offset, ams_length-offset, ENC_NA);
  663. if( ams_length-offset >= TAdsReadStateRes_Len )
  664. {
  665. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreadstateresponse);
  666. proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  667. offset+=(int)sizeof(guint32);
  668. proto_tree_add_item(ams_adstree, hf_ams_adsstate, tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  669. offset+=(int)sizeof(guint16);
  670. proto_tree_add_item(ams_adstree, hf_ams_adsdevicestate, tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  671. }
  672. }
  673. }
  674. break;
  675. case ADSSRVID_WRITECTRL:
  676. {
  677. col_append_str(pinfo->cinfo, COL_INFO, "ADS Write Control Response");
  678. if( tree )
  679. {
  680. anItem = proto_tree_add_item(ams_tree, hf_ams_adswritectrlresponse, tvb, offset, ams_length-offset, ENC_NA);
  681. if( ams_length-offset >= TAdsWriteControlRes_Len )
  682. {
  683. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adswritectrlresponse);
  684. proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  685. }
  686. }
  687. }
  688. break;
  689. case ADSSRVID_READDEVICEINFO:
  690. {
  691. col_append_str(pinfo->cinfo, COL_INFO, "ADS Read Device Info Response");
  692. if( tree )
  693. {
  694. anItem = proto_tree_add_item(ams_tree, hf_ams_adsreaddinforesponse, tvb, offset, ams_length-offset, ENC_NA);
  695. if( ams_length-offset >= TAdsReadDeviceInfoRes_Len )
  696. {
  697. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsreaddinforesponse);
  698. proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  699. offset+=(int)sizeof(guint32);
  700. proto_tree_add_item(ams_adstree, hf_ams_adsversionversion, tvb, offset++, (int)sizeof(guint8), ENC_LITTLE_ENDIAN);
  701. proto_tree_add_item(ams_adstree, hf_ams_adsversionrevision, tvb, offset++, (int)sizeof(guint8), ENC_LITTLE_ENDIAN);
  702. proto_tree_add_item(ams_adstree, hf_ams_adsversionbuild, tvb, offset, (int)sizeof(guint16), ENC_LITTLE_ENDIAN);
  703. offset+=(int)sizeof(guint16);
  704. proto_tree_add_item(ams_adstree, hf_ams_adsdevicename, tvb, offset, ams_length-offset, ENC_ASCII|ENC_NA);
  705. }
  706. }
  707. }
  708. break;
  709. case ADSSRVID_ADDDEVICENOTE:
  710. {
  711. col_append_str(pinfo->cinfo, COL_INFO, "ADS Device Notification Response");
  712. if( tree )
  713. {
  714. anItem = proto_tree_add_item(ams_tree, hf_ams_adsadddnresponse, tvb, offset, ams_length-offset, ENC_NA);
  715. if( ams_length-offset >= TAdsAddDeviceNotificationRes_Len )
  716. {
  717. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsadddnresponse);
  718. proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  719. offset+=(int)sizeof(guint32);
  720. proto_tree_add_item(ams_adstree, hf_ams_adsnotificationhandle, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  721. }
  722. }
  723. }
  724. break;
  725. case ADSSRVID_DELDEVICENOTE:
  726. {
  727. col_append_str(pinfo->cinfo, COL_INFO, "ADS Delete Device Notification Response");
  728. if( tree )
  729. {
  730. anItem = proto_tree_add_item(ams_tree, hf_ams_adsdeldnresponse, tvb, offset, ams_length-offset, ENC_NA);
  731. if( ams_length-offset >= TAdsDelDeviceNotificationRes_Len )
  732. {
  733. ams_adstree = proto_item_add_subtree(anItem, ett_ams_adsdeldnresponse);
  734. proto_tree_add_item(ams_adstree, hf_ams_adsresult, tvb, offset, (int)sizeof(guint32), ENC_LITTLE_ENDIAN);
  735. }
  736. }
  737. }
  738. break;
  739. }
  740. }
  741. }
  742. else
  743. {
  744. if ( (stateflags & AMSCMDSF_RESPONSE) == 0 )
  745. col_append_str(pinfo->cinfo, COL_INFO, "AMS Request");
  746. else
  747. col_append_str(pinfo->cinfo, COL_INFO, "AMS Response");
  748. if( tree && ams_length-offset > 0 )
  749. proto_tree_add_item(ams_tree, hf_ams_data, tvb, offset, ams_length-offset, ENC_NA);
  750. }
  751. return offset;
  752. }
  753. /*ams*/
  754. static gint dissect_ams(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
  755. {
  756. return dissect_ams_pdu(tvb, pinfo, tree, 0);
  757. }
  758. static gint dissect_amstcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
  759. {
  760. if( TcpAdsParserHDR_Len > tvb_reported_length(tvb))
  761. return 0;
  762. return dissect_ams_pdu(tvb, pinfo, tree, TcpAdsParserHDR_Len);
  763. }
  764. void proto_register_ams(void)
  765. {
  766. static const true_false_string flags_set_truth =
  767. {
  768. "Set",
  769. "Not set"
  770. };
  771. static hf_register_info hf[] =
  772. {
  773. { &hf_ams_sendernetid,
  774. { "AMS Sender Net Id", "ams.sendernetid",
  775. FT_STRING, BASE_NONE, NULL, 0x0,
  776. NULL, HFILL }
  777. },
  778. { &hf_ams_senderport,
  779. { "AMS Sender port", "ams.senderport",
  780. FT_UINT16, BASE_DEC, NULL, 0x0,
  781. NULL, HFILL }
  782. },
  783. { &hf_ams_targetnetid,
  784. { "AMS Target Net Id", "ams.targetnetid",
  785. FT_STRING, BASE_NONE, NULL, 0x0,
  786. NULL, HFILL }
  787. },
  788. { &hf_ams_targetport,
  789. { "AMS Target port", "ams.targetport",
  790. FT_UINT16, BASE_DEC, NULL, 0x0,
  791. NULL, HFILL }
  792. },
  793. { &hf_ams_cmdid,
  794. { "CmdId", "ams.cmdid",
  795. FT_UINT16, BASE_DEC, VALS(AMS_CommandId_vals), 0x0,
  796. NULL, HFILL }
  797. },
  798. { &hf_ams_stateflags,
  799. { "StateFlags", "ams.stateflags",
  800. FT_UINT16, BASE_HEX, NULL, 0x0,
  801. NULL, HFILL }
  802. },
  803. { &hf_ams_stateresponse,
  804. { "RESPONSE", "ams.state_response",
  805. FT_BOOLEAN, 16, TFS(&flags_set_truth), AMSCMDSF_RESPONSE,
  806. NULL, HFILL }
  807. },
  808. { &hf_ams_statenoreturn,
  809. { "NO RETURN", "ams.state_noreturn",
  810. FT_BOOLEAN, 16, TFS(&flags_set_truth), AMSCMDSF_NORETURN,
  811. NULL, HFILL }
  812. },
  813. { &hf_ams_stateadscmd,
  814. { "ADS COMMAND", "ams.state_adscmd",
  815. FT_BOOLEAN, 16, TFS(&flags_set_truth), AMSCMDSF_ADSCMD,
  816. NULL, HFILL }
  817. },
  818. { &hf_ams_statesyscmd,
  819. { "SYSTEM COMMAND", "ams.state_syscmd",
  820. FT_BOOLEAN, 16, TFS(&flags_set_truth), AMSCMDSF_SYSCMD,
  821. NULL, HFILL }
  822. },
  823. { &hf_ams_statehighprio,
  824. { "HIGH PRIORITY COMMAND", "ams.state_highprio",
  825. FT_BOOLEAN, 16, TFS(&flags_set_truth), AMSCMDSF_HIGHPRIO,
  826. NULL, HFILL }
  827. },
  828. { &hf_ams_statetimestampadded,
  829. { "TIMESTAMP ADDED", "ams.state_timestampadded",
  830. FT_BOOLEAN, 16, TFS(&flags_set_truth), AMSCMDSF_TIMESTAMPADDED,
  831. NULL, HFILL }
  832. },
  833. { &hf_ams_stateudp,
  834. { "UDP COMMAND", "ams.state_udp",
  835. FT_BOOLEAN, 16, TFS(&flags_set_truth), AMSCMDSF_UDP,
  836. NULL, HFILL }
  837. },
  838. { &hf_ams_stateinitcmd,
  839. { "INIT COMMAND", "ams.state_initcmd",
  840. FT_BOOLEAN, 16, TFS(&flags_set_truth), AMSCMDSF_INITCMD,
  841. NULL, HFILL }
  842. },
  843. { &hf_ams_statebroadcast,
  844. { "BROADCAST", "ams.state_broadcast",
  845. FT_BOOLEAN, 16, TFS(&flags_set_truth), AMSCMDSF_BROADCAST,
  846. NULL, HFILL }
  847. },
  848. { &hf_ams_cbdata,
  849. { "cbData", "ams.cbdata",
  850. FT_UINT32, BASE_DEC, NULL, 0x0,
  851. NULL, HFILL }
  852. },
  853. { &hf_ams_errorcode,
  854. { "ErrorCode", "ams.errorcode",
  855. FT_UINT32, BASE_HEX, VALS(ErrorCode), 0x0,
  856. NULL, HFILL }
  857. },
  858. { &hf_ams_invokeid,
  859. { "InvokeId", "ams.invokeid",
  860. FT_UINT32, BASE_HEX, NULL, 0x0,
  861. NULL, HFILL }
  862. },
  863. { &hf_ams_adsdata,
  864. { "Data", "ams.ads_data",
  865. FT_NONE, BASE_NONE, NULL, 0x0,
  866. NULL, HFILL }
  867. },
  868. { &hf_ams_data,
  869. { "Data", "ams.data",
  870. FT_NONE, BASE_NONE, NULL, 0x0,
  871. NULL, HFILL }
  872. },
  873. { &hf_ams_adsindexgroup,
  874. { "IndexGroup", "ams.ads_indexgroup",
  875. FT_UINT32, BASE_HEX, NULL, 0x0,
  876. NULL, HFILL }
  877. },
  878. { &hf_ams_adsindexoffset,
  879. { "IndexOffset", "ams.ads_indexoffset",
  880. FT_UINT32, BASE_HEX, NULL, 0x0,
  881. NULL, HFILL }
  882. },
  883. { &hf_ams_adscblength,
  884. { "CbLength", "ams.ads_cblength",
  885. FT_UINT32, BASE_DEC, NULL, 0x0,
  886. NULL, HFILL }
  887. },
  888. { &hf_ams_adsreadrequest,
  889. { "ADS Read Request", "ams.ads_read_req",
  890. FT_NONE, BASE_NONE, NULL, 0x0,
  891. NULL, HFILL }
  892. },
  893. { &hf_ams_adsreadresponse,
  894. { "ADS Read Response", "ams.ads_read_res",
  895. FT_NONE, BASE_NONE, NULL, 0x0,
  896. NULL, HFILL }
  897. },
  898. { &hf_ams_adsinvokeid,
  899. { "InvokeId", "ams.ads_invokeid",
  900. FT_UINT32, BASE_HEX, NULL, 0x0,
  901. NULL, HFILL }
  902. },
  903. { &hf_ams_adsresult,
  904. { "Result", "ams.adsresult",
  905. FT_UINT32, BASE_HEX, VALS(AdsErrorMode), 0x0,
  906. NULL, HFILL }
  907. },
  908. { &hf_ams_adswriterequest,
  909. { "ADS Write Request", "ams.ads_write_req",
  910. FT_NONE, BASE_NONE, NULL, 0x0,
  911. NULL, HFILL }
  912. },
  913. { &hf_ams_adswriteresponse,
  914. { "ADS Write Response", "ams.ads_write_res",
  915. FT_NONE, BASE_NONE, NULL, 0x0,
  916. NULL, HFILL }
  917. },
  918. { &hf_ams_adsreadwriterequest,
  919. { "ADS ReadWrite Request", "ams.ads_readwrite_req",
  920. FT_NONE, BASE_NONE, NULL, 0x0,
  921. NULL, HFILL }
  922. },
  923. { &hf_ams_adsreadwriteresponse,
  924. { "ADS ReadWrite Response", "ams.ads_readwrite_res",
  925. FT_NONE, BASE_NONE, NULL, 0x0,
  926. NULL, HFILL }
  927. },
  928. { &hf_ams_adscbreadlength,
  929. { "CBReadLength", "ams.ads_cbreadlength",
  930. FT_UINT32, BASE_DEC, NULL, 0x0,
  931. NULL, HFILL }
  932. },
  933. { &hf_ams_adscbwritelength,
  934. { "CBWriteLength", "ams.ads_cbwritelength",
  935. FT_UINT32, BASE_DEC, NULL, 0x0,
  936. NULL, HFILL }
  937. },
  938. { &hf_ams_adsstate,
  939. { "AdsState", "ams.ads_state",
  940. FT_UINT16, BASE_HEX, NULL, 0x0,
  941. NULL, HFILL }
  942. },
  943. { &hf_ams_adsdevicestate,
  944. { "DeviceState", "ams.ads_devicestate",
  945. FT_UINT16, BASE_HEX, NULL, 0x0,
  946. NULL, HFILL }
  947. },
  948. { &hf_ams_adsnotificationhandle,
  949. { "NotificationHandle", "ams.ads_notificationhandle",
  950. FT_UINT32, BASE_HEX, NULL, 0x0,
  951. NULL, HFILL }
  952. },
  953. { &hf_ams_adsreadstaterequest,
  954. { "ADS Read State Request", "ams.ads_readstate_req",
  955. FT_NONE, BASE_NONE, NULL, 0x0,
  956. NULL, HFILL }
  957. },
  958. { &hf_ams_adsreadstateresponse,
  959. { "ADS Read State Response", "ams.ads_readstate_res",
  960. FT_NONE, BASE_NONE, NULL, 0x0,
  961. NULL, HFILL }
  962. },
  963. { &hf_ams_adswritectrlrequest,
  964. { "ADS Write Ctrl Request", "ams.ads_writectrl_req",
  965. FT_NONE, BASE_NONE, NULL, 0x0,
  966. NULL, HFILL }
  967. },
  968. { &hf_ams_adswritectrlresponse,
  969. { "ADS Write Ctrl Response", "ams.ads_writectrl_res",
  970. FT_NONE, BASE_NONE, NULL, 0x0,
  971. NULL, HFILL }
  972. },
  973. { &hf_ams_adsreaddinforequest,
  974. { "ADS Read Device Info Request", "ams.ads_readdinfo_req",
  975. FT_NONE, BASE_NONE, NULL, 0x0,
  976. NULL, HFILL }
  977. },
  978. { &hf_ams_adsreaddinforesponse,
  979. { "ADS Read Device Info Response", "ams.ads_readdinfo_res",
  980. FT_NONE, BASE_NONE, NULL, 0x0,
  981. NULL, HFILL }
  982. },
  983. { &hf_ams_adsadddnrequest,
  984. { "ADS Add Device Notification Request", "ams.ads_adddn_req",
  985. FT_NONE, BASE_NONE, NULL, 0x0,
  986. NULL, HFILL }
  987. },
  988. { &hf_ams_adsadddnresponse,
  989. { "ADS Add Device Notification Response", "ams.ads_adddn_res",
  990. FT_NONE, BASE_NONE, NULL, 0x0,
  991. NULL, HFILL }
  992. },
  993. { &hf_ams_adsdeldnrequest,
  994. { "ADS Delete Device Notification Request", "ams.ads_deldn_req",
  995. FT_NONE, BASE_NONE, NULL, 0x0,
  996. NULL, HFILL }
  997. },
  998. { &hf_ams_adsdeldnresponse,
  999. { "ADS Delete Device Notification Response", "ams.ads_deldn_res",
  1000. FT_NONE, BASE_NONE, NULL, 0x0,
  1001. NULL, HFILL }
  1002. },
  1003. { &hf_ams_adsdnrequest,
  1004. { "ADS Device Notification Request", "ams.ads_dn_req",
  1005. FT_NONE, BASE_NONE, NULL, 0x0,
  1006. NULL, HFILL }
  1007. },
  1008. #if 0
  1009. { &hf_ams_adsdnresponse,
  1010. { "ADS Device Notification Response", "ams.ads_dn_res",
  1011. FT_NONE, BASE_NONE, NULL, 0x0,
  1012. NULL, HFILL }
  1013. },
  1014. { &hf_ams_adsnoteattrib,
  1015. { "InvokeId", "ams.ads_noteattrib",
  1016. FT_NONE, BASE_NONE, NULL, 0x0,
  1017. NULL, HFILL }
  1018. },
  1019. { &hf_ams_adsnoteblocks,
  1020. { "InvokeId", "ams.ads_noteblocks",
  1021. FT_NONE, BASE_NONE, NULL, 0x0,
  1022. NULL, HFILL }
  1023. },
  1024. { &hf_ams_adsversion,
  1025. { "ADS Version", "ams.ads_version",
  1026. FT_UINT32, BASE_DEC, NULL, 0x0,
  1027. NULL, HFILL }
  1028. },
  1029. #endif
  1030. { &hf_ams_adsdevicename,
  1031. { "Device Name","ams.ads_devicename",
  1032. FT_STRING, BASE_NONE, NULL, 0x0,
  1033. NULL, HFILL }
  1034. },
  1035. { &hf_ams_adsversionversion,
  1036. { "ADS Major Version", "ams.ads_versionversion",
  1037. FT_UINT8, BASE_DEC, NULL, 0x0,
  1038. NULL, HFILL }
  1039. },
  1040. { &hf_ams_adsversionrevision,
  1041. { "ADS Minor Version", "ams.ads_versionrevision",