Lines Matching +full:meta +full:- +full:family
1 // SPDX-License-Identifier: GPL-2.0
35 #define FAMILY AF_INET macro
80 xsk->umem_area = mmap(NULL, UMEM_SIZE, PROT_READ | PROT_WRITE, mmap_flags, -1, 0); in open_xsk()
81 if (!ASSERT_NEQ(xsk->umem_area, MAP_FAILED, "mmap")) in open_xsk()
82 return -1; in open_xsk()
84 ret = xsk_umem__create(&xsk->umem, in open_xsk()
85 xsk->umem_area, UMEM_SIZE, in open_xsk()
86 &xsk->fill, in open_xsk()
87 &xsk->comp, in open_xsk()
92 ret = xsk_socket__create(&xsk->socket, ifindex, QUEUE_ID, in open_xsk()
93 xsk->umem, in open_xsk()
94 &xsk->rx, in open_xsk()
95 &xsk->tx, in open_xsk()
100 /* First half of umem is for TX. This way address matches 1-to-1 in open_xsk()
106 printf("%p: tx_desc[%d] -> %lx\n", xsk, i, addr); in open_xsk()
111 ret = xsk_ring_prod__reserve(&xsk->fill, UMEM_NUM / 2, &idx); in open_xsk()
115 return -1; in open_xsk()
119 printf("%p: rx_desc[%d] -> %lx\n", xsk, i, addr); in open_xsk()
120 *xsk_ring_prod__fill_addr(&xsk->fill, i) = addr; in open_xsk()
122 xsk_ring_prod__submit(&xsk->fill, ret); in open_xsk()
129 if (xsk->umem) in close_xsk()
130 xsk_umem__delete(xsk->umem); in close_xsk()
131 if (xsk->socket) in close_xsk()
132 xsk_socket__delete(xsk->socket); in close_xsk()
133 munmap(xsk->umem_area, UMEM_SIZE); in close_xsk()
138 struct xsk_tx_metadata *meta; in generate_packet() local
147 ret = xsk_ring_prod__reserve(&xsk->tx, 1, &idx); in generate_packet()
149 return -1; in generate_packet()
151 tx_desc = xsk_ring_prod__tx_desc(&xsk->tx, idx); in generate_packet()
152 tx_desc->addr = idx % (UMEM_NUM / 2) * UMEM_FRAME_SIZE + sizeof(struct xsk_tx_metadata); in generate_packet()
153 printf("%p: tx_desc[%u]->addr=%llx\n", xsk, idx, tx_desc->addr); in generate_packet()
154 data = xsk_umem__get_data(xsk->umem_area, tx_desc->addr); in generate_packet()
156 meta = data - sizeof(struct xsk_tx_metadata); in generate_packet()
157 memset(meta, 0, sizeof(*meta)); in generate_packet()
158 meta->flags = XDP_TXMD_FLAGS_TIMESTAMP; in generate_packet()
164 memcpy(eth->h_dest, "\x00\x00\x00\x00\x00\x02", ETH_ALEN); in generate_packet()
165 memcpy(eth->h_source, "\x00\x00\x00\x00\x00\x01", ETH_ALEN); in generate_packet()
166 eth->h_proto = htons(ETH_P_IP); in generate_packet()
168 iph->version = 0x4; in generate_packet()
169 iph->ihl = 0x5; in generate_packet()
170 iph->tos = 0x9; in generate_packet()
171 iph->tot_len = htons(sizeof(*iph) + sizeof(*udph) + UDP_PAYLOAD_BYTES); in generate_packet()
172 iph->id = 0; in generate_packet()
173 iph->frag_off = 0; in generate_packet()
174 iph->ttl = 0; in generate_packet()
175 iph->protocol = IPPROTO_UDP; in generate_packet()
176 ASSERT_EQ(inet_pton(FAMILY, TX_ADDR, &iph->saddr), 1, "inet_pton(TX_ADDR)"); in generate_packet()
177 ASSERT_EQ(inet_pton(FAMILY, RX_ADDR, &iph->daddr), 1, "inet_pton(RX_ADDR)"); in generate_packet()
178 iph->check = build_ip_csum(iph); in generate_packet()
180 udph->source = htons(UDP_SOURCE_PORT); in generate_packet()
181 udph->dest = htons(dst_port); in generate_packet()
182 udph->len = htons(sizeof(*udph) + UDP_PAYLOAD_BYTES); in generate_packet()
183 udph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, in generate_packet()
184 ntohs(udph->len), IPPROTO_UDP, 0); in generate_packet()
188 meta->flags |= XDP_TXMD_FLAGS_CHECKSUM; in generate_packet()
189 meta->request.csum_start = sizeof(*eth) + sizeof(*iph); in generate_packet()
190 meta->request.csum_offset = offsetof(struct udphdr, check); in generate_packet()
192 tx_desc->len = sizeof(*eth) + sizeof(*iph) + sizeof(*udph) + UDP_PAYLOAD_BYTES; in generate_packet()
193 tx_desc->options |= XDP_TX_METADATA; in generate_packet()
194 xsk_ring_prod__submit(&xsk->tx, 1); in generate_packet()
196 ret = sendto(xsk_socket__fd(xsk->socket), NULL, 0, MSG_DONTWAIT, NULL, 0); in generate_packet()
229 struct xsk_tx_metadata *meta; in complete_tx() local
234 if (ASSERT_EQ(xsk_ring_cons__peek(&xsk->comp, 1, &idx), 1, "xsk_ring_cons__peek")) { in complete_tx()
235 addr = *xsk_ring_cons__comp_addr(&xsk->comp, idx); in complete_tx()
239 data = xsk_umem__get_data(xsk->umem_area, addr); in complete_tx()
240 meta = data - sizeof(struct xsk_tx_metadata); in complete_tx()
242 ASSERT_NEQ(meta->completion.tx_timestamp, 0, "tx_timestamp"); in complete_tx()
244 xsk_ring_cons__release(&xsk->comp, 1); in complete_tx()
252 if (ASSERT_EQ(xsk_ring_prod__reserve(&xsk->fill, 1, &idx), 1, "xsk_ring_prod__reserve")) { in refill_rx()
254 *xsk_ring_prod__fill_addr(&xsk->fill, idx) = addr; in refill_rx()
255 xsk_ring_prod__submit(&xsk->fill, 1); in refill_rx()
263 struct xdp_meta *meta; in verify_xsk_metadata() local
273 ret = recvfrom(xsk_socket__fd(xsk->socket), NULL, 0, MSG_DONTWAIT, NULL, NULL); in verify_xsk_metadata()
275 return -1; in verify_xsk_metadata()
277 fds.fd = xsk_socket__fd(xsk->socket); in verify_xsk_metadata()
282 return -1; in verify_xsk_metadata()
284 ret = xsk_ring_cons__peek(&xsk->rx, 1, &idx); in verify_xsk_metadata()
286 return -2; in verify_xsk_metadata()
288 rx_desc = xsk_ring_cons__rx_desc(&xsk->rx, idx); in verify_xsk_metadata()
289 comp_addr = xsk_umem__extract_addr(rx_desc->addr); in verify_xsk_metadata()
290 addr = xsk_umem__add_offset_to_addr(rx_desc->addr); in verify_xsk_metadata()
291 printf("%p: rx_desc[%u]->addr=%llx addr=%llx comp_addr=%llx\n", in verify_xsk_metadata()
292 xsk, idx, rx_desc->addr, addr, comp_addr); in verify_xsk_metadata()
293 data = xsk_umem__get_data(xsk->umem_area, addr); in verify_xsk_metadata()
298 ASSERT_EQ(eth->h_proto, htons(ETH_P_IP), "eth->h_proto"); in verify_xsk_metadata()
300 ASSERT_EQ((int)iph->version, 4, "iph->version"); in verify_xsk_metadata()
305 meta = data - sizeof(struct xdp_meta); in verify_xsk_metadata()
307 if (!ASSERT_NEQ(meta->rx_timestamp, 0, "rx_timestamp")) in verify_xsk_metadata()
308 return -1; in verify_xsk_metadata()
310 if (!ASSERT_NEQ(meta->rx_hash, 0, "rx_hash")) in verify_xsk_metadata()
311 return -1; in verify_xsk_metadata()
314 if (!ASSERT_NEQ(meta->rx_hash_type & XDP_RSS_TYPE_L4, 0, "rx_hash_type")) in verify_xsk_metadata()
315 return -1; in verify_xsk_metadata()
317 if (!ASSERT_EQ(meta->rx_vlan_tci & VLAN_VID_MASK, VLAN_ID, "rx_vlan_tci")) in verify_xsk_metadata()
318 return -1; in verify_xsk_metadata()
320 if (!ASSERT_EQ(meta->rx_vlan_proto, VLAN_PID, "rx_vlan_proto")) in verify_xsk_metadata()
321 return -1; in verify_xsk_metadata()
325 ASSERT_EQ(meta->rx_hash_type, 0, "rx_hash_type"); in verify_xsk_metadata()
328 ASSERT_EQ(udph->check, htons(0x721c), "csum"); in verify_xsk_metadata()
331 xsk_ring_cons__release(&xsk->rx, 1); in verify_xsk_metadata()
386 SYS(out, "ip -4 neigh add " RX_ADDR " lladdr " RX_MAC " dev " TX_NAME_VLAN); in test_xdp_metadata()
408 prog = bpf_object__find_program_by_name(bpf_obj->obj, "rx"); in test_xdp_metadata()
415 /* Make sure we can't add dev-bound programs to prog maps. */ in test_xdp_metadata()
416 prog_arr = bpf_object__find_map_by_name(bpf_obj->obj, "prog_arr"); in test_xdp_metadata()
429 bpf_program__fd(bpf_obj->progs.rx), in test_xdp_metadata()
435 ret = bpf_map_update_elem(bpf_map__fd(bpf_obj->maps.xsk), &queue_id, &sock_fd, 0); in test_xdp_metadata()
487 new_prog = bpf_object__find_program_by_name(bpf_obj2->obj, "freplace_rx"); in test_xdp_metadata()
509 while (!retries--) { in test_xdp_metadata()
510 if (bpf_obj2->bss->called) in test_xdp_metadata()
514 ASSERT_GT(bpf_obj2->bss->called, 0, "not called"); in test_xdp_metadata()