Skip to content

Commit 4494b42

Browse files
JordanYateskartben
authored andcommitted
modem: ppp: use peer control character map
Use the peers asychronous control character map to only escape characters that need to be, instead of always escaping bytes 0 to 31. For data packets with values randomly distributed, this results in 11% fewer bytes needing to be transmitted over the link, if no bytes need to be escaped (256+2)/(256+2+32). Signed-off-by: Jordan Yates <[email protected]>
1 parent fbb84c7 commit 4494b42

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

subsys/modem/modem_ppp.c

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,25 @@ static uint16_t modem_ppp_ppp_protocol(struct net_pkt *pkt)
5151
return 0;
5252
}
5353

54-
static bool modem_ppp_needs_escape(uint8_t byte)
54+
static bool modem_ppp_needs_escape(uint32_t async_map, uint8_t byte)
5555
{
56-
return (byte == MODEM_PPP_CODE_DELIMITER) || (byte == MODEM_PPP_CODE_ESCAPE) ||
57-
(byte < MODEM_PPP_VALUE_ESCAPE);
56+
uint32_t byte_bit;
57+
58+
if ((byte == MODEM_PPP_CODE_DELIMITER) || (byte == MODEM_PPP_CODE_ESCAPE)) {
59+
/* Always escaped */
60+
return true;
61+
} else if (byte >= MODEM_PPP_VALUE_ESCAPE) {
62+
/* Never escaped */
63+
return false;
64+
}
65+
byte_bit = BIT(byte);
66+
/* Escaped if required by the async control character map */
67+
return byte_bit & async_map;
5868
}
5969

6070
static uint32_t modem_ppp_wrap(struct modem_ppp *ppp, uint8_t *buffer, uint32_t available)
6171
{
72+
uint32_t async_map = ppp_peer_async_control_character_map(ppp->iface);
6273
uint32_t offset = 0;
6374
uint32_t remaining;
6475
uint16_t protocol;
@@ -111,12 +122,12 @@ static uint32_t modem_ppp_wrap(struct modem_ppp *ppp, uint8_t *buffer, uint32_t
111122
ppp->tx_pkt_fcs = modem_ppp_fcs_update(ppp->tx_pkt_fcs, upper);
112123
ppp->tx_pkt_fcs = modem_ppp_fcs_update(ppp->tx_pkt_fcs, lower);
113124
/* Push protocol bytes (with required escaping) */
114-
if (modem_ppp_needs_escape(upper)) {
125+
if (modem_ppp_needs_escape(async_map, upper)) {
115126
buffer[offset++] = MODEM_PPP_CODE_ESCAPE;
116127
upper ^= MODEM_PPP_VALUE_ESCAPE;
117128
}
118129
buffer[offset++] = upper;
119-
if (modem_ppp_needs_escape(lower)) {
130+
if (modem_ppp_needs_escape(async_map, lower)) {
120131
buffer[offset++] = MODEM_PPP_CODE_ESCAPE;
121132
lower ^= MODEM_PPP_VALUE_ESCAPE;
122133
}
@@ -135,8 +146,8 @@ static uint32_t modem_ppp_wrap(struct modem_ppp *ppp, uint8_t *buffer, uint32_t
135146
(void)net_pkt_read_u8(ppp->tx_pkt, &byte);
136147
/* FCS is computed without the escape/modification */
137148
ppp->tx_pkt_fcs = modem_ppp_fcs_update(ppp->tx_pkt_fcs, byte);
138-
/* Push encoded bytes into buffer */
139-
if (modem_ppp_needs_escape(byte)) {
149+
/* Push encoded bytes into buffer*/
150+
if (modem_ppp_needs_escape(async_map, byte)) {
140151
buffer[offset++] = MODEM_PPP_CODE_ESCAPE;
141152
byte ^= MODEM_PPP_VALUE_ESCAPE;
142153
remaining--;
@@ -157,12 +168,12 @@ static uint32_t modem_ppp_wrap(struct modem_ppp *ppp, uint8_t *buffer, uint32_t
157168
ppp->tx_pkt_fcs = modem_ppp_fcs_final(ppp->tx_pkt_fcs);
158169
lower = (ppp->tx_pkt_fcs >> 0) & 0xFF;
159170
upper = (ppp->tx_pkt_fcs >> 8) & 0xFF;
160-
if (modem_ppp_needs_escape(lower)) {
171+
if (modem_ppp_needs_escape(async_map, lower)) {
161172
buffer[offset++] = MODEM_PPP_CODE_ESCAPE;
162173
lower ^= MODEM_PPP_VALUE_ESCAPE;
163174
}
164175
buffer[offset++] = lower;
165-
if (modem_ppp_needs_escape(upper)) {
176+
if (modem_ppp_needs_escape(async_map, upper)) {
166177
buffer[offset++] = MODEM_PPP_CODE_ESCAPE;
167178
upper ^= MODEM_PPP_VALUE_ESCAPE;
168179
}

0 commit comments

Comments
 (0)