Today, I decided to get cuddly with the relevant RFCs and see if I could adapt them into something that would work for AX.25. The following roughly describes how one might stuff IPv6 datagrams into AX.25.
Much of this is heavily influenced by RFC-4944 and RFC-6282, the latter of which looks to be the heart-and-soul of Thread.
Stateless Automatic Addressing
We have a mechanism by which an AX.25 call+SSID can be losslessly mapped to a 48-bit MAC address. This is built on Radix-50 and can work as a stand-in for the EUI-48. The pseudo EUI-48 procedure mentioned in section 6 of the RFC-4944 standard is not required.
An EUI-64 is generated from an EUI-48 by chopping the EUI-48 in half and inserting the bytes ff:fe
in the middle. So the EUI-48:
00:11:22:33:44:55
becomes the following EUI-64:
00:11:22:ff:fe:33:44:55
SLAAC therefore will work the same way it does for Ethernet.
Frame format
1. AX.25 UI Frame header
Size: (17 + (D*7) bytes, where D is the number of digipeaters being used
- PID = 1100 0101 (tentative) IPv6
- Control = 0000 0011
- Frame type: UI, P/F = 0 (final)
- Must contain source and destination AX.25 callsigns, may contain up to 8 digipeater AX.25 callsigns.
For a direct station-to-station contact:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┴───┴───┴───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┤
│ AX.25 Flag (0x7e) │ Destination AX.25 Call+SSID │
├───────────────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├───────────────────────────────────────────────────────────────┤
│ Source AX.5 Call+SSID │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬───────────────────────────────┤
│ │ AX.25 PID │
├───────────────────────────────┴───────────────────────────────┤
╎ AX.25 UI frame payload starts here ╎
└╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
or for contact via a few digipeaters:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┴───┴───┴───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┤
│ AX.25 Flag (0x7e) │ Destination AX.25 Call+SSID │
├───────────────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├───────────────────────────────────────────────────────────────┤
│ Source AX.5 Call+SSID │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬───────────────────────────────┤
│ │ Digipeater 1 Call+SSID │
├───────────────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├───────────────────────────────────────────────────────────────┤
│ Digipeater 2 Call+SSID │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬───────────────────────────────┤
│ │ AX.25 PID │
├───────────────────────────────┴───────────────────────────────┤
╎ AX.25 UI frame payload starts here ╎
└╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
2. Mesh Addressing Header
To be used when two stations are not able to directly communicate, or when multicasting.
In this scenario, the AX.25 frame source and destination indicate the addresses of the directly-communicating nodes (e.g. source and digipeater, intermediate digipeaters, or digipeater and destination), and the fields given here will be the addresses of the source and destination AX.25 stations.
e.g. sending from VK4MSL-0
to VK4MDL-9
via
VK4RZB-0
and VK4RZA-0
:
- First transmission:
- AX.25 Src:
VK4MSL-0
- AX.25 Dst:
VK4RZB-0
- Mesh Src:
VK4MSL-0
- Mesh Dst:
VK4MDL-9
- Hops: 7
- Intermediate hop:
- AX.25 Src:
VK4RZB-0
- AX.25 Dst:
VK4RZA-0
- Mesh Src:
VK4MSL-0
- Mesh Dst:
VK4MDL-9
- Hops: 6
- Final delivery:
- AX.25 Src:
VK4RZA-0
- AX.25 Dst:
VK4MDL-9
- Mesh Src:
VK4MSL-0
- Mesh Dst:
VK4MDL-9
- Hops: 5
Unlike 802.15.4, we do not have 16-bit short addresses. Since these bits would otherwise always be set to 0, we will use these to provide a 6-bit “hops left” field. We shall use the value 63 (0x3f) to indicate when there are 63 or more hops remaining.
We will use the raw 48-bit addresses here. In keeping with amateur radio conventions, the source and destinations are flipped compared to RFC-4944.
Header format (13 bytes):
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┼───┴───┴───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┤
│ 1 0 │ Hops Left │ Destination Address │
├───────┴───────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬───────────────────────────────┤
│ │ Source Address │
├───────────────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬───────────────────────────────┤
│ │ Remaining AX.25 Payload │
├───────────────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
╎ ╎
└╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
4. Fragmentation header
To be used when a IPv6 datagram is greater than L bytes, where L may be defined to be between 64 and 216 bytes.
This part is identical to that of RFC-4944 (section 5.3). I’ll come back to this bit.
5. IPv6 datagram
This can be encoded in a number of ways depending on requirements:
5.1. Raw IPv6 datagram
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┼───┴───┴───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┤
│ 0 1 │ 6LP_IPV6 │ │
├───────┴───────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
╎ Raw IPv6 datagram with payload. ╎
└╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
6LP_IPV6
is the value 0x01, as per RFC-4944. The IPv6 datagram is encoded as per RFC-2460, and includes its payload.
The AX.25 frame is finished off with the frame-check sequence.
5.2. Compressed IPv6 datagram
In this format, the datagram fields are compressed, either through making static assumptions, or by deriving them from things such as the AX.25 header, or a previously agreed-to context.
The first field in such payloads is the 6LP_IPHC
field:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
│ 0 1 1 │ 6LP_IPV6 with CID=1 │
├───────────┴───────────────────┬───────────────────────────────┤
│ Context ID Byte │ │
├───────────────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
╎ Compressed IPv6 datagram with payload. ╎
└╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
or without the context ID
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
│ 0 1 1 │ 6LP_IPV6 with CID=0 │
├───────────┴───────────────────────────────────────────────────┤
╎ Compressed IPv6 datagram with payload. ╎
└╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
The 6LP_IPHC
field is a 13-bit field, optionally followed by a context ID extension byte. The bit allocations are as follows:
0 1 2 3 4 5 6 7 8 9 10 11 12
├───┴───┼───┼───┴───┼───┼───┼───┴───┴───┼───┼───┼───┤
│ TF │ NH│ HLIM │CID│SAC│ SAM │ M │DAC│DAM│
└───────┴───┴───────┴───┴───┴───────────┴───┴───┴───┘
- (MSB) 0-1:
TF
Traffic Class, Flow Label. See 5.2.1 below.
- 2:
NH
Next Header encoding
- =0: Given explicitly
- =1: Encoded using
6LP_NHC
- 3-4:
HLIM
Hop Limit
- =00: Given explicitly
- =01: is set to 1
- =10: is set to 64
- =11: is set to 255
- 5:
CID
Context Identifier Extension
- =0: No
CID
byte follows
- =1: A
CID
byte follows
- 6-8:
SAC
Source Address Compression / SAM
Mode
- =000: No compression applied, whole address given
- =001: Prefix is link-local prefix, remaining bits are given.
- =x10: Not used in 6LoWHAM (we don’t support 16-bit addresses)
- =011: Prefix is link-local, figure the rest out from the source address in the AX.25 header.
- =100: Unspecified address
::
- =101: See the context for the prefix, remaining bits are given.
- =111: Figure out the address from the AX.25 header and context.
- (LSB) 9-12:
M
Multicast, DAC
Destination Address Compression
DAM
Mode
- =0000: No compression, not multicast, whole address given
- =0001: Prefix is link-local prefix, remaining bits are given. Not multicast.
- =xx10: Not used in 6LoWHAM (we don’t support 16-bit addresses)
- =0011: Prefix is link-local, figure the rest out from the destination address in the AX.25 header. Not multicast.
- =0100: Reserved
- =0101: See the context for the prefix, remaining bits are given. Not multicast.
- =0111: Figure out the address from the AX.25 header and context. Not multicast.
- =1000: No compression, multicast address, whole address given
- =1001: 48-bits of multicast address given, fill in the blanks:
ff__::00__:____:____
.
- =1010: 32-bits of multicast address given, fill in the blanks:
ff__::00__:____
.
- =1011: 8-bits of multicast address given, fill in the blanks:
ff02::00__
.
- =1100: 48-bits RFC-3306/RFC-3956 address,
ff__:__LL:PPPP:PPPP:PPPP:PPPP:____:____
where P
and L
come from the context.
- =1101: Reserved
- =1110: Reserved
- =1111: Reserved
The context ID extension byte has the following format:
0 1 2 3 4 5 6 7
├───┴───┴───┴───┼───┴───┴───┴───┤
│ SCI │ DCI │
└───────────────┴───────────────┘
- (MSB) 0-3: Source Context Identifier
- (LSB) 4-7: Destination Context Identifier
These two sub-fields indicate which specific context is being used to fill in the blanks.
5.2.1: Traffic Class and Flow Label
These may be partially or completely omitted depending on the TF
setting in the previous field.
TF
=00:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┼───┴───┴───┴───┴───┴───┼───┴───┴───┴───┼───┴───┴───┴───┤
│ ECN │ DCSP │ 0 0 0 0 │ │
├───────┴───────────────────────┴───────────────┴ ─ ─ ─ ─ ─ ─ ─ ┤
│ Flow Label │
└───────────────────────────────────────────────────────────────┘
TF
=01:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┼───┴───┼───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
│ ECN │ 0 0 │ │
├───────┴───────┴ ─ ─ ─ ─ ─ ─ ─ ┬───────────────────────────────┤
│ Flow Label │ │
├───────────────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
╎ Remainder of IPv6 datagram. ╎
└╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
TF
=10:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┼───┴───┴───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┤
│ ECN │ DCSP │ │
├───────┴───────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
╎ Remainder of IPv6 datagram. ╎
└╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
TF
=11: Flow label, ECN
and DCSP
are set to 0.
5.2.2: Next Header
If 6LP_NHC
is not explicitly enabled, the next header byte will appear next.
5.2.3: Hop Limit.
Again, if not explicitly defined in the 6LP_IPHC
header, the hop-limit byte will appear next.
5.2.4: Source address
The format here is determined by the values of SAC
/SAM
:
- 000: Entire IPv6 address, 16 bytes given here.
- x01: Last 8-bytes of the address given here
- For all other values, the source address is omitted.
5.2.5: Destination address
The format here is determined by the values of M
/DAC
/DAM
:
- x000: Entire IPv6 address, 16 bytes given here.
- 0x01: Last 8-bytes of the address given here.
- 1001: 6-bytes of address given here, fill-in-the-blanks.
- 1010: 4-bytes of address given here, fill-in-the-blanks.
- 1011: Last byte of address given here, fill-in-the-blank.
- 1100: 6-bytes of address given here, fill-in-the-blanks.
- For all other values, the destination address is omitted.
6. 6LoWPAN Next Header
This is used to encode selected IPv6 extensions or L4 protocol headers.
6.1. IPv6 extension headers
A select number of IPv6 extensions may be encoded by replacing the usual “Next Header” byte with the following:
0 1 2 3 4 5 6 7
├───┴───┴───┴───┼───┴───┴───┼───┤
│ 1 1 1 0 │ EID │ N │
└───────────────┴───────────┴───┘
where EID
(bits 4-6) is one of:
- =0 IPv6 Hop-By-Hop options
- =1 IPv6 Routing
- =2 IPv6 Fragment
- =3 IPv6 Destination Options
- =4 IPv6 Mobility
- =7 IPv6 Header
and N
(bit 7) indicates whether the header’s payload is followed by another 6LowPAN Next Header, or a regular IPv6 Next Header (with its “Next Header” byte). For EID
=7, N
MUST be 0.
Length fields within the header payload should be counted in bytes instead of 8-byte blocks.
7. Datagram payload
7.1. Non-UDP payloads
For payloads other than UDP packets, these should be inserted into the AX.25 payload as-is following the extensions.
UDP packets with uncompressed headers should also be inserted
in this manner.
7.2. UDP payloads with header compression
For these payloads, the following UDP header should be used:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┴───┴───┴───┼───┼───┴───┼───┴───┴───┴───┴───┴───┴───┴───┤
│ 1 1 1 1 0 │ C │ P │ Source Port │
├───────────────────┴───┴───────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
╎ ╎
├───────────────────────────────────────────────────────────────┤
╎ Destination Port ╎
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
╎ ╎
├───────────────────────────────────────────────────────────────┤
│ Checksum (unless C=1) │
└───────────────────────────────────────────────────────────────┘
- (MSB): bits 0-4: Compressed UDP header marker. Literal 11110₂
- Bit 5:
C
Compressed UDP checksum
- 0= UDP checksum is given (recommended value)
- 1= UDP checksum is omitted
- Bits 6-7:
P
Ports
- 00=Both source and destination addresses are
given in full
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
│ Source Port │
├───────────────────────────────────────────────────────────────┤
│ Destination Port │
└───────────────────────────────────────────────────────────────┘
- 01=Source port is given in full, Least significant 8-bits of destination given, destination port is 0xff00-0xffff (65280-65535)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
│ Source Port │
├───────────────────────────────┬───────────────────────────────┤
│ Destination Port │ │
├───────────────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
╎ Remainder of UDP packet ╎
└╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
- 10=Destination port is given in full, Least significant 8-bits of source given, source port is 0xff00-0xffff (65280-65535)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┴───┴───┴───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┤
│ Source Port │ Destination Port │
├───────────────────────────────┼───────────────────────────────┤
│ Destination Port (cont.) │ │
├───────────────────────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤
╎ Remainder of UDP packet ╎
└╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┘
- 11=Only least significant 4-bits of source and destination ports are given. Port LSB range is 0xf0b0-0xf0bf (61616-61631)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
├───┴───┴───┴───┴───┴───┴───┴───┼───┴───┴───┴───┴───┴───┴───┴───┤
│ Source Port │ Destination Port │
└───────────────────────────────┴───────────────────────────────┘
The C
bit should only be set if the upper-level application asks for it. Whilst 802.15.4 does its own CRC as does AX.25, the field is mandatory in UDP and the recommendation is to only drop it if the application says it’s okay.
Recent Comments