* Original code by Francesco Fondelli (francesco dot fondelli, gmail dot com)
*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+/* \summary: Autosar SOME/IP Protocol printer */
+
+#include <config.h>
#include "netdissect-stdinc.h"
#include "netdissect.h"
#include "extract.h"
-#include "udp.h"
/*
* SOMEIP Header (R19-11)
* | Message ID (Service ID/Method ID) |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Length |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Request ID (Client ID/Session ID) |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Protocol Ver | Interface Ver | Message Type | Return Code |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Payload |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
-struct tok message_type_values[] = {
+static const struct tok message_type_values[] = {
{ 0x00, "REQUEST" },
{ 0x01, "REQUEST_NO_RETURN" },
{ 0x02, "NOTIFICATION" },
{ 0, NULL }
};
-struct tok return_code_values[] = {
+static const struct tok return_code_values[] = {
{ 0x00, "E_OK" },
{ 0x01, "E_NOT_OK" },
{ 0x02, "E_UNKNOWN_SERVICE" },
{ 0x0d, "E_E2E" },
{ 0x0e, "E_E2E_NOT_AVAILABLE" },
{ 0x0f, "E_E2E_NO_NEW_DATA" },
+ { 0, NULL }
};
void
-someip_print(netdissect_options *ndo, const u_char *bp, u_int len)
+someip_print(netdissect_options *ndo, const u_char *bp, const u_int len)
{
uint32_t message_id;
uint16_t service_id;
uint8_t return_code;
ndo->ndo_protocol = "someip";
+ nd_print_protocol_caps(ndo);
if (len < 16) {
- nd_print_trunc(ndo);
- return;
+ goto invalid;
}
message_id = GET_BE_U_4(bp);
event_flag = (message_id & 0x00008000) >> 15;
method_or_event_id = message_id & 0x00007FFF;
bp += 4;
+ ND_PRINT(", service %u, %s %u",
+ service_id, event_flag ? "event" : "method", method_or_event_id);
message_len = GET_BE_U_4(bp);
bp += 4;
+ ND_PRINT(", len %u", message_len);
request_id = GET_BE_U_4(bp);
client_id = request_id >> 16;
session_id = request_id & 0x0000FFFF;
bp += 4;
+ ND_PRINT(", client %u, session %u", client_id, session_id);
protocol_version = GET_U_1(bp);
bp += 1;
+ ND_PRINT(", pver %u", protocol_version);
interface_version = GET_U_1(bp);
bp += 1;
+ ND_PRINT(", iver %u", interface_version);
message_type = GET_U_1(bp);
bp += 1;
+ ND_PRINT(", msgtype %s",
+ tok2str(message_type_values, "Unknown", message_type));
return_code = GET_U_1(bp);
bp += 1;
-
- ND_PRINT("SOMEIP, service %u, %s %u, len %u, client %u, session %u, "
- "pver %u, iver %u, msgtype %s, retcode %s\n",
- service_id, event_flag ? "event" : "method", method_or_event_id,
- message_len, client_id, session_id, protocol_version,
- interface_version,
- tok2str(message_type_values, "Unknown", message_type),
+ ND_PRINT(", retcode %s\n",
tok2str(return_code_values, "Unknown", return_code));
+
return;
+
+invalid:
+ nd_print_invalid(ndo);
}