Skip to content

Commit 0c571d1

Browse files
committed
net 3.0: clean up routing logic
- Build entire packet in during_frag callback (fixes the need to save and restore state when transitioning from during_frag to after_frag) - Publish non-routable packets to 'fallback' link instead of dropping them
1 parent e39e7b7 commit 0c571d1

File tree

7 files changed

+309
-393
lines changed

7 files changed

+309
-393
lines changed

book/api/metrics-generated.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@
4949

5050
| Metric | Type | Description |
5151
|--------|------|-------------|
52-
| <span class="metrics-name">net_&#8203;rx_&#8203;pkt_&#8203;cnt</span><br/>{pkt_&#8203;kind="<span class="metrics-enum">ip4_&#8203;udp</span>"} | counter | Packet receive count. (IPv4 UDP packet (no options)) |
53-
| <span class="metrics-name">net_&#8203;rx_&#8203;pkt_&#8203;cnt</span><br/>{pkt_&#8203;kind="<span class="metrics-enum">ip4_&#8203;opt_&#8203;udp</span>"} | counter | Packet receive count. (IPv4 UDP packet (with options)) |
52+
| <span class="metrics-name">net_&#8203;rx_&#8203;pkt_&#8203;cnt</span><br/>{pkt_&#8203;kind="<span class="metrics-enum">ip4_&#8203;udp</span>"} | counter | Packet receive count (ignoring tunnels) (IPv4 UDP packet (no options)) |
53+
| <span class="metrics-name">net_&#8203;rx_&#8203;pkt_&#8203;cnt</span><br/>{pkt_&#8203;kind="<span class="metrics-enum">ip4_&#8203;opt_&#8203;udp</span>"} | counter | Packet receive count (ignoring tunnels) (IPv4 UDP packet (with options)) |
5454
| <span class="metrics-name">net_&#8203;rx_&#8203;bytes_&#8203;total</span> | counter | Total number of bytes received (including Ethernet header). |
5555
| <span class="metrics-name">net_&#8203;rx_&#8203;undersz_&#8203;cnt</span> | counter | Number of incoming packets dropped due to being too small. |
5656
| <span class="metrics-name">net_&#8203;rx_&#8203;fill_&#8203;blocked_&#8203;cnt</span> | counter | Number of incoming packets dropped due to fill ring being full. |
@@ -60,8 +60,8 @@
6060
| <span class="metrics-name">net_&#8203;tx_&#8203;submit_&#8203;cnt</span> | counter | Number of packet transmit jobs submitted. |
6161
| <span class="metrics-name">net_&#8203;tx_&#8203;complete_&#8203;cnt</span> | counter | Number of packet transmit jobs marked as completed by the kernel. |
6262
| <span class="metrics-name">net_&#8203;tx_&#8203;bytes_&#8203;total</span> | counter | Total number of bytes transmitted (including Ethernet header). |
63-
| <span class="metrics-name">net_&#8203;tx_&#8203;route_&#8203;fail_&#8203;cnt</span> | counter | Number of packet transmit jobs dropped due to route failure. |
64-
| <span class="metrics-name">net_&#8203;tx_&#8203;neighbor_&#8203;fail_&#8203;cnt</span> | counter | Number of packet transmit jobs dropped due to unresolved neighbor. |
63+
| <span class="metrics-name">net_&#8203;tx_&#8203;corrupt_&#8203;cnt</span> | counter | Number of packet transmit jobs dropped due to malformed content. |
64+
| <span class="metrics-name">net_&#8203;tx_&#8203;fallback_&#8203;cnt</span> | counter | Number of packet transmit jobs handled via sockets fallback instead of XDP. |
6565
| <span class="metrics-name">net_&#8203;tx_&#8203;full_&#8203;fail_&#8203;cnt</span> | counter | Number of packet transmit jobs dropped due to XDP TX ring full or missing completions. |
6666
| <span class="metrics-name">net_&#8203;tx_&#8203;busy_&#8203;cnt</span> | gauge | Number of transmit buffers currently busy. |
6767
| <span class="metrics-name">net_&#8203;tx_&#8203;idle_&#8203;cnt</span> | gauge | Number of transmit buffers currently idle. |
@@ -77,7 +77,6 @@
7777
| <span class="metrics-name">net_&#8203;rx_&#8203;gre_&#8203;invalid_&#8203;cnt</span> | counter | Number of invalid GRE packets received |
7878
| <span class="metrics-name">net_&#8203;rx_&#8203;gre_&#8203;ignored_&#8203;cnt</span> | counter | Number of received but ignored GRE packets |
7979
| <span class="metrics-name">net_&#8203;tx_&#8203;gre_&#8203;cnt</span> | counter | Number of GRE packet transmit jobs submitted |
80-
| <span class="metrics-name">net_&#8203;tx_&#8203;gre_&#8203;route_&#8203;fail_&#8203;cnt</span> | counter | Number of GRE packets transmit jobs dropped due to route failure |
8180

8281
</div>
8382

src/disco/metrics/generated/fd_metrics_net.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ const fd_metrics_meta_t FD_METRICS_NET[FD_METRICS_NET_TOTAL] = {
1313
DECLARE_METRIC( NET_TX_SUBMIT_CNT, COUNTER ),
1414
DECLARE_METRIC( NET_TX_COMPLETE_CNT, COUNTER ),
1515
DECLARE_METRIC( NET_TX_BYTES_TOTAL, COUNTER ),
16-
DECLARE_METRIC( NET_TX_ROUTE_FAIL_CNT, COUNTER ),
17-
DECLARE_METRIC( NET_TX_NEIGHBOR_FAIL_CNT, COUNTER ),
16+
DECLARE_METRIC( NET_TX_CORRUPT_CNT, COUNTER ),
17+
DECLARE_METRIC( NET_TX_FALLBACK_CNT, COUNTER ),
1818
DECLARE_METRIC( NET_TX_FULL_FAIL_CNT, COUNTER ),
1919
DECLARE_METRIC( NET_TX_BUSY_CNT, GAUGE ),
2020
DECLARE_METRIC( NET_TX_IDLE_CNT, GAUGE ),
@@ -30,5 +30,4 @@ const fd_metrics_meta_t FD_METRICS_NET[FD_METRICS_NET_TOTAL] = {
3030
DECLARE_METRIC( NET_RX_GRE_INVALID_CNT, COUNTER ),
3131
DECLARE_METRIC( NET_RX_GRE_IGNORED_CNT, COUNTER ),
3232
DECLARE_METRIC( NET_TX_GRE_CNT, COUNTER ),
33-
DECLARE_METRIC( NET_TX_GRE_ROUTE_FAIL_CNT, COUNTER ),
3433
};

src/disco/metrics/generated/fd_metrics_net.h

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#define FD_METRICS_COUNTER_NET_RX_PKT_CNT_OFF (16UL)
77
#define FD_METRICS_COUNTER_NET_RX_PKT_CNT_NAME "net_rx_pkt_cnt"
88
#define FD_METRICS_COUNTER_NET_RX_PKT_CNT_TYPE (FD_METRICS_TYPE_COUNTER)
9-
#define FD_METRICS_COUNTER_NET_RX_PKT_CNT_DESC "Packet receive count."
9+
#define FD_METRICS_COUNTER_NET_RX_PKT_CNT_DESC "Packet receive count (ignoring tunnels)"
1010
#define FD_METRICS_COUNTER_NET_RX_PKT_CNT_CVT (FD_METRICS_CONVERTER_NONE)
1111
#define FD_METRICS_COUNTER_NET_RX_PKT_CNT_CNT (2UL)
1212

@@ -67,17 +67,17 @@
6767
#define FD_METRICS_COUNTER_NET_TX_BYTES_TOTAL_DESC "Total number of bytes transmitted (including Ethernet header)."
6868
#define FD_METRICS_COUNTER_NET_TX_BYTES_TOTAL_CVT (FD_METRICS_CONVERTER_NONE)
6969

70-
#define FD_METRICS_COUNTER_NET_TX_ROUTE_FAIL_CNT_OFF (27UL)
71-
#define FD_METRICS_COUNTER_NET_TX_ROUTE_FAIL_CNT_NAME "net_tx_route_fail_cnt"
72-
#define FD_METRICS_COUNTER_NET_TX_ROUTE_FAIL_CNT_TYPE (FD_METRICS_TYPE_COUNTER)
73-
#define FD_METRICS_COUNTER_NET_TX_ROUTE_FAIL_CNT_DESC "Number of packet transmit jobs dropped due to route failure."
74-
#define FD_METRICS_COUNTER_NET_TX_ROUTE_FAIL_CNT_CVT (FD_METRICS_CONVERTER_NONE)
70+
#define FD_METRICS_COUNTER_NET_TX_CORRUPT_CNT_OFF (27UL)
71+
#define FD_METRICS_COUNTER_NET_TX_CORRUPT_CNT_NAME "net_tx_corrupt_cnt"
72+
#define FD_METRICS_COUNTER_NET_TX_CORRUPT_CNT_TYPE (FD_METRICS_TYPE_COUNTER)
73+
#define FD_METRICS_COUNTER_NET_TX_CORRUPT_CNT_DESC "Number of packet transmit jobs dropped due to malformed content."
74+
#define FD_METRICS_COUNTER_NET_TX_CORRUPT_CNT_CVT (FD_METRICS_CONVERTER_NONE)
7575

76-
#define FD_METRICS_COUNTER_NET_TX_NEIGHBOR_FAIL_CNT_OFF (28UL)
77-
#define FD_METRICS_COUNTER_NET_TX_NEIGHBOR_FAIL_CNT_NAME "net_tx_neighbor_fail_cnt"
78-
#define FD_METRICS_COUNTER_NET_TX_NEIGHBOR_FAIL_CNT_TYPE (FD_METRICS_TYPE_COUNTER)
79-
#define FD_METRICS_COUNTER_NET_TX_NEIGHBOR_FAIL_CNT_DESC "Number of packet transmit jobs dropped due to unresolved neighbor."
80-
#define FD_METRICS_COUNTER_NET_TX_NEIGHBOR_FAIL_CNT_CVT (FD_METRICS_CONVERTER_NONE)
76+
#define FD_METRICS_COUNTER_NET_TX_FALLBACK_CNT_OFF (28UL)
77+
#define FD_METRICS_COUNTER_NET_TX_FALLBACK_CNT_NAME "net_tx_fallback_cnt"
78+
#define FD_METRICS_COUNTER_NET_TX_FALLBACK_CNT_TYPE (FD_METRICS_TYPE_COUNTER)
79+
#define FD_METRICS_COUNTER_NET_TX_FALLBACK_CNT_DESC "Number of packet transmit jobs handled via sockets fallback instead of XDP."
80+
#define FD_METRICS_COUNTER_NET_TX_FALLBACK_CNT_CVT (FD_METRICS_CONVERTER_NONE)
8181

8282
#define FD_METRICS_COUNTER_NET_TX_FULL_FAIL_CNT_OFF (29UL)
8383
#define FD_METRICS_COUNTER_NET_TX_FULL_FAIL_CNT_NAME "net_tx_full_fail_cnt"
@@ -169,11 +169,5 @@
169169
#define FD_METRICS_COUNTER_NET_TX_GRE_CNT_DESC "Number of GRE packet transmit jobs submitted"
170170
#define FD_METRICS_COUNTER_NET_TX_GRE_CNT_CVT (FD_METRICS_CONVERTER_NONE)
171171

172-
#define FD_METRICS_COUNTER_NET_TX_GRE_ROUTE_FAIL_CNT_OFF (44UL)
173-
#define FD_METRICS_COUNTER_NET_TX_GRE_ROUTE_FAIL_CNT_NAME "net_tx_gre_route_fail_cnt"
174-
#define FD_METRICS_COUNTER_NET_TX_GRE_ROUTE_FAIL_CNT_TYPE (FD_METRICS_TYPE_COUNTER)
175-
#define FD_METRICS_COUNTER_NET_TX_GRE_ROUTE_FAIL_CNT_DESC "Number of GRE packets transmit jobs dropped due to route failure"
176-
#define FD_METRICS_COUNTER_NET_TX_GRE_ROUTE_FAIL_CNT_CVT (FD_METRICS_CONVERTER_NONE)
177-
178-
#define FD_METRICS_NET_TOTAL (29UL)
172+
#define FD_METRICS_NET_TOTAL (28UL)
179173
extern const fd_metrics_meta_t FD_METRICS_NET[FD_METRICS_NET_TOTAL];

src/disco/metrics/metrics.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ metric introduced.
6868
<counter name="TxSubmitCnt" summary="Number of packet transmit jobs submitted." />
6969
<counter name="TxCompleteCnt" summary="Number of packet transmit jobs marked as completed by the kernel." />
7070
<counter name="TxBytesTotal" summary="Total number of bytes transmitted (including Ethernet header)." />
71-
<counter name="TxRouteFailCnt" summary="Number of packet transmit jobs dropped due to route failure." />
72-
<counter name="TxNeighborFailCnt" summary="Number of packet transmit jobs dropped due to unresolved neighbor." />
71+
<counter name="TxCorruptCnt" summary="Number of packet transmit jobs dropped due to malformed content." />
72+
<counter name="TxFallbackCnt" summary="Number of packet transmit jobs handled via sockets fallback instead of XDP." />
7373
<counter name="TxFullFailCnt" summary="Number of packet transmit jobs dropped due to XDP TX ring full or missing completions." />
7474
<gauge name="TxBusyCnt" summary="Number of transmit buffers currently busy." />
7575
<gauge name="TxIdleCnt" summary="Number of transmit buffers currently idle." />
@@ -90,7 +90,6 @@ metric introduced.
9090
<counter name="RxGreInvalidCnt" summary="Number of invalid GRE packets received" />
9191
<counter name="RxGreIgnoredCnt" summary="Number of received but ignored GRE packets" />
9292
<counter name="TxGreCnt" summary="Number of GRE packet transmit jobs submitted" />
93-
<counter name="TxGreRouteFailCnt" summary="Number of GRE packets transmit jobs dropped due to route failure" />
9493
</tile>
9594

9695
<enum name="SockErr">

src/disco/net/fd_net_router.h

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#ifndef HEADER_fd_src_disco_net_fd_net_router_h
2+
#define HEADER_fd_src_disco_net_fd_net_router_h
3+
4+
/* fd_net_router.h provides an internal API for userland routing. */
5+
6+
#include "../../waltz/mib/fd_netdev_tbl.h"
7+
#include "../../waltz/ip/fd_fib4.h"
8+
#include "../../waltz/neigh/fd_neigh4_map.h"
9+
10+
#include <linux/if_arp.h>
11+
12+
struct fd_net_router {
13+
/* Route and neighbor tables */
14+
fd_fib4_t const * fib_local;
15+
fd_fib4_t const * fib_main;
16+
fd_neigh4_hmap_t neigh4[1];
17+
fd_netdev_tbl_join_t netdev_tbl;
18+
19+
uint if_idx;
20+
uint bind_address;
21+
uint default_address;
22+
};
23+
24+
typedef struct fd_net_router fd_net_router_t;
25+
26+
struct fd_net_next_hop {
27+
uchar mac_addrs[12]; /* First 12 bytes of Ethernet header */
28+
uint src_ip;
29+
30+
uint gre_src_ip;
31+
uint gre_dst_ip;
32+
};
33+
34+
typedef struct fd_net_next_hop fd_next_hop_t;
35+
36+
/* FD_NET_HOP_* give the result types of a route lookup. */
37+
38+
#define FD_NET_HOP_RAW 0
39+
#define FD_NET_HOP_GRE 1
40+
#define FD_NET_HOP_FALLBACK 2
41+
42+
/* fd_net_tx_route routes an outgoing packet based on its destination IP
43+
address. Returns an action FD_NET_HOP_*.
44+
45+
Saves out routing instructions to net_ctx->tx_op, including:
46+
- XSK index
47+
- source IP address
48+
- source and dest MAC addresses
49+
- GRE tunnelling info */
50+
51+
static FD_FN_UNUSED uint
52+
fd_net_tx_route( fd_net_router_t const * router,
53+
fd_next_hop_t * out,
54+
uint dst_ip ) {
55+
/* Route lookup */
56+
57+
fd_fib4_hop_t hop[2] = {0};
58+
fd_fib4_lookup( router->fib_local, hop+0, dst_ip, 0UL );
59+
fd_fib4_lookup( router->fib_main, hop+1, dst_ip, 0UL );
60+
fd_fib4_hop_t const * next_hop = fd_fib4_hop_or( hop+0, hop+1 );
61+
62+
uint rtype = next_hop->rtype;
63+
uint if_idx = next_hop->if_idx;
64+
uint ip4_src = next_hop->ip4_src;
65+
66+
if( FD_UNLIKELY( rtype!=FD_FIB4_RTYPE_UNICAST ) ) return FD_NET_HOP_FALLBACK;
67+
if( FD_UNLIKELY( if_idx>router->netdev_tbl.hdr->dev_cnt ) ) return FD_NET_HOP_FALLBACK;
68+
fd_netdev_t const * netdev = &router->netdev_tbl.dev_tbl[ if_idx ];
69+
70+
ip4_src = fd_uint_if( !!router->bind_address, router->bind_address, ip4_src );
71+
out->src_ip = ip4_src;
72+
73+
if( netdev->dev_type==ARPHRD_IPGRE ) {
74+
/* Packet targets a GRE tunnel */
75+
if( netdev->gre_src_ip ) out->gre_src_ip = netdev->gre_src_ip;
76+
out->gre_dst_ip = netdev->gre_dst_ip;
77+
return FD_NET_HOP_GRE;
78+
}
79+
80+
if( FD_UNLIKELY( if_idx!=router->if_idx ) ) return FD_NET_HOP_FALLBACK;
81+
82+
/* Neighbor resolve */
83+
uint neigh_ip = next_hop->ip4_gw;
84+
if( !neigh_ip ) neigh_ip = dst_ip;
85+
86+
fd_neigh4_hmap_query_t neigh_query[1];
87+
int neigh_res = fd_neigh4_hmap_query_try( router->neigh4, &neigh_ip, NULL, neigh_query, 0 );
88+
if( FD_UNLIKELY( neigh_res!=FD_MAP_SUCCESS ) ) return FD_NET_HOP_FALLBACK;
89+
fd_neigh4_entry_t const * neigh = fd_neigh4_hmap_query_ele_const( neigh_query );
90+
if( FD_UNLIKELY( neigh->state != FD_NEIGH4_STATE_ACTIVE ) ) return FD_NET_HOP_FALLBACK;
91+
ip4_src = fd_uint_if( !ip4_src, router->default_address, ip4_src );
92+
out->src_ip = ip4_src;
93+
memcpy( out->mac_addrs+0, neigh->mac_addr, 6 );
94+
memcpy( out->mac_addrs+6, netdev->mac_addr, 6 );
95+
96+
if( FD_UNLIKELY( fd_neigh4_hmap_query_test( neigh_query ) ) ) return FD_NET_HOP_FALLBACK;
97+
98+
return FD_NET_HOP_RAW;
99+
}
100+
101+
#endif /* HEADER_fd_src_disco_net_xdp_fd_xdp_route_h */

0 commit comments

Comments
 (0)