Skip to content

Automotive VAG filter fields ​

The VAG profile uses CAN fields on the Physical layer, ISO-TP / TP2.0 fields on the Transport layer, and UDS / KWP2000 fields on the Protocol layer. In a mixed trace, use or to select different protocols on the same layer with one expression.

Selecting a protocol ​

Both layers use protocol.type. Its values and suggestions depend on the selected layer. The field identifies the message's protocol, not the physical adapter.

LayerFieldTypeValues
Transportprotocol.typeStringisotp, tp20
Protocolprotocol.typeStringuds, kwp2000

Example: ISO-TP messages on the Transport layer.

text
protocol.type == isotp

Example: KWP2000 messages on the Protocol layer.

text
protocol.type == kwp2000

Example: a protocol type and service.

text
protocol.type == uds and uds.service == 0x22

Example: several protocol types.

text
protocol.type in (uds, kwp2000)

Suggestions list protocols present in the trace. You can enter an absent type manually. See protocol type suggestions for how the list updates.

For diagnostics over CAN, TP2.0 belongs to the Transport layer and KWP2000 to the Protocol layer.

Shared diagnostic addressing ​

The address.* fields work at the Physical (CAN), Transport (ISO-TP), and Protocol (UDS) levels. Values come from the selected diagnostic profile, including the 11-bit or 29-bit CAN identifier format, independently of row labels and RX/TX. These fields are not published for TP2.0, KWP2000, or CANopen; their records in a mixed source have no diagnostic address values.

FieldTypeMeaning
address.typeStringphysical, functional, unknown
address.roleStringphysicalRequest, physicalResponse, functionalRequest, unknown
address.groupStringFunctional group identifier; absent for physical channels
address.requestIdIntegerPhysical request CAN ID or functional group CAN ID
address.responseIdIntegerPhysical response CAN ID; absent for functional groups

unknown means addressing could not be determined because information is missing or conflicting. In this case, channel identifiers and the group identifier are absent. At the UDS level, the decoded message is also checked against the address role, so a conflict may only become visible after decoding.

Functional requests, including passively received requests:

text
address.type == functional

Both sides of one physical channel:

text
address.type == physical and address.requestId == 0x714 and address.responseId == 0x77E

Requests to the VAG coordination group:

text
address.group == "vag.coordination"

Unknown and conflicting addresses:

text
address.type == unknown

A group filter selects requests to that group, not replies from assumed members. Replies remain physical, and group membership is not inferred automatically. The example IDs 0x714/0x77E are a specific pair, not a universal VAG rule. The old uds.addressing field was removed: replace it with address.type in saved expressions.

UDS — Protocol ​

FieldTypeMeaning and applicability
uds.serviceIntegerNormalized original service, shared by a recognized request, positive response and negative response
uds.rawSidIntegerActual SID byte in the message
uds.requestBooleanThe message has a known request role
uds.responseBooleanThe message has a known response role
uds.positiveResponseBooleanPositive response; response-type fields do not apply to requests
uds.negativeResponseBooleanNegative response; response-type fields do not apply to requests
uds.negativeResponseCodeIntegerNegative response code (NRC)
uds.didIntegerDID in recognized read/write-by-identifier requests and positive responses
uds.ridIntegerRID in a recognized RoutineControl request or positive response
uds.sessionIntegerSession from DiagnosticSessionControl or its positive response; not the current session of every message
uds.srcIntegerSource address from the diagnostic context, when known
uds.dstIntegerDestination address from the diagnostic context, when known
uds.dataBytesComplete UDS application message including SID, without ISO-TP overhead

uds.src and uds.dst come from the diagnostic context. Do not substitute them for CAN IDs without checking the message's addressing. Use can.id on the Physical layer or isotp.canId on the Transport layer for CAN IDs.

Service and SID ​

text
uds.service == 0x22

This matches recognized 22 … requests, 62 … positive responses and 7F 22 … negative responses. To select the positive SID specifically:

text
uds.rawSid == 0x62

VIN by DID:

text
uds.service == 0x22 and uds.did == 0xF190

A negative response does not contain the original request's DID or RID. Filtering by those fields does not add that response automatically. To include negative responses to the read service, broaden the filter expression:

text
uds.service == 0x22 and (uds.did == 0xF190 or uds.negativeResponse == true)

A negative response in this selection may belong to another DID of the same service. Check the sequence and addressing to establish the relationship.

Waiting for processing to complete:

text
uds.negativeResponseCode == 0x78

0x78 means ResponsePending, not a final rejection. This filter finds the pending response but hides a subsequent positive response. Return to the service filter to examine completion.

KWP2000 — Protocol ​

This section covers KWP2000 over TP2.0 on CAN; K-Line capture is outside its scope.

FieldTypeMeaning and applicability
kwp.serviceIntegerNormalized original service
kwp.rawSidIntegerActual message SID
kwp.requestBooleanKnown request role
kwp.responseBooleanKnown response role
kwp.positiveResponseBooleanPositive response; not applicable to requests
kwp.negativeResponseBooleanNegative response; not applicable to requests
kwp.negativeResponseCodeIntegerNegative response code (NRC)
kwp.localIdIntegerLocal data or routine identifier, when extracted from the message
kwp.commonIdIntegerCommon data identifier, when present and recognized
kwp.srcIntegerKnown logical source address
kwp.dstIntegerKnown logical destination address
kwp.dataBytesComplete KWP2000 application message including SID

Read-by-local-identifier service:

text
kwp.service == 0x21

Negative responses from both protocols in one application-layer table:

text
uds.negativeResponse == true or kwp.negativeResponse == true

Do not replace or with and: one message cannot belong to both UDS and KWP2000.

The separate TesterPresent toggle hides the corresponding recognized UDS/KWP2000 messages and works together with the expression. Enable their display before investigating TesterPresent itself.

ISO-TP — Transport ​

FieldTypeMeaning and applicability
isotp.canIdIntegerCAN identifier of the transport message
isotp.frameTypeStringType from which the row was formed: single, first, consecutive, flowControl
isotp.payloadLengthIntegerISO-TP payload length without PCI
isotp.flowStatusStringFlow Control only: continue, wait, overflow
isotp.blockSizeIntegerBlock size from Flow Control
isotp.stMinIntegerRaw STmin byte from Flow Control; not a universal millisecond count
isotp.fdBooleanConsistent CAN FD flag across source frames; absent if evidence is insufficient or contradictory
isotp.brsBooleanConsistent BRS flag across source frames; absent if evidence is insufficient or contradictory
isotp.dataBytesISO-TP payload without PCI

Rows on the Transport layer result from processing source frames. Their count and payload need not match the number or contents of individual CAN frames. Switch to the Physical layer to inspect specific PCI bytes.

Receiver waiting or overflowing:

text
isotp.frameType == flowControl and isotp.flowStatus in (wait, overflow)

All Flow Control messages for a selected CAN ID:

text
isotp.canId == 0x7E8 and isotp.frameType == flowControl

0x7E8 is an example, not a universal VAG address. Use the identifier from your trace.

TP2.0 — Transport ​

FieldTypeMeaning and applicability
tp20.channelIntegerObserved channel number; may be absent before channel establishment
tp20.frameTypeStringChannel setup or operation message type; values listed below
tp20.sequenceIntegerData or acknowledgment sequence number
tp20.ackBooleanAcknowledgment requested by a data message; does not mean this row is an acknowledgment
tp20.rnrBooleanReceiver Not Ready in an acknowledgment message
tp20.applicationTypeIntegerApplication type from setup or known channel state
tp20.dataBytesReassembled TP2.0 application data, when available

Values of tp20.frameType:

GroupValues
Broadcast exchangebroadcastRequest, broadcastResponse
Channel establishmentchannelSetup, channelAcknowledge
Establishment failurechannelApplicationTypeNotSupported, channelApplicationTypeTemporarilyNotSupported, channelNoResources
Data and acknowledgmentsdata, acknowledge
Connection parametersconnectionSetup, connectionAcknowledge
Control and terminationconnectionTest, break, disconnect

Receiver not ready:

text
tp20.rnr == true

Opening and closing a channel:

text
tp20.frameType in (channelSetup, channelAcknowledge, disconnect)

Acknowledgments:

text
tp20.frameType == acknowledge

Channel establishment failure:

text
tp20.frameType in (channelApplicationTypeNotSupported, channelApplicationTypeTemporarilyNotSupported, channelNoResources)

Decoding a dynamic channel requires its setup context; see VAG Tracer layers.

For more on matching messages, see services and ECU responses.

Protohaund is independent software and is not affiliated with, endorsed by, sponsored by, or certified by any third-party organization referenced in the application.Third-party names, trademarks, product names, device names, protocol names, and standards are referenced solely to identify vehicle applicability, supported products, technologies, protocols, formats, or compatibility.All third-party trademarks and other marks are the property of their respective owners. Their use does not imply any affiliation with, endorsement of, certification of, or approval of Protohaund by their respective owners.Compatibility is limited to the features, devices, protocols, standards, and versions explicitly documented by Protohaund.