16#define UDS_LIB_VERSION "0.10.0"
26#define UDS_SYS_CUSTOM 0
28#define UDS_SYS_WINDOWS 2
29#define UDS_SYS_ARDUINO 3
30#define UDS_SYS_ESP32 4
35#if defined(__unix__) || defined(__APPLE__)
36#define UDS_SYS UDS_SYS_UNIX
38#define UDS_SYS UDS_SYS_WINDOWS
40#define UDS_SYS UDS_SYS_ARDUINO
41#elif defined(ESP_PLATFORM)
42#define UDS_SYS UDS_SYS_ESP32
45 "UDS_SYS was not detected, defaulting to UDS_SYS_CUSTOM. Remove this warning by defining UDS_SYS=UDS_SYS_CUSTOM in your build configuration"
46#define UDS_SYS UDS_SYS_CUSTOM
59#if UDS_SYS == UDS_SYS_CUSTOM
60#define UDS_CUSTOM_MILLIS
63#if UDS_SYS == UDS_SYS_UNIX
69#if UDS_SYS == UDS_SYS_WINDOWS
73#define strncasecmp _strnicmp
74#define strcasecmp _stricmp
78#if UDS_SYS == UDS_SYS_ARDUINO
83#if UDS_SYS == UDS_SYS_ESP32
106#define UDS_ISOTP_MTU (4095)
110#define UDS_TP_MTU UDS_ISOTP_MTU
118#ifndef UDS_SERVER_SEND_BUF_SIZE
119#define UDS_SERVER_SEND_BUF_SIZE (UDS_TP_MTU)
123#ifndef UDS_SERVER_RECV_BUF_SIZE
124#define UDS_SERVER_RECV_BUF_SIZE (UDS_TP_MTU)
128#ifndef UDS_CLIENT_SEND_BUF_SIZE
129#define UDS_CLIENT_SEND_BUF_SIZE (UDS_TP_MTU)
133#ifndef UDS_CLIENT_RECV_BUF_SIZE
134#define UDS_CLIENT_RECV_BUF_SIZE (UDS_TP_MTU)
137#ifndef UDS_CLIENT_DEFAULT_P2_MS
138#define UDS_CLIENT_DEFAULT_P2_MS (150U)
141#ifndef UDS_CLIENT_DEFAULT_P2_STAR_MS
142#define UDS_CLIENT_DEFAULT_P2_STAR_MS (1500U)
147#ifndef UDS_SERVER_DEFAULT_P2_MS
148#define UDS_SERVER_DEFAULT_P2_MS (50)
151#ifndef UDS_SERVER_DEFAULT_P2_STAR_MS
152#define UDS_SERVER_DEFAULT_P2_STAR_MS (5000)
155#ifndef UDS_SERVER_DEFAULT_S3_MS
156#define UDS_SERVER_DEFAULT_S3_MS \
168#ifndef UDS_SERVER_DEFAULT_POWER_DOWN_TIME_MS
169#define UDS_SERVER_DEFAULT_POWER_DOWN_TIME_MS (60)
172#if (UDS_SERVER_DEFAULT_POWER_DOWN_TIME_MS < UDS_SERVER_DEFAULT_P2_MS)
173#error "The server shall have adequate time to respond before reset"
177#ifndef UDS_SERVER_0x27_BRUTE_FORCE_MITIGATION_BOOT_DELAY_MS
178#define UDS_SERVER_0x27_BRUTE_FORCE_MITIGATION_BOOT_DELAY_MS (1000)
182#ifndef UDS_SERVER_0x27_BRUTE_FORCE_MITIGATION_AUTH_FAIL_DELAY_MS
183#define UDS_SERVER_0x27_BRUTE_FORCE_MITIGATION_AUTH_FAIL_DELAY_MS (1000)
186#ifndef UDS_SERVER_DEFAULT_XFER_DATA_MAX_BLOCKLENGTH
190#define UDS_SERVER_DEFAULT_XFER_DATA_MAX_BLOCKLENGTH (UDS_TP_MTU)
196#if defined UDS_TP_ISOTP_C_SOCKETCAN
197#ifndef UDS_TP_ISOTP_C
198#define UDS_TP_ISOTP_C
205 UDS_TP_IDLE = 0x0000,
206 UDS_TP_SEND_IN_PROGRESS = 0x0001,
207 UDS_TP_RECV_COMPLETE = 0x0002,
216 UDS_A_MTYPE_DIAG = 0,
217 UDS_A_MTYPE_REMOTE_DIAG,
218 UDS_A_MTYPE_SECURE_DIAG,
219 UDS_A_MTYPE_SECURE_REMOTE_DIAG,
225 UDS_A_TA_TYPE_PHYSICAL = 0,
226 UDS_A_TA_TYPE_FUNCTIONAL,
245#define UDS_TP_NOOP_ADDR (0xFFFFFFFF)
255typedef struct UDSTp {
303typedef enum UDSEvent {
349 UDS_PositiveResponse = 0,
351 UDS_NRC_GeneralReject = 0x10,
352 UDS_NRC_ServiceNotSupported = 0x11,
353 UDS_NRC_SubFunctionNotSupported = 0x12,
354 UDS_NRC_IncorrectMessageLengthOrInvalidFormat = 0x13,
355 UDS_NRC_ResponseTooLong = 0x14,
357 UDS_NRC_BusyRepeatRequest = 0x21,
358 UDS_NRC_ConditionsNotCorrect = 0x22,
359 UDS_NRC_RequestSequenceError = 0x24,
360 UDS_NRC_NoResponseFromSubnetComponent = 0x25,
361 UDS_NRC_FailurePreventsExecutionOfRequestedAction = 0x26,
363 UDS_NRC_RequestOutOfRange = 0x31,
365 UDS_NRC_SecurityAccessDenied = 0x33,
366 UDS_NRC_AuthenticationRequired = 0x34,
367 UDS_NRC_InvalidKey = 0x35,
368 UDS_NRC_ExceedNumberOfAttempts = 0x36,
369 UDS_NRC_RequiredTimeDelayNotExpired = 0x37,
370 UDS_NRC_SecureDataTransmissionRequired = 0x38,
371 UDS_NRC_SecureDataTransmissionNotAllowed = 0x39,
372 UDS_NRC_SecureDataVerificationFailed = 0x3A,
374 UDS_NRC_CertficateVerificationFailedInvalidTimePeriod = 0x50,
375 UDS_NRC_CertficateVerificationFailedInvalidSignature = 0x51,
376 UDS_NRC_CertficateVerificationFailedInvalidChainOfTrust = 0x52,
377 UDS_NRC_CertficateVerificationFailedInvalidType = 0x53,
378 UDS_NRC_CertficateVerificationFailedInvalidFormat = 0x54,
379 UDS_NRC_CertficateVerificationFailedInvalidContent = 0x55,
380 UDS_NRC_CertficateVerificationFailedInvalidScope = 0x56,
381 UDS_NRC_CertficateVerificationFailedInvalidCertificate = 0x57,
382 UDS_NRC_OwnershipVerificationFailed = 0x58,
383 UDS_NRC_ChallengeCalculationFailed = 0x59,
384 UDS_NRC_SettingAccessRightsFailed = 0x5A,
385 UDS_NRC_SessionKeyCreationOrDerivationFailed = 0x5B,
386 UDS_NRC_ConfigurationDataUsageFailed = 0x5C,
387 UDS_NRC_DeAuthenticationFailed = 0x5D,
389 UDS_NRC_UploadDownloadNotAccepted = 0x70,
390 UDS_NRC_TransferDataSuspended = 0x71,
391 UDS_NRC_GeneralProgrammingFailure = 0x72,
392 UDS_NRC_WrongBlockSequenceCounter = 0x73,
394 UDS_NRC_RequestCorrectlyReceived_ResponsePending = 0x78,
396 UDS_NRC_SubFunctionNotSupportedInActiveSession = 0x7E,
397 UDS_NRC_ServiceNotSupportedInActiveSession = 0x7F,
399 UDS_NRC_RpmTooHigh = 0x81,
400 UDS_NRC_RpmTooLow = 0x82,
401 UDS_NRC_EngineIsRunning = 0x83,
402 UDS_NRC_EngineIsNotRunning = 0x84,
403 UDS_NRC_EngineRunTimeTooLow = 0x85,
404 UDS_NRC_TemperatureTooHigh = 0x86,
405 UDS_NRC_TemperatureTooLow = 0x87,
406 UDS_NRC_VehicleSpeedTooHigh = 0x88,
407 UDS_NRC_VehicleSpeedTooLow = 0x89,
408 UDS_NRC_ThrottlePedalTooHigh = 0x8A,
409 UDS_NRC_ThrottlePedalTooLow = 0x8B,
410 UDS_NRC_TransmissionRangeNotInNeutral = 0x8C,
411 UDS_NRC_TransmissionRangeNotInGear = 0x8D,
413 UDS_NRC_BrakeSwitchNotClosed = 0x8F,
414 UDS_NRC_ShifterLeverNotInPark = 0x90,
415 UDS_NRC_TorqueConverterClutchLocked = 0x91,
416 UDS_NRC_VoltageTooHigh = 0x92,
417 UDS_NRC_VoltageTooLow = 0x93,
418 UDS_NRC_ResourceTemporarilyNotAvailable = 0x94,
425 UDS_ERR_TIMEOUT = 0x100,
426 UDS_ERR_DID_MISMATCH,
427 UDS_ERR_SID_MISMATCH,
428 UDS_ERR_SUBFUNCTION_MISMATCH,
430 UDS_ERR_RESP_TOO_SHORT,
443#define UDS_LEV_DS_DS 1
444#define UDS_LEV_DS_PRGS 2
445#define UDS_LEV_DS_EXTDS 3
446#define UDS_LEV_DS_SSDS 4
455#define UDS_LEV_RT_HR 1
456#define UDS_LEV_RT_KOFFONR 2
457#define UDS_LEV_RT_SR 3
458#define UDS_LEV_RT_ERPSD 4
459#define UDS_LEV_RT_DRPSD 5
468#define UDS_LEV_CTRLTP_ERXTX 0
469#define UDS_LEV_CTRLTP_ERXDTX 1
470#define UDS_LEV_CTRLTP_DRXETX 2
471#define UDS_LEV_CTRLTP_DRXTX 3
481#define UDS_CTP_NWMCM 2
482#define UDS_CTP_NWMCM_NCM \
492#define UDS_LEV_RCTP_STR 1
493#define UDS_LEV_RCTP_STPR 2
494#define UDS_LEV_RCTP_RRR 3
503#define UDS_MOOP_ADDFILE 1
504#define UDS_MOOP_DELFILE 2
505#define UDS_MOOP_REPLFILE 3
506#define UDS_MOOP_RDFILE 4
507#define UDS_MOOP_RDDIR 5
508#define UDS_MOOP_RSFILE 6
517#define UDS_LEV_DTCSTP_ON 1
518#define UDS_LEV_DTCSTP_OFF 2
527#define UDS_LEV_LCTP_VMTWFP 1
528#define UDS_LEV_LCTP_VMTWSP 2
529#define UDS_LEV_LCTP_TM 3
533#define UDS_MAX_DIAGNOSTIC_SERVICES 0x7F
535#define UDS_RESPONSE_SID_OF(request_sid) \
536 ((request_sid) + 0x40)
537#define UDS_REQUEST_SID_OF(response_sid) \
538 ((response_sid) - 0x40)
541#define UDS_NEG_RESP_LEN 3U
542#define UDS_0X10_REQ_LEN 2U
543#define UDS_0X10_RESP_LEN 6U
544#define UDS_0X11_REQ_MIN_LEN 2U
545#define UDS_0X11_RESP_BASE_LEN 2U
546#define UDS_0X14_REQ_MIN_LEN 4U
547#define UDS_0X14_RESP_BASE_LEN 1U
548#define UDS_0X19_REQ_MIN_LEN 2U
549#define UDS_0X19_RESP_BASE_LEN 2U
550#define UDS_0X23_REQ_MIN_LEN 4U
551#define UDS_0X23_RESP_BASE_LEN 1U
552#define UDS_0X22_RESP_BASE_LEN 1U
553#define UDS_0X27_REQ_BASE_LEN 2U
554#define UDS_0X27_RESP_BASE_LEN 2U
555#define UDS_0X28_REQ_BASE_LEN 3U
556#define UDS_0X28_RESP_LEN 2U
557#define UDS_0X2C_REQ_MIN_LEN 2U
558#define UDS_0X2C_RESP_BASE_LEN 2U
559#define UDS_0X2E_REQ_BASE_LEN 3U
560#define UDS_0X2E_REQ_MIN_LEN 4U
561#define UDS_0X2E_RESP_LEN 3U
562#define UDS_0X2F_REQ_MIN_LEN 4U
563#define UDS_0X2F_RESP_BASE_LEN 4U
564#define UDS_0X31_REQ_MIN_LEN 4U
565#define UDS_0X31_RESP_MIN_LEN 4U
566#define UDS_0X34_REQ_BASE_LEN 3U
567#define UDS_0X34_RESP_BASE_LEN 2U
568#define UDS_0X35_REQ_BASE_LEN 3U
569#define UDS_0X35_RESP_BASE_LEN 2U
570#define UDS_0X36_REQ_BASE_LEN 2U
571#define UDS_0X36_RESP_BASE_LEN 2U
572#define UDS_0X37_REQ_BASE_LEN 1U
573#define UDS_0X37_RESP_BASE_LEN 1U
574#define UDS_0X38_REQ_BASE_LEN 5U
575#define UDS_0X38_RESP_BASE_LEN 2U
576#define UDS_0X3D_REQ_MIN_LEN 5U
577#define UDS_0X3D_RESP_BASE_LEN 2U
578#define UDS_0X3E_REQ_MIN_LEN 2U
579#define UDS_0X3E_REQ_MAX_LEN 2U
580#define UDS_0X3E_RESP_LEN 2U
581#define UDS_0X85_REQ_BASE_LEN 2U
582#define UDS_0X85_RESP_LEN 2U
583#define UDS_0X87_REQ_BASE_LEN 2U
584#define UDS_0X87_RESP_LEN 2U
586enum UDSDiagnosticServiceId {
587 kSID_DIAGNOSTIC_SESSION_CONTROL = 0x10,
588 kSID_ECU_RESET = 0x11,
589 kSID_CLEAR_DIAGNOSTIC_INFORMATION = 0x14,
590 kSID_READ_DTC_INFORMATION = 0x19,
591 kSID_READ_DATA_BY_IDENTIFIER = 0x22,
592 kSID_READ_MEMORY_BY_ADDRESS = 0x23,
593 kSID_READ_SCALING_DATA_BY_IDENTIFIER = 0x24,
594 kSID_SECURITY_ACCESS = 0x27,
595 kSID_COMMUNICATION_CONTROL = 0x28,
596 kSID_READ_PERIODIC_DATA_BY_IDENTIFIER = 0x2A,
597 kSID_DYNAMICALLY_DEFINE_DATA_IDENTIFIER = 0x2C,
598 kSID_WRITE_DATA_BY_IDENTIFIER = 0x2E,
599 kSID_IO_CONTROL_BY_IDENTIFIER = 0x2F,
600 kSID_ROUTINE_CONTROL = 0x31,
601 kSID_REQUEST_DOWNLOAD = 0x34,
602 kSID_REQUEST_UPLOAD = 0x35,
603 kSID_TRANSFER_DATA = 0x36,
604 kSID_REQUEST_TRANSFER_EXIT = 0x37,
605 kSID_REQUEST_FILE_TRANSFER = 0x38,
606 kSID_WRITE_MEMORY_BY_ADDRESS = 0x3D,
607 kSID_TESTER_PRESENT = 0x3E,
608 kSID_ACCESS_TIMING_PARAMETER = 0x83,
609 kSID_SECURED_DATA_TRANSMISSION = 0x84,
610 kSID_CONTROL_DTC_SETTING = 0x85,
611 kSID_RESPONSE_ON_EVENT = 0x86,
612 kSID_LINK_CONTROL = 0x87,
635static inline bool UDSTimeAfter(uint32_t a, uint32_t b) {
return (int32_t)(a - b) > 0; }
646const char *UDSErrToStr(
UDSErr_t err);
662#define UDS_LOG_NONE 0
663#define UDS_LOG_ERROR 1
664#define UDS_LOG_WARN 2
665#define UDS_LOG_INFO 3
666#define UDS_LOG_DEBUG 4
667#define UDS_LOG_VERBOSE 5
678#define UDS_LOG_LEVEL UDS_LOG_NONE
682#if UDS_CONFIG_LOG_COLORS
683#define UDS_LOG_COLOR_BLACK "30"
684#define UDS_LOG_COLOR_RED "31"
685#define UDS_LOG_COLOR_GREEN "32"
686#define UDS_LOG_COLOR_BROWN "33"
687#define UDS_LOG_COLOR_BLUE "34"
688#define UDS_LOG_COLOR_PURPLE "35"
689#define UDS_LOG_COLOR_CYAN "36"
690#define LOG_COLOR(COLOR) "\033[0;" COLOR "m"
691#define LOG_BOLD(COLOR) "\033[1;" COLOR "m"
692#define UDS_LOG_RESET_COLOR "\033[0m"
693#define UDS_LOG_COLOR_E LOG_COLOR(UDS_LOG_COLOR_RED)
694#define UDS_LOG_COLOR_W LOG_COLOR(UDS_LOG_COLOR_BROWN)
695#define UDS_LOG_COLOR_I LOG_COLOR(UDS_LOG_COLOR_GREEN)
696#define UDS_LOG_COLOR_D
697#define UDS_LOG_COLOR_V
699#define UDS_LOG_COLOR_E
700#define UDS_LOG_COLOR_W
701#define UDS_LOG_COLOR_I
702#define UDS_LOG_COLOR_D
703#define UDS_LOG_COLOR_V
704#define UDS_LOG_RESET_COLOR
707#define UDS_LOG_FORMAT(letter, format) \
708 UDS_LOG_COLOR_##letter #letter " (%" PRIu32 ") %s: " format UDS_LOG_RESET_COLOR "\n"
713 "unknown log level");
715#if UDS_LOG_LEVEL >= UDS_LOG_ERROR && UDS_LOG_LEVEL != UDS_LOG_NONE
716#define UDS_LOGE(tag, format, ...) \
717 UDS_LogWrite(UDS_LOG_ERROR, tag, UDS_LOG_FORMAT(E, format), UDSMillis(), tag, ##__VA_ARGS__)
719#define UDS_LOGE(tag, format, ...) UDS_LogDummy(tag, format, ##__VA_ARGS__)
722#if UDS_LOG_LEVEL >= UDS_LOG_WARN && UDS_LOG_LEVEL != UDS_LOG_NONE
723#define UDS_LOGW(tag, format, ...) \
724 UDS_LogWrite(UDS_LOG_WARN, tag, UDS_LOG_FORMAT(W, format), UDSMillis(), tag, ##__VA_ARGS__)
726#define UDS_LOGW(tag, format, ...) UDS_LogDummy(tag, format, ##__VA_ARGS__)
729#if UDS_LOG_LEVEL >= UDS_LOG_INFO && UDS_LOG_LEVEL != UDS_LOG_NONE
730#define UDS_LOGI(tag, format, ...) \
731 UDS_LogWrite(UDS_LOG_INFO, tag, UDS_LOG_FORMAT(I, format), UDSMillis(), tag, ##__VA_ARGS__)
733#define UDS_LOGI(tag, format, ...) UDS_LogDummy(tag, format, ##__VA_ARGS__)
736#if UDS_LOG_LEVEL >= UDS_LOG_DEBUG && UDS_LOG_LEVEL != UDS_LOG_NONE
737#define UDS_LOGD(tag, format, ...) \
738 UDS_LogWrite(UDS_LOG_DEBUG, tag, UDS_LOG_FORMAT(D, format), UDSMillis(), tag, ##__VA_ARGS__)
740#define UDS_LOGD(tag, format, ...) UDS_LogDummy(tag, format, ##__VA_ARGS__)
743#if UDS_LOG_LEVEL >= UDS_LOG_VERBOSE
744#define UDS_LOGV(tag, format, ...) \
745 UDS_LogWrite(UDS_LOG_VERBOSE, tag, UDS_LOG_FORMAT(V, format), UDSMillis(), tag, ##__VA_ARGS__)
746#define UDS_LOG_SDU(tag, buffer, buff_len, info) \
747 UDS_LogSDUInternal(UDS_LOG_DEBUG, tag, buffer, buff_len, info)
749#define UDS_LOGV(tag, format, ...) UDS_LogDummy(tag, format, ##__VA_ARGS__)
750#define UDS_LOG_SDU(tag, buffer, buff_len, info) UDS_LogSDUDummy(tag, buffer, buff_len, info)
753#if defined(__GNUC__) || defined(__clang__)
754#define UDS_PRINTF_FORMAT(fmt_index, first_arg) \
755 __attribute__((format(printf, fmt_index, first_arg)))
757#define UDS_PRINTF_FORMAT(fmt_index, first_arg)
760#if UDS_LOG_LEVEL > UDS_LOG_NONE
761void UDS_LogWrite(
UDS_LogLevel_t level,
const char *tag,
const char *format, ...)
762 UDS_PRINTF_FORMAT(3, 4);
763void UDS_LogSDUInternal(
UDS_LogLevel_t level, const
char *tag, const uint8_t *buffer,
764 size_t buff_len, const
UDSSDU_t *info);
768static inline void UDS_LogDummy(
const char *tag,
const char *format, ...) {
772static inline void UDS_LogSDUDummy(
const char *tag,
const uint8_t *buffer,
size_t buff_len,
784#define UDS_SUPPRESS_POS_RESP 0x1
785#define UDS_FUNCTIONAL 0x2
786#define UDS_IGNORE_SRV_TIMINGS 0x8
791typedef struct UDSClient {
847 void *(*UnpackFn)(
void *dst,
const void *src,
size_t n);
861 const uint16_t numDataIdentifiers);
866 const uint8_t *data, uint16_t size);
869 uint8_t addressAndLengthFormatIdentifier,
size_t memoryAddress,
873 uint8_t addressAndLengthFormatIdentifier,
size_t memoryAddress,
876 const uint16_t blockLength,
const uint8_t *data,
879 const uint16_t blockLength,
885 UDSClient_t *client, uint8_t mode,
const char *filePath,
size_t fileSizeUncompressed,
886 size_t fileSizeCompressed);
888 uint8_t *dtcSettingControlOptionRecord,
920typedef struct UDSServer {
1273#if defined(UDS_TP_ISOTP_C)
1276#define ISO_TP_USER_SEND_CAN_ARG 1
1278#ifndef ISOTPC_CONFIG_H
1279#define ISOTPC_CONFIG_H
1284#ifndef ISO_TP_DEFAULT_BLOCK_SIZE
1285#define ISO_TP_DEFAULT_BLOCK_SIZE 8
1291#ifndef ISO_TP_DEFAULT_ST_MIN_US
1292#define ISO_TP_DEFAULT_ST_MIN_US 0
1298#ifndef ISO_TP_MAX_WFT_NUMBER
1299#define ISO_TP_MAX_WFT_NUMBER 1
1305#ifndef ISO_TP_DEFAULT_RESPONSE_TIMEOUT_US
1306#define ISO_TP_DEFAULT_RESPONSE_TIMEOUT_US 100000
1315#ifndef ISO_TP_FRAME_PADDING_VALUE
1316#define ISO_TP_FRAME_PADDING_VALUE 0xAA
1326#ifndef ISOTPC_USER_DEFINITIONS_H
1327#define ISOTPC_USER_DEFINITIONS_H
1335#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1336#define ISOTP_BYTE_ORDER_LITTLE_ENDIAN
1337#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
1339#error "unsupported byte ordering"
1347#define snprintf _snprintf
1352#define ISOTP_BYTE_ORDER_LITTLE_ENDIAN
1353#define __builtin_bswap8 _byteswap_uint8
1354#define __builtin_bswap16 _byteswap_uint16
1355#define __builtin_bswap32 _byteswap_uint32
1356#define __builtin_bswap64 _byteswap_uint64
1362#define ISOTP_RET_OK 0
1363#define ISOTP_RET_ERROR -1
1364#define ISOTP_RET_INPROGRESS -2
1365#define ISOTP_RET_OVERFLOW -3
1366#define ISOTP_RET_WRONG_SN -4
1367#define ISOTP_RET_NO_DATA -5
1368#define ISOTP_RET_TIMEOUT -6
1369#define ISOTP_RET_LENGTH -7
1370#define ISOTP_RET_NOSPACE -8
1373#define IsoTpTimeAfter(a,b) ((int32_t)((int32_t)(b) - (int32_t)(a)) < 0)
1376#define ISOTP_INVALID_BS 0xFFFF
1380 ISOTP_SEND_STATUS_IDLE,
1381 ISOTP_SEND_STATUS_INPROGRESS,
1382 ISOTP_SEND_STATUS_ERROR,
1383} IsoTpSendStatusTypes;
1387 ISOTP_RECEIVE_STATUS_IDLE,
1388 ISOTP_RECEIVE_STATUS_INPROGRESS,
1389 ISOTP_RECEIVE_STATUS_FULL,
1390} IsoTpReceiveStatusTypes;
1393#if defined(ISOTP_BYTE_ORDER_LITTLE_ENDIAN)
1395 uint8_t reserve_1:4;
1397 uint8_t reserve_2[7];
1407 uint8_t FF_DL_high:4;
1417} IsoTpConsecutiveFrame;
1431 uint8_t reserve_1:4;
1432 uint8_t reserve_2[7];
1463 uint8_t FF_DL_high:4;
1482} IsoTpConsecutiveFrame;
1510 IsoTpPciType common;
1511 IsoTpSingleFrame single_frame;
1512 IsoTpFirstFrame first_frame;
1513 IsoTpConsecutiveFrame consecutive_frame;
1514 IsoTpFlowControl flow_control;
1515 IsoTpDataArray data_array;
1526 ISOTP_PCI_TYPE_SINGLE = 0x0,
1527 ISOTP_PCI_TYPE_FIRST_FRAME = 0x1,
1528 TSOTP_PCI_TYPE_CONSECUTIVE_FRAME = 0x2,
1529 ISOTP_PCI_TYPE_FLOW_CONTROL_FRAME = 0x3
1530} IsoTpProtocolControlInformation;
1535 PCI_FLOW_STATUS_CONTINUE = 0x0,
1536 PCI_FLOW_STATUS_WAIT = 0x1,
1537 PCI_FLOW_STATUS_OVERFLOW = 0x2
1542#define ISOTP_PROTOCOL_RESULT_OK 0
1543#define ISOTP_PROTOCOL_RESULT_TIMEOUT_A -1
1544#define ISOTP_PROTOCOL_RESULT_TIMEOUT_BS -2
1545#define ISOTP_PROTOCOL_RESULT_TIMEOUT_CR -3
1546#define ISOTP_PROTOCOL_RESULT_WRONG_SN -4
1547#define ISOTP_PROTOCOL_RESULT_INVALID_FS -5
1548#define ISOTP_PROTOCOL_RESULT_UNEXP_PDU -6
1549#define ISOTP_PROTOCOL_RESULT_WFT_OVRN -7
1550#define ISOTP_PROTOCOL_RESULT_BUFFER_OVFLW -8
1551#define ISOTP_PROTOCOL_RESULT_ERROR -9
1554#ifndef ISOTPC_USER_H
1555#define ISOTPC_USER_H
1564void isotp_user_debug(
const char* message, ...);
1572int isotp_user_send_can(
const uint32_t arbitration_id,
1573 const uint8_t* data,
const uint8_t size
1574#
if ISO_TP_USER_SEND_CAN_ARG
1582uint32_t isotp_user_get_us(
void);
1609typedef struct IsoTpLink {
1611 uint32_t send_arbitration_id;
1613 uint8_t* send_buffer;
1614 uint16_t send_buf_size;
1616 uint16_t send_offset;
1619 uint16_t send_bs_remain;
1620 uint32_t send_st_min_us;
1621 uint8_t send_wtf_count;
1622 uint32_t send_timer_st;
1623 uint32_t send_timer_bs;
1626 int send_protocol_result;
1627 uint8_t send_status;
1629 uint32_t receive_arbitration_id;
1631 uint8_t* receive_buffer;
1632 uint16_t receive_buf_size;
1633 uint16_t receive_size;
1634 uint16_t receive_offset;
1637 uint8_t receive_bs_count;
1638 uint32_t receive_timer_cr;
1641 int receive_protocol_result;
1642 uint8_t receive_status;
1644#if defined(ISO_TP_USER_SEND_CAN_ARG)
1645 void* user_send_can_arg;
1659void isotp_init_link(IsoTpLink *link, uint32_t sendid,
1660 uint8_t *sendbuf, uint16_t sendbufsize,
1661 uint8_t *recvbuf, uint16_t recvbufsize);
1668void isotp_poll(IsoTpLink *link);
1678void isotp_on_can_message(IsoTpLink *link,
const uint8_t *data, uint8_t len);
1696int isotp_send(IsoTpLink *link,
const uint8_t payload[], uint16_t size);
1701int isotp_send_with_id(IsoTpLink *link, uint32_t
id,
const uint8_t payload[], uint16_t size);
1714int isotp_receive(IsoTpLink *link, uint8_t *payload,
const uint16_t payload_size, uint16_t *out_size);
1726#if defined(UDS_TP_ISOTP_C)
1735 IsoTpLink phys_link;
1736 IsoTpLink func_link;
1739 uint8_t func_send_buf[8];
1740 uint8_t func_recv_buf[8];
1741 uint32_t phys_sa, phys_ta;
1742 uint32_t func_sa, func_ta;
1754 uint32_t source_addr_func);
1764 uint32_t target_addr_func);
1770#if defined(UDS_TP_ISOTP_C_SOCKETCAN)
1779 IsoTpLink phys_link;
1780 IsoTpLink func_link;
1784 uint32_t phys_sa, phys_ta;
1785 uint32_t func_sa, func_ta;
1800 uint32_t source_addr, uint32_t target_addr,
1801 uint32_t source_addr_func, uint32_t target_addr_func);
1807#if defined(UDS_TP_ISOTP_SOCK)
1822 uint32_t phys_sa, phys_ta;
1823 uint32_t func_sa, func_ta;
1829 uint32_t target_addr,
1830 uint32_t source_addr_func);
1832 uint32_t target_addr,
1833 uint32_t target_addr_func);
1839#if defined(UDS_TP_ISOTP_MOCK)
1845typedef struct ISOTPMock {
1855 uint32_t send_tx_delay_ms;
1856 uint32_t send_buf_size;
1873UDSTp_t *ISOTPMockNew(
const char *name, ISOTPMockArgs_t *args);
1874void ISOTPMockFree(
UDSTp_t *tp);
1881void ISOTPMockLogToFile(
const char *filename);
1882void ISOTPMockLogToStdout(
void);
1887void ISOTPMockReset(
void);
#define UDS_CLIENT_DEFAULT_P2_MS
default P2 timeout
UDSErr_t UDSSendECUReset(UDSClient_t *client, uint8_t type)
Request ECUReset.
UDSErr_t UDSServerTpISOTpCInit(UDSTpISOTpC_t *tp, uint32_t source_addr, uint32_t target_addr, uint32_t source_addr_func)
Initialize isotp-c transport for UDSServer_t.
void UDSServerPoll(UDSServer_t *srv)
Call this at <5ms intervals.
#define UDS_CLIENT_SEND_BUF_SIZE
reduce this at your own risk to save RAM. Fuzz testing is done with the default of UDS_TP_MTU.
@ UDS_EVT_RequestFileTransfer
@ UDS_EVT_ReadDTCInformation
@ UDS_EVT_ClearDiagnosticInfo
@ UDS_EVT_DynamicDefineDataId
@ UDS_EVT_SecAccessRequestSeed
@ UDS_EVT_SecAccessValidateKey
@ UDS_EVT_RequestDownload
@ UDS_EVT_WriteDataByIdent
@ UDS_EVT_RequestTransferExit
@ UDS_EVT_ResponseReceived
@ UDS_EVT_ControlDTCSetting
@ UDS_EVT_DoScheduledReset
@ UDS_EVT_ReadDataByIdent
UDSErr_t UDSSendTesterPresent(UDSClient_t *client)
What's up?
#define UDS_SERVER_DEFAULT_P2_MS
default P2 duration
UDSErr_t UDSSendRequestFileTransfer(UDSClient_t *client, uint8_t mode, const char *filePath, size_t fileSizeUncompressed, size_t fileSizeCompressed)
filesystem-based frontend to TransferData
#define UDS_CLIENT_DEFAULT_P2_STAR_MS
default P2* timeout
UDSErr_t UDSSendRequestTransferExit(UDSClient_t *client)
Call this when finished with TransferData.
UDSTpStatus_t UDSTpPoll(UDSTp_t *hdl)
call this at <5ms intervals
UDSErr_t UDSSendRequestDownload(UDSClient_t *client, uint8_t dataFormatIdentifier, uint8_t addressAndLengthFormatIdentifier, size_t memoryAddress, size_t memorySize)
Request to Download via TransferData.
#define UDS_SERVER_SEND_BUF_SIZE
reduce this at your own risk to save RAM. Fuzz testing is done with the default of UDS_TP_MTU.
void UDSTpIsoTpSockDeinit(UDSTpIsoTpSock_t *tp)
release sockets
#define UDS_CLIENT_RECV_BUF_SIZE
reduce this at your own risk to save RAM. Fuzz testing is done with the default of UDS_TP_MTU.
UDSErr_t UDSUnpackSecurityAccessResponse(const UDSClient_t *client, struct SecurityAccessResponse *resp)
Parse server's response to SecurityAccess.
UDSErr_t UDSSendTransferData(UDSClient_t *client, uint8_t blockSequenceCounter, const uint16_t blockLength, const uint8_t *data, uint16_t size)
Transfer Data to/from a buffer.
int UDS_LogLevel_t
one of valid values for UDS_LOG_LEVEL
UDSErr_t UDSServerTpIsoTpSockInit(UDSTpIsoTpSock_t *tp, const char *ifname, uint32_t source_addr, uint32_t target_addr, uint32_t source_addr_func)
for UDSServer_t
UDSErr_t UDSSendWDBI(UDSClient_t *client, uint16_t dataIdentifier, const uint8_t *data, uint16_t size)
Write Data By Identifier.
UDSTpSize_t UDSTpRecv(UDSTp_t *hdl, uint8_t *buf, size_t bufsize, UDSSDU_t *info)
Receive from transport.
uint32_t UDSTpStatus_t
private: bitfield of UDSTpStatusFlags
UDSErr_t UDSSendCommCtrl(UDSClient_t *client, uint8_t ctrl, uint8_t comm)
Change communication settings.
#define UDS_TP_MTU
ISOTP is the only supported tp type, so UDS inherits its MTU.
UDSErr_t UDSSendSecurityAccess(UDSClient_t *client, uint8_t level, uint8_t *data, uint16_t size)
Get Security Access.
UDSErr_t UDSSendRequestUpload(UDSClient_t *client, uint8_t dataFormatIdentifier, uint8_t addressAndLengthFormatIdentifier, size_t memoryAddress, size_t memorySize)
Request to Upload via TransferData.
uint32_t UDSMillis(void)
Get time in milliseconds.
UDSErr_t UDSCtrlDTCSetting(UDSClient_t *client, uint8_t dtcSettingType, uint8_t *dtcSettingControlOptionRecord, uint16_t len)
control DTC setting
UDSErr_t UDSUnpackRDBIResponse(UDSClient_t *client, UDSRDBIVar_t *vars, uint16_t numVars)
Parse server's response to RDBI.
#define UDS_SERVER_DEFAULT_S3_MS
default S3 duration (ISO14229-2 2013 Table 5: 5000 -0/+200 ms)
UDSErr_t UDSUnpackRoutineControlResponse(const UDSClient_t *client, struct RoutineControlResponse *resp)
Parse server's response to RoutineControl.
#define UDS_SERVER_DEFAULT_P2_STAR_MS
default P2* duration
UDSErr_t UDSClientTpIsoTpSockInit(UDSTpIsoTpSock_t *tp, const char *ifname, uint32_t source_addr, uint32_t target_addr, uint32_t target_addr_func)
for UDSClient_t
#define UDS_SERVER_RECV_BUF_SIZE
reduce this at your own risk to save RAM. Fuzz testing is done with the default of UDS_TP_MTU.
UDSErr_t UDSClientTpISOTpCInit(UDSTpISOTpC_t *tp, uint32_t target_addr, uint32_t source_addr, uint32_t target_addr_func)
Initialize isotp-c transport for UDSClient_t.
UDSErr_t UDSSendRoutineCtrl(UDSClient_t *client, uint8_t type, uint16_t routineIdentifier, const uint8_t *data, uint16_t size)
Request to Twiddle Routines.
uint8_t UDSTpAddr_t
private: oneof UDS_A_TA_Type_t
UDSErr_t
Error Codes, including NRCs defined by the standard.
void UDSTpISOTpCSocketCANDeinit(UDSTpISOTpCSocketCAN_t *tp)
release socket
UDSErr_t UDSSendTransferDataStream(UDSClient_t *client, uint8_t blockSequenceCounter, const uint16_t blockLength, FILE *fd)
Transfer Data to/from a file.
#define UDS_ISOTP_MTU
ISO-TP Maximum Transmission Unit (ISO-15764-2-2004 section 5.3.3).
UDSErr_t UDSUnpackRequestDownloadResponse(const UDSClient_t *client, struct RequestDownloadResponse *resp)
Parse server's response to RequestDownload.
int32_t UDSTpSize_t
Signed size type used by the transport layer interface (byte count, or negative on error).
UDSErr_t UDSClientInit(UDSClient_t *client)
Call this once.
#define UDS_LOG_LEVEL
sets the logging level
UDSErr_t UDSTpISOTpCSocketCANInit(UDSTpISOTpCSocketCAN_t *tp, const char *ifname, uint32_t source_addr, uint32_t target_addr, uint32_t source_addr_func, uint32_t target_addr_func)
Initialize the transport.
UDSErr_t UDSSendDiagSessCtrl(UDSClient_t *client, uint8_t mode)
Change the diagnostic session.
UDSErr_t UDSClientPoll(UDSClient_t *client)
Call at <5ms intervals.
UDSErr_t UDSSendBytes(UDSClient_t *client, const uint8_t *data, uint16_t size)
Send user-defined bytes to a UDS server.
UDSTpSize_t UDSTpSend(UDSTp_t *hdl, const uint8_t *buf, UDSTpSize_t len, const UDSSDU_t *info)
Send to transport.
UDSErr_t UDSServerInit(UDSServer_t *srv)
call this once
UDSErr_t UDSSendRDBI(UDSClient_t *client, const uint16_t *didList, const uint16_t numDataIdentifiers)
Read Data By Identifier.
Request download response structure.
size_t maxNumberOfBlockLength
Routine control response structure.
const uint8_t * routineStatusRecord
uint16_t routineIdentifier
uint8_t routineControlType
uint16_t routineStatusRecordLength
Security access response structure.
uint8_t securityAccessType
uint16_t securitySeedLength
const uint8_t * securitySeed
Clear diagnostic information arguments.
const uint8_t memorySelection
const uint32_t groupOfDTC
const bool hasMemorySelection
uint8_t cfg_file_size_parameter_length
uint8_t cfg_data_format_identifier
int(*) fn(struct UDSClient *client, UDSEvent_t evt, void *ev_data)
uint8_t send_buf[UDS_CLIENT_SEND_BUF_SIZE]
uint8_t recv_buf[UDS_CLIENT_RECV_BUF_SIZE]
Communication control arguments.
Control DTC setting arguments.
Custom service arguments.
uint8_t(*) copyResponse(UDSServer_t *srv, const void *src, uint16_t len)
const uint8_t * optionRecord
Dynamically define data identifier arguments.
Diagnostic session control arguments.
uint32_t powerDownTimeMillis
Input/output control by identifier arguments.
const uint8_t ioCtrlParam
const size_t ctrlStateAndMaskLen
uint8_t(*) copy(UDSServer_t *srv, const void *src, uint16_t count)
const void *const ctrlStateAndMask
Read data by identifier arguments.
uint8_t(*) copy(UDSServer_t *srv, const void *src, uint16_t count)
Read data by identifier variable structure.
Read DTC information arguments.
uint8_t(*) copy(UDSServer_t *srv, const void *src, uint16_t count)
Read memory by address arguments.
uint8_t(*) copy(UDSServer_t *srv, const void *src, uint16_t count)
uint8_t send_buf[UDS_SERVER_SEND_BUF_SIZE]
uint8_t recv_buf[UDS_SERVER_RECV_BUF_SIZE]
Request download arguments.
const uint8_t dataFormatIdentifier
uint16_t maxNumberOfBlockLength
Request file transfer arguments.
size_t fileSizeUnCompressed
const uint8_t modeOfOperation
size_t fileSizeCompressed
uint16_t maxNumberOfBlockLength
const uint16_t filePathLen
const uint8_t dataFormatIdentifier
Request transfer exit arguments.
uint8_t(*) copyResponse(UDSServer_t *srv, const void *src, uint16_t len)
const uint8_t *const data
Request upload arguments.
uint16_t maxNumberOfBlockLength
const uint8_t dataFormatIdentifier
Routine control arguments.
const uint8_t * optionRecord
uint8_t(*) copyStatusRecord(UDSServer_t *srv, const void *src, uint16_t len)
UDS_A_TA_Type_t A_TA_Type
Security access request seed arguments.
const uint8_t *const dataRecord
uint8_t(*) copySeed(UDSServer_t *srv, const void *src, uint16_t len)
Security access validate key arguments.
uint32_t sec_access_auth_fail_timer
uint16_t p2_ms
Server time constants (milliseconds).
bool notReadyToReceive
UDS-1 2013 defines the following conditions under which the server does not process incoming requests...
uint32_t sec_access_boot_delay_timer
UDSErr_t(*) fn(struct UDSServer *srv, UDSEvent_t event, void *arg)
uint32_t s3_session_timeout_timer
uint8_t ecuResetScheduled
uint8_t xferBlockSequenceCounter
bool xferIsActive
UDS-1-2013: Table 407 - 0x36 TransferData Supported negative response codes requires that the server ...
isotp-c over SocketCAN implementation of UDSTp_t
isotp-c implementation of UDSTp_t
linux ISO-TP socket implementation of UDSTp_t
UDSTpStatus_t(*) poll(struct UDSTp *hdl)
Poll the transport layer.
UDSTpSize_t(*) recv(struct UDSTp *hdl, uint8_t *buf, size_t bufsize, UDSSDU_t *info)
Receive data from the transport.
UDSTpSize_t(*) send(struct UDSTp *hdl, const uint8_t *buf, size_t len, const UDSSDU_t *info)
Send data to the transport.
uint8_t(*) copyResponse(UDSServer_t *srv, const void *src, uint16_t len)
const uint8_t *const data
const uint16_t maxRespLen
Write data by identifier arguments.
const uint8_t *const data
Write memory by address arguments.
const uint8_t *const data
struct UDSDDDIArgs_t::@166357164257276222002146302270155120176057041273::@030077060352005266364046135253225021030163312237 defineById
struct UDSDDDIArgs_t::@166357164257276222002146302270155120176057041273::@122167075350102041255165217274110033054226235151 defineByMemAddress
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@154001327012172334201146116375304045171105172314 dtcExtDataRecordIdArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@316272062351030324211305365217344343316022275306 severityInfoOfDTCArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@257326070054040214361234214245165251024355111071 dtcExtDtaRecordByDTCNumArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@047012174113202206257152072274143133322231236121 numOfDTCBySeverityMaskArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@242172112264143020077310143126066111376236317004 dtcStatusByMaskArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@355231136245007054075200356211041150371252334044 userDefMemDTCSnapshotRecordByDTCNumArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@227353312111251376072016263157011107071271365150 dtcInfoByDTCReadinessGroupIdArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@047012174113202206257152072274143133322231236121 dtcBySeverityMaskArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@257326070054040214361234214245165251024355111071 userDefMemDTCExtDataRecordByDTCNumArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@355231136245007054075200356211041150371252334044 dtcSnapshotRecordbyDTCNumArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@154001327012172334201146116375304045171105172314 dtcStoredDataByRecordNumArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@047012174113202206257152072274143133322231236121 wwhobdDTCByMaskArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@251214024221351216066340166017235251143034105333 userDefMemoryDTCByStatusMaskArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@154001327012172334201146116375304045171105172314 dtcExtDataRecordByRecordNumArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@227353312111251376072016263157011107071271365150 wwhobdDTCWithPermStatusArgs
struct UDSRDTCIArgs_t::@362145371326305243133264240062265164011177277257::@242172112264143020077310143126066111376236317004 numOfDTCByStatusMaskArgs