Skip to content

Commit bff65b6

Browse files
Tomasz Bursztykacarlescufi
authored andcommitted
net/ethernet: Let's remove the use for ll reserve
There is no need to reserve any space for each frag, as the l2 will allocate a frag for the ethernet header, arp will do the same. This is one step further to removing the concept of ll reserve. Signed-off-by: Tomasz Bursztyka <[email protected]>
1 parent 1529240 commit bff65b6

File tree

11 files changed

+35
-174
lines changed

11 files changed

+35
-174
lines changed

drivers/ethernet/eth_dw.c

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -172,21 +172,13 @@ static void eth_tx_data(struct eth_runtime *context, u8_t *data, u16_t len)
172172
static int eth_tx(struct device *dev, struct net_pkt *pkt)
173173
{
174174
struct eth_runtime *context = dev->driver_data;
175+
struct net_buf *frag;
175176

176177
/* Ensure we're clear to transmit. */
177178
eth_tx_spin_wait(context);
178179

179-
if (!pkt->frags) {
180-
eth_tx_data(context, net_pkt_ll(pkt),
181-
net_pkt_ll_reserve(pkt));
182-
} else {
183-
struct net_buf *frag;
184-
185-
eth_tx_data(context, net_pkt_ll(pkt),
186-
net_pkt_ll_reserve(pkt) + pkt->frags->len);
187-
for (frag = pkt->frags->frags; frag; frag = frag->frags) {
188-
eth_tx_data(context, frag->data, frag->len);
189-
}
180+
for (frag = pkt->frags; frag; frag = frag->frags) {
181+
eth_tx_data(context, frag->data, frag->len);
190182
}
191183

192184
return 0;

drivers/ethernet/eth_e1000.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,10 @@ static enum ethernet_hw_caps e1000_caps(struct device *dev)
5252

5353
static size_t e1000_linearize(struct net_pkt *pkt, void *buf, size_t bufsize)
5454
{
55-
size_t len = net_pkt_ll_reserve(pkt) + pkt->frags->len;
55+
size_t len = 0;
5656
struct net_buf *nb;
5757

58-
/* First fragment contains link layer (Ethernet) header */
59-
memcpy(buf, net_pkt_ll(pkt), len);
60-
61-
for (nb = pkt->frags->frags; nb; nb = nb->frags) {
58+
for (nb = pkt->frags; nb; nb = nb->frags) {
6259
memcpy((u8_t *) buf + len, nb->data, nb->len);
6360
len += nb->len;
6461
}

drivers/ethernet/eth_enc28j60.c

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -409,9 +409,8 @@ static void eth_enc28j60_init_phy(struct device *dev)
409409
static int eth_enc28j60_tx(struct device *dev, struct net_pkt *pkt)
410410
{
411411
struct eth_enc28j60_runtime *context = dev->driver_data;
412-
u16_t len = net_pkt_ll_reserve(pkt) + net_pkt_get_len(pkt);
413412
u16_t tx_bufaddr = ENC28J60_TXSTART;
414-
bool first_frag = true;
413+
u16_t len = net_pkt_get_len(pkt);
415414
u8_t per_packet_control;
416415
u16_t tx_bufaddr_end;
417416
struct net_buf *frag;
@@ -446,19 +445,7 @@ static int eth_enc28j60_tx(struct device *dev, struct net_pkt *pkt)
446445
eth_enc28j60_write_mem(dev, &per_packet_control, 1);
447446

448447
for (frag = pkt->frags; frag; frag = frag->frags) {
449-
u8_t *data_ptr;
450-
u16_t data_len;
451-
452-
if (first_frag) {
453-
data_ptr = net_pkt_ll(pkt);
454-
data_len = net_pkt_ll_reserve(pkt) + frag->len;
455-
first_frag = false;
456-
} else {
457-
data_ptr = frag->data;
458-
data_len = frag->len;
459-
}
460-
461-
eth_enc28j60_write_mem(dev, data_ptr, data_len);
448+
eth_enc28j60_write_mem(dev, frag->data, frag->len);
462449
}
463450

464451
tx_bufaddr_end = tx_bufaddr + len;

drivers/ethernet/eth_mcux.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ static int eth_tx(struct device *dev, struct net_pkt *pkt)
470470
bool timestamped_frame;
471471
#endif
472472

473-
u16_t total_len = net_pkt_ll_reserve(pkt) + net_pkt_get_len(pkt);
473+
u16_t total_len = net_pkt_get_len(pkt);
474474

475475
k_sem_take(&context->tx_buf_sem, K_FOREVER);
476476

@@ -479,18 +479,9 @@ static int eth_tx(struct device *dev, struct net_pkt *pkt)
479479
*/
480480
imask = irq_lock();
481481

482-
/* Gather fragment buffers into flat Ethernet frame buffer
483-
* which can be fed to MCUX Ethernet functions. First
484-
* fragment is special - it contains link layer (Ethernet
485-
* in our case) headers and must be treated specially.
486-
*/
482+
/* Copy the fragments */
487483
dst = context->frame_buf;
488-
memcpy(dst, net_pkt_ll(pkt),
489-
net_pkt_ll_reserve(pkt) + pkt->frags->len);
490-
dst += net_pkt_ll_reserve(pkt) + pkt->frags->len;
491-
492-
/* Continue with the rest of fragments (which contain only data) */
493-
frag = pkt->frags->frags;
484+
frag = pkt->frags;
494485
while (frag) {
495486
memcpy(dst, frag->data, frag->len);
496487
dst += frag->len;

drivers/ethernet/eth_native_posix.c

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -120,16 +120,10 @@ static struct gptp_hdr *check_gptp_msg(struct net_if *iface,
120120
struct net_pkt *pkt,
121121
bool is_tx)
122122
{
123+
u8_t *msg_start = net_pkt_ll(pkt);
123124
struct gptp_hdr *gptp_hdr;
124-
u8_t *msg_start;
125125
int eth_hlen;
126126

127-
if (net_pkt_ll_reserve(pkt)) {
128-
msg_start = net_pkt_ll(pkt);
129-
} else {
130-
msg_start = net_pkt_ip_data(pkt);
131-
}
132-
133127
#if defined(CONFIG_NET_VLAN)
134128
if (net_eth_get_vlan_status(iface)) {
135129
struct net_eth_vlan_hdr *hdr_vlan;
@@ -220,13 +214,7 @@ static int eth_send(struct device *dev, struct net_pkt *pkt)
220214
int count = 0;
221215
int ret;
222216

223-
/* First fragment contains link layer (Ethernet) headers.
224-
*/
225-
count = net_pkt_ll_reserve(pkt) + pkt->frags->len;
226-
memcpy(ctx->send, net_pkt_ll(pkt), count);
227-
228-
/* Then the remaining data */
229-
frag = pkt->frags->frags;
217+
frag = pkt->frags;
230218
while (frag) {
231219
memcpy(ctx->send + count, frag->data, frag->len);
232220
count += frag->len;

drivers/ethernet/eth_sam_gmac.c

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -330,17 +330,12 @@ static struct gptp_hdr *check_gptp_msg(struct net_if *iface,
330330
struct net_pkt *pkt,
331331
bool is_tx)
332332
{
333+
u8_t *msg_start = net_pkt_ll(pkt);
333334
struct ethernet_context *eth_ctx;
334335
struct gptp_hdr *gptp_hdr;
335336
int eth_hlen;
336337
u8_t *msg_start;
337338

338-
if (net_pkt_ll_reserve(pkt)) {
339-
msg_start = net_pkt_ll(pkt);
340-
} else {
341-
msg_start = net_pkt_ip_data(pkt);
342-
}
343-
344339
#if defined(CONFIG_NET_VLAN)
345340
eth_ctx = net_if_l2_data(iface);
346341
if (net_eth_is_vlan_enabled(eth_ctx, iface)) {
@@ -1318,7 +1313,7 @@ static int eth_tx(struct device *dev, struct net_pkt *pkt)
13181313
struct gmac_desc_list *tx_desc_list;
13191314
struct gmac_desc *tx_desc;
13201315
struct net_buf *frag;
1321-
u8_t *frag_data, *frag_orig;
1316+
u8_t *frag_data;
13221317
u16_t frag_len;
13231318
u32_t err_tx_flushed_count_at_entry;
13241319
unsigned int key;
@@ -1343,15 +1338,6 @@ static int eth_tx(struct device *dev, struct net_pkt *pkt)
13431338
tx_desc_list = &queue->tx_desc_list;
13441339
err_tx_flushed_count_at_entry = queue->err_tx_flushed_count;
13451340

1346-
/* Store the original frag data pointer */
1347-
frag_orig = pkt->frags->data;
1348-
1349-
/* First fragment is special - it contains link layer (Ethernet
1350-
* in our case) header. Modify the data pointer to account for more data
1351-
* in the beginning of the buffer.
1352-
*/
1353-
net_buf_push(pkt->frags, net_pkt_ll_reserve(pkt));
1354-
13551341
frag = pkt->frags;
13561342
while (frag) {
13571343
frag_data = frag->data;
@@ -1403,9 +1389,6 @@ static int eth_tx(struct device *dev, struct net_pkt *pkt)
14031389
frag = frag->frags;
14041390
}
14051391

1406-
/* Restore the original frag data pointer */
1407-
pkt->frags->data = frag_orig;
1408-
14091392
key = irq_lock();
14101393

14111394
/* Check if tx_error_handler() function was executed */

drivers/ethernet/eth_stellaris.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,6 @@ static int eth_stellaris_send(struct device *dev, struct net_pkt *pkt)
7373
eth_stellaris_send_byte(dev, data_len & 0xff);
7474
eth_stellaris_send_byte(dev, (data_len & 0xff00) >> 8);
7575

76-
/* Send the header, header is 14 bytes */
77-
head_len_left = net_pkt_ll_reserve(pkt);
78-
eth_hdr = net_pkt_ll(pkt);
79-
for (i = 0; i < head_len_left; ++i) {
80-
eth_stellaris_send_byte(dev, eth_hdr[i]);
81-
}
82-
8376
/* Send the payload */
8477
for (frag = pkt->frags; frag; frag = frag->frags) {
8578
for (i = 0; i < frag->len; ++i) {

drivers/ethernet/eth_stm32_hal.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ static int eth_tx(struct device *dev, struct net_pkt *pkt)
7474

7575
k_mutex_lock(&dev_data->tx_mutex, K_FOREVER);
7676

77-
total_len = net_pkt_ll_reserve(pkt) + net_pkt_get_len(pkt);
77+
total_len = net_pkt_get_len(pkt);
7878
if (total_len > ETH_TX_BUF_SIZE) {
7979
LOG_ERR("PKT to big");
8080
res = -EIO;
@@ -88,11 +88,7 @@ static int eth_tx(struct device *dev, struct net_pkt *pkt)
8888

8989
dma_buffer = (u8_t *)(dma_tx_desc->Buffer1Addr);
9090

91-
memcpy(dma_buffer, net_pkt_ll(pkt),
92-
net_pkt_ll_reserve(pkt) + pkt->frags->len);
93-
dma_buffer += net_pkt_ll_reserve(pkt) + pkt->frags->len;
94-
95-
frag = pkt->frags->frags;
91+
frag = pkt->frags;
9692
while (frag) {
9793
memcpy(dma_buffer, frag->data, frag->len);
9894
dma_buffer += frag->len;

drivers/net/slip.c

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,6 @@ static void slip_writeb_esc(unsigned char c)
138138
static int slip_send(struct device *dev, struct net_pkt *pkt)
139139
{
140140
struct net_buf *frag;
141-
#if defined(CONFIG_SLIP_TAP)
142-
u16_t ll_reserve = net_pkt_ll_reserve(pkt);
143-
bool send_header_once = false;
144-
#endif
145141
u8_t *ptr;
146142
u16_t i;
147143
u8_t c;
@@ -156,52 +152,18 @@ static int slip_send(struct device *dev, struct net_pkt *pkt)
156152
slip_writeb(SLIP_END);
157153

158154
for (frag = pkt->frags; frag; frag = frag->frags) {
159-
#if defined(CONFIG_SLIP_TAP)
160-
ptr = frag->data - ll_reserve;
161-
162-
/* This writes ethernet header */
163-
if (!send_header_once && ll_reserve) {
164-
for (i = 0U; i < ll_reserve; i++) {
165-
slip_writeb_esc(*ptr++);
166-
}
167-
}
168-
169-
if (net_if_get_mtu(net_pkt_iface(pkt)) >
170-
net_buf_headroom(frag)) {
171-
/* Do not add link layer header if the mtu is bigger
172-
* than fragment size. The first packet needs the
173-
* link layer header always.
174-
*/
175-
send_header_once = true;
176-
ll_reserve = 0U;
177-
ptr = frag->data;
178-
}
179-
#else
180-
/* There is no ll header in tun device */
181155
ptr = frag->data;
182-
#endif
183-
184156
for (i = 0U; i < frag->len; ++i) {
185157
c = *ptr++;
186158
slip_writeb_esc(c);
187159
}
188160

189161
if (LOG_LEVEL >= LOG_LEVEL_DBG) {
190-
int frag_count = 0;
191-
192-
LOG_DBG("sent data %d bytes",
193-
frag->len + net_pkt_ll_reserve(pkt));
194-
195-
if (frag->len + net_pkt_ll_reserve(pkt)) {
196-
char msg[8 + 1];
197-
198-
snprintf(msg, sizeof(msg), "<slip %2d",
199-
frag_count++);
162+
LOG_DBG("sent data %d bytes", frag->len);
200163

164+
if (frag->len) {
201165
LOG_HEXDUMP_DBG(net_pkt_ll(pkt),
202-
frag->len +
203-
net_pkt_ll_reserve(pkt),
204-
msg);
166+
frag->len, "<slip ");
205167
}
206168
}
207169
}

subsys/net/l2/ethernet/arp.c

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -234,17 +234,10 @@ static inline struct net_pkt *arp_prepare(struct net_if *iface,
234234
struct net_pkt *pending,
235235
struct in_addr *current_ip)
236236
{
237-
struct ethernet_context *ctx = net_if_l2_data(iface);
238-
int eth_hdr_len = sizeof(struct net_eth_hdr);
239237
struct net_pkt *pkt;
240238
struct net_arp_hdr *hdr;
241239
struct in_addr *my_addr;
242240

243-
if (net_eth_is_vlan_enabled(ctx, iface) &&
244-
net_eth_get_vlan_tag(iface) != NET_VLAN_TAG_UNSPEC) {
245-
eth_hdr_len = sizeof(struct net_eth_vlan_hdr);
246-
}
247-
248241
if (current_ip) {
249242
/* This is the IPv4 autoconf case where we have already
250243
* things setup so no need to allocate new net_pkt
@@ -253,7 +246,7 @@ static inline struct net_pkt *arp_prepare(struct net_if *iface,
253246
} else {
254247
struct net_buf *frag;
255248

256-
pkt = net_pkt_get_reserve_tx(eth_hdr_len, NET_BUF_TIMEOUT);
249+
pkt = net_pkt_get_reserve_tx(0, NET_BUF_TIMEOUT);
257250
if (!pkt) {
258251
return NULL;
259252
}
@@ -332,16 +325,13 @@ struct net_pkt *net_arp_prepare(struct net_pkt *pkt,
332325
struct in_addr *request_ip,
333326
struct in_addr *current_ip)
334327
{
335-
struct ethernet_context *ctx;
336328
struct arp_entry *entry;
337329
struct in_addr *addr;
338330

339331
if (!pkt || !pkt->frags) {
340332
return NULL;
341333
}
342334

343-
ctx = net_if_l2_data(net_pkt_iface(pkt));
344-
345335
/* Is the destination in the local network, if not route via
346336
* the gateway address.
347337
*/
@@ -476,19 +466,12 @@ static void arp_update(struct net_if *iface,
476466
static inline struct net_pkt *arp_prepare_reply(struct net_if *iface,
477467
struct net_pkt *req)
478468
{
479-
struct ethernet_context *ctx = net_if_l2_data(iface);
480-
int eth_hdr_len = sizeof(struct net_eth_hdr);
481469
struct net_pkt *pkt;
482470
struct net_buf *frag;
483471
struct net_arp_hdr *hdr, *query;
484472
struct net_eth_hdr *eth_query;
485473

486-
if (net_eth_is_vlan_enabled(ctx, iface) &&
487-
net_eth_get_vlan_tag(iface) != NET_VLAN_TAG_UNSPEC) {
488-
eth_hdr_len = sizeof(struct net_eth_vlan_hdr);
489-
}
490-
491-
pkt = net_pkt_get_reserve_tx(eth_hdr_len, NET_BUF_TIMEOUT);
474+
pkt = net_pkt_get_reserve_tx(0, NET_BUF_TIMEOUT);
492475
if (!pkt) {
493476
goto fail;
494477
}
@@ -561,11 +544,13 @@ enum net_verdict net_arp_input(struct net_pkt *pkt)
561544
struct in_addr *addr;
562545

563546
if (net_pkt_get_len(pkt) < (sizeof(struct net_arp_hdr) -
564-
net_pkt_ll_reserve(pkt))) {
547+
(net_pkt_ip_data(pkt) -
548+
net_pkt_ll(pkt)))) {
565549
NET_DBG("Invalid ARP header (len %zu, min %zu bytes)",
566550
net_pkt_get_len(pkt),
567551
sizeof(struct net_arp_hdr) -
568-
net_pkt_ll_reserve(pkt));
552+
(net_pkt_ip_data(pkt) -
553+
net_pkt_ll(pkt)));
569554
return NET_DROP;
570555
}
571556

0 commit comments

Comments
 (0)