Lines Matching refs:encap

85 			  struct efx_tc_encap_action *encap, struct net *net,
97 switch ((int)encap->type) {
101 flow4.fl4_dport = encap->key.tp_dst;
102 flow4.flowi4_tos = encap->key.tos;
103 flow4.daddr = encap->key.u.ipv4.dst;
104 flow4.saddr = encap->key.u.ipv4.src;
109 flow6.fl6_dport = encap->key.tp_dst;
110 flow6.flowlabel = ip6_make_flowinfo(encap->key.tos,
111 encap->key.label);
112 flow6.daddr = encap->key.u.ipv6.dst;
113 flow6.saddr = encap->key.u.ipv6.src;
116 NL_SET_ERR_MSG_FMT_MOD(extack, "Unsupported encap type %d",
117 (int)encap->type);
146 if (encap->type & EFX_ENCAP_FLAG_IPV6) {
154 NL_SET_ERR_MSG_MOD(extack, "Failed to lookup route for IPv6 encap");
177 NL_SET_ERR_MSG_MOD(extack, "Failed to lookup route for encap");
189 NL_SET_ERR_MSG_MOD(extack, "Failed to lookup neighbour for encap");
209 encap->neigh = neigh;
210 list_add_tail(&encap->list, &neigh->users);
236 struct efx_tc_encap_action *encap)
238 struct efx_neigh_binder *neigh = encap->neigh;
242 list_del(&encap->list);
243 encap->neigh = NULL;
249 static void efx_gen_tun_header_eth(struct efx_tc_encap_action *encap, u16 proto)
251 struct efx_neigh_binder *neigh = encap->neigh;
254 encap->encap_hdr_len = sizeof(*eth);
255 eth = (struct ethhdr *)encap->encap_hdr;
257 if (encap->neigh->n_valid)
265 static void efx_gen_tun_header_ipv4(struct efx_tc_encap_action *encap, u8 ipproto, u8 len)
267 struct efx_neigh_binder *neigh = encap->neigh;
268 struct ip_tunnel_key *key = &encap->key;
271 ip = (struct iphdr *)(encap->encap_hdr + encap->encap_hdr_len);
272 encap->encap_hdr_len += sizeof(*ip);
285 static void efx_gen_tun_header_ipv6(struct efx_tc_encap_action *encap, u8 ipproto, u8 len)
287 struct efx_neigh_binder *neigh = encap->neigh;
288 struct ip_tunnel_key *key = &encap->key;
291 ip = (struct ipv6hdr *)(encap->encap_hdr + encap->encap_hdr_len);
292 encap->encap_hdr_len += sizeof(*ip);
304 static void efx_gen_tun_header_udp(struct efx_tc_encap_action *encap, u8 len)
306 struct ip_tunnel_key *key = &encap->key;
309 udp = (struct udphdr *)(encap->encap_hdr + encap->encap_hdr_len);
310 encap->encap_hdr_len += sizeof(*udp);
316 static void efx_gen_tun_header_vxlan(struct efx_tc_encap_action *encap)
318 struct ip_tunnel_key *key = &encap->key;
321 vxlan = (struct vxlanhdr *)(encap->encap_hdr + encap->encap_hdr_len);
322 encap->encap_hdr_len += sizeof(*vxlan);
328 static void efx_gen_tun_header_geneve(struct efx_tc_encap_action *encap)
330 struct ip_tunnel_key *key = &encap->key;
334 geneve = (struct genevehdr *)(encap->encap_hdr + encap->encap_hdr_len);
335 encap->encap_hdr_len += sizeof(*geneve);
349 static void efx_gen_vxlan_header_ipv4(struct efx_tc_encap_action *encap)
351 BUILD_BUG_ON(sizeof(encap->encap_hdr) < vxlan4_header_len);
352 efx_gen_tun_header_eth(encap, ETH_P_IP);
353 efx_gen_tun_header_ipv4(encap, IPPROTO_UDP, vxlan_header_l4_len);
354 efx_gen_tun_header_udp(encap, sizeof(struct vxlanhdr));
355 efx_gen_tun_header_vxlan(encap);
360 static void efx_gen_geneve_header_ipv4(struct efx_tc_encap_action *encap)
362 BUILD_BUG_ON(sizeof(encap->encap_hdr) < geneve4_header_len);
363 efx_gen_tun_header_eth(encap, ETH_P_IP);
364 efx_gen_tun_header_ipv4(encap, IPPROTO_UDP, geneve_header_l4_len);
365 efx_gen_tun_header_udp(encap, sizeof(struct genevehdr));
366 efx_gen_tun_header_geneve(encap);
371 static void efx_gen_vxlan_header_ipv6(struct efx_tc_encap_action *encap)
373 BUILD_BUG_ON(sizeof(encap->encap_hdr) < vxlan6_header_len);
374 efx_gen_tun_header_eth(encap, ETH_P_IPV6);
375 efx_gen_tun_header_ipv6(encap, IPPROTO_UDP, vxlan_header_l4_len);
376 efx_gen_tun_header_udp(encap, sizeof(struct vxlanhdr));
377 efx_gen_tun_header_vxlan(encap);
381 static void efx_gen_geneve_header_ipv6(struct efx_tc_encap_action *encap)
383 BUILD_BUG_ON(sizeof(encap->encap_hdr) < geneve6_header_len);
384 efx_gen_tun_header_eth(encap, ETH_P_IPV6);
385 efx_gen_tun_header_ipv6(encap, IPPROTO_UDP, geneve_header_l4_len);
386 efx_gen_tun_header_udp(encap, sizeof(struct genevehdr));
387 efx_gen_tun_header_geneve(encap);
392 struct efx_tc_encap_action *encap)
394 encap->n_valid = encap->neigh->n_valid;
400 switch ((int)encap->type) {
402 efx_gen_vxlan_header_ipv4(encap);
405 efx_gen_geneve_header_ipv4(encap);
409 efx_gen_vxlan_header_ipv6(encap);
412 efx_gen_geneve_header_ipv6(encap);
416 /* unhandled encap type, can't happen */
419 "Bogus encap type %d, can't generate\n",
420 encap->type);
423 encap->n_valid = false;
429 struct efx_tc_encap_action *encap)
436 if (encap->n_valid) {
437 /* Make sure no rules are using this encap while we change it */
438 list_for_each_entry(act, &encap->users, encap_user) {
463 memset(encap->encap_hdr, 0, sizeof(encap->encap_hdr));
464 encap->encap_hdr_len = ETH_HLEN;
466 if (encap->neigh) {
467 read_lock_bh(&encap->neigh->lock);
468 efx_gen_encap_header(efx, encap);
469 read_unlock_bh(&encap->neigh->lock);
471 encap->n_valid = false;
474 rc = efx_mae_update_encap_md(efx, encap);
477 "Failed to update encap hdr %08x rc %d\n",
478 encap->fw_id, rc);
481 netif_dbg(efx, drv, efx->net_dev, "Updated encap hdr %08x\n",
482 encap->fw_id);
483 if (!encap->n_valid)
486 list_for_each_entry(act, &encap->users, encap_user) {
507 struct efx_tc_encap_action *encap;
511 list_for_each_entry(encap, &neigh->users, list)
512 efx_tc_update_encap(neigh->efx, encap);
603 struct efx_tc_encap_action *encap, *old;
608 /* dest is not an encap device */
633 encap = kzalloc(sizeof(*encap), GFP_KERNEL_ACCOUNT);
634 if (!encap)
636 encap->type = type;
637 encap->key = info->key;
638 INIT_LIST_HEAD(&encap->users);
640 &encap->linkage,
644 kfree(encap);
653 rc = efx_bind_neigh(efx, encap, dev_net(egdev), extack);
656 to_efv = efx_tc_flower_lookup_efv(efx, encap->neigh->egdev);
668 encap->dest_mport = rc;
669 read_lock_bh(&encap->neigh->lock);
670 efx_gen_encap_header(efx, encap);
671 read_unlock_bh(&encap->neigh->lock);
673 rc = efx_mae_allocate_encap_md(efx, encap);
680 refcount_set(&encap->ref, 1);
681 return encap;
683 efx_release_neigh(efx, encap);
685 rhashtable_remove_fast(&efx->tc->encap_ht, &encap->linkage,
687 kfree(encap);
692 struct efx_tc_encap_action *encap)
694 if (!refcount_dec_and_test(&encap->ref))
696 efx_release_neigh(efx, encap);
697 rhashtable_remove_fast(&efx->tc->encap_ht, &encap->linkage,
699 efx_mae_free_encap_md(efx, encap);
700 kfree(encap);
705 struct efx_tc_encap_action *encap, *next;
707 list_for_each_entry_safe(encap, next, &neigh->users, list) {
709 efx_release_neigh(efx, encap);
710 /* The encap has lost its neigh, so it's now unready */
711 efx_tc_update_encap(efx, encap);