1*ee67461eSJoseph Mingrone /* 2*ee67461eSJoseph Mingrone * Redistribution and use in source and binary forms, with or without 3*ee67461eSJoseph Mingrone * modification, are permitted provided that: (1) source code 4*ee67461eSJoseph Mingrone * distributions retain the above copyright notice and this paragraph 5*ee67461eSJoseph Mingrone * in its entirety, and (2) distributions including binary code include 6*ee67461eSJoseph Mingrone * the above copyright notice and this paragraph in its entirety in 7*ee67461eSJoseph Mingrone * the documentation or other materials provided with the distribution. 8*ee67461eSJoseph Mingrone * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 9*ee67461eSJoseph Mingrone * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 10*ee67461eSJoseph Mingrone * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 11*ee67461eSJoseph Mingrone * FOR A PARTICULAR PURPOSE. 12*ee67461eSJoseph Mingrone * 13*ee67461eSJoseph Mingrone * Original code by Francesco Fondelli (francesco dot fondelli, gmail dot com) 14*ee67461eSJoseph Mingrone */ 15*ee67461eSJoseph Mingrone 16*ee67461eSJoseph Mingrone /* \summary: Autosar SOME/IP Protocol printer */ 17*ee67461eSJoseph Mingrone 18*ee67461eSJoseph Mingrone #include <config.h> 19*ee67461eSJoseph Mingrone 20*ee67461eSJoseph Mingrone #include "netdissect-stdinc.h" 21*ee67461eSJoseph Mingrone #include "netdissect.h" 22*ee67461eSJoseph Mingrone #include "extract.h" 23*ee67461eSJoseph Mingrone 24*ee67461eSJoseph Mingrone /* 25*ee67461eSJoseph Mingrone * SOMEIP Header (R19-11) 26*ee67461eSJoseph Mingrone * 27*ee67461eSJoseph Mingrone * 0 1 2 3 28*ee67461eSJoseph Mingrone * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 29*ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 30*ee67461eSJoseph Mingrone * | Message ID (Service ID/Method ID) | 31*ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 32*ee67461eSJoseph Mingrone * | Length | 33*ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 34*ee67461eSJoseph Mingrone * | Request ID (Client ID/Session ID) | 35*ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 36*ee67461eSJoseph Mingrone * | Protocol Ver | Interface Ver | Message Type | Return Code | 37*ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 38*ee67461eSJoseph Mingrone * | Payload | 39*ee67461eSJoseph Mingrone * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 40*ee67461eSJoseph Mingrone */ 41*ee67461eSJoseph Mingrone 42*ee67461eSJoseph Mingrone static const struct tok message_type_values[] = { 43*ee67461eSJoseph Mingrone { 0x00, "REQUEST" }, 44*ee67461eSJoseph Mingrone { 0x01, "REQUEST_NO_RETURN" }, 45*ee67461eSJoseph Mingrone { 0x02, "NOTIFICATION" }, 46*ee67461eSJoseph Mingrone { 0x80, "RESPONSE" }, 47*ee67461eSJoseph Mingrone { 0x81, "ERROR" }, 48*ee67461eSJoseph Mingrone { 0x20, "TP_REQUEST" }, 49*ee67461eSJoseph Mingrone { 0x21, "TP_REQUEST_NO_RETURN" }, 50*ee67461eSJoseph Mingrone { 0x22, "TP_NOTIFICATION" }, 51*ee67461eSJoseph Mingrone { 0xa0, "TP_RESPONSE" }, 52*ee67461eSJoseph Mingrone { 0xa1, "TP_ERROR" }, 53*ee67461eSJoseph Mingrone { 0, NULL } 54*ee67461eSJoseph Mingrone }; 55*ee67461eSJoseph Mingrone 56*ee67461eSJoseph Mingrone static const struct tok return_code_values[] = { 57*ee67461eSJoseph Mingrone { 0x00, "E_OK" }, 58*ee67461eSJoseph Mingrone { 0x01, "E_NOT_OK" }, 59*ee67461eSJoseph Mingrone { 0x02, "E_UNKNOWN_SERVICE" }, 60*ee67461eSJoseph Mingrone { 0x03, "E_UNKNOWN_METHOD" }, 61*ee67461eSJoseph Mingrone { 0x04, "E_NOT_READY" }, 62*ee67461eSJoseph Mingrone { 0x05, "E_NOT_REACHABLE" }, 63*ee67461eSJoseph Mingrone { 0x06, "E_TIMEOUT" }, 64*ee67461eSJoseph Mingrone { 0x07, "E_WRONG_PROTOCOL_VERSION" }, 65*ee67461eSJoseph Mingrone { 0x08, "E_WRONG_INTERFACE_VERSION" }, 66*ee67461eSJoseph Mingrone { 0x09, "E_MALFORMED_MESSAGE" }, 67*ee67461eSJoseph Mingrone { 0x0a, "E_WRONG_MESSAGE_TYPE" }, 68*ee67461eSJoseph Mingrone { 0x0b, "E_E2E_REPEATED" }, 69*ee67461eSJoseph Mingrone { 0x0c, "E_E2E_WRONG_SEQUENCE" }, 70*ee67461eSJoseph Mingrone { 0x0d, "E_E2E" }, 71*ee67461eSJoseph Mingrone { 0x0e, "E_E2E_NOT_AVAILABLE" }, 72*ee67461eSJoseph Mingrone { 0x0f, "E_E2E_NO_NEW_DATA" }, 73*ee67461eSJoseph Mingrone { 0, NULL } 74*ee67461eSJoseph Mingrone }; 75*ee67461eSJoseph Mingrone 76*ee67461eSJoseph Mingrone void 77*ee67461eSJoseph Mingrone someip_print(netdissect_options *ndo, const u_char *bp, const u_int len) 78*ee67461eSJoseph Mingrone { 79*ee67461eSJoseph Mingrone uint32_t message_id; 80*ee67461eSJoseph Mingrone uint16_t service_id; 81*ee67461eSJoseph Mingrone uint16_t method_or_event_id; 82*ee67461eSJoseph Mingrone uint8_t event_flag; 83*ee67461eSJoseph Mingrone uint32_t message_len; 84*ee67461eSJoseph Mingrone uint32_t request_id; 85*ee67461eSJoseph Mingrone uint16_t client_id; 86*ee67461eSJoseph Mingrone uint16_t session_id; 87*ee67461eSJoseph Mingrone uint8_t protocol_version; 88*ee67461eSJoseph Mingrone uint8_t interface_version; 89*ee67461eSJoseph Mingrone uint8_t message_type; 90*ee67461eSJoseph Mingrone uint8_t return_code; 91*ee67461eSJoseph Mingrone 92*ee67461eSJoseph Mingrone ndo->ndo_protocol = "someip"; 93*ee67461eSJoseph Mingrone nd_print_protocol_caps(ndo); 94*ee67461eSJoseph Mingrone 95*ee67461eSJoseph Mingrone if (len < 16) { 96*ee67461eSJoseph Mingrone goto invalid; 97*ee67461eSJoseph Mingrone } 98*ee67461eSJoseph Mingrone 99*ee67461eSJoseph Mingrone message_id = GET_BE_U_4(bp); 100*ee67461eSJoseph Mingrone service_id = message_id >> 16; 101*ee67461eSJoseph Mingrone event_flag = (message_id & 0x00008000) >> 15; 102*ee67461eSJoseph Mingrone method_or_event_id = message_id & 0x00007FFF; 103*ee67461eSJoseph Mingrone bp += 4; 104*ee67461eSJoseph Mingrone ND_PRINT(", service %u, %s %u", 105*ee67461eSJoseph Mingrone service_id, event_flag ? "event" : "method", method_or_event_id); 106*ee67461eSJoseph Mingrone 107*ee67461eSJoseph Mingrone message_len = GET_BE_U_4(bp); 108*ee67461eSJoseph Mingrone bp += 4; 109*ee67461eSJoseph Mingrone ND_PRINT(", len %u", message_len); 110*ee67461eSJoseph Mingrone 111*ee67461eSJoseph Mingrone request_id = GET_BE_U_4(bp); 112*ee67461eSJoseph Mingrone client_id = request_id >> 16; 113*ee67461eSJoseph Mingrone session_id = request_id & 0x0000FFFF; 114*ee67461eSJoseph Mingrone bp += 4; 115*ee67461eSJoseph Mingrone ND_PRINT(", client %u, session %u", client_id, session_id); 116*ee67461eSJoseph Mingrone 117*ee67461eSJoseph Mingrone protocol_version = GET_U_1(bp); 118*ee67461eSJoseph Mingrone bp += 1; 119*ee67461eSJoseph Mingrone ND_PRINT(", pver %u", protocol_version); 120*ee67461eSJoseph Mingrone 121*ee67461eSJoseph Mingrone interface_version = GET_U_1(bp); 122*ee67461eSJoseph Mingrone bp += 1; 123*ee67461eSJoseph Mingrone ND_PRINT(", iver %u", interface_version); 124*ee67461eSJoseph Mingrone 125*ee67461eSJoseph Mingrone message_type = GET_U_1(bp); 126*ee67461eSJoseph Mingrone bp += 1; 127*ee67461eSJoseph Mingrone ND_PRINT(", msgtype %s", 128*ee67461eSJoseph Mingrone tok2str(message_type_values, "Unknown", message_type)); 129*ee67461eSJoseph Mingrone 130*ee67461eSJoseph Mingrone return_code = GET_U_1(bp); 131*ee67461eSJoseph Mingrone bp += 1; 132*ee67461eSJoseph Mingrone ND_PRINT(", retcode %s\n", 133*ee67461eSJoseph Mingrone tok2str(return_code_values, "Unknown", return_code)); 134*ee67461eSJoseph Mingrone 135*ee67461eSJoseph Mingrone return; 136*ee67461eSJoseph Mingrone 137*ee67461eSJoseph Mingrone invalid: 138*ee67461eSJoseph Mingrone nd_print_invalid(ndo); 139*ee67461eSJoseph Mingrone } 140