Revision fc7655ab9292bc496fe95ccf92b75f4faa12c834 authored by André Martins on 16 June 2024, 14:50:48 UTC, committed by André Martins on 20 June 2024, 18:58:31 UTC
If we enable auto merge for trusted dependencies we will be able to reduce the load on reviewers by skipping the reviews of certain trusted libraries. Signed-off-by: André Martins <andre@cilium.io>
1 parent 8e6d288
proxy_hairpin.h
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
/* Copyright Authors of Cilium */
#pragma once
#include "common.h"
#include "utils.h"
#include "ipv6.h"
#include "ipv4.h"
#include "eth.h"
#include "dbg.h"
#include "trace.h"
#include "csum.h"
#include "l4.h"
#if defined(HOST_IFINDEX_MAC) && defined(HOST_IFINDEX)
/** Redirect to the proxy by hairpinning the packet out the incoming
* interface.
*
* @arg ctx Packet
* @arg ip4 Pointer to IPv4 header. NULL for IPv6 packet.
* @arg proxy_port Proxy port
*/
static __always_inline int
ctx_redirect_to_proxy_hairpin(struct __ctx_buff *ctx, struct iphdr *ip4,
__be16 proxy_port)
{
#if defined(ENABLE_IPV4) || defined(ENABLE_IPV6)
union macaddr host_mac = HOST_IFINDEX_MAC;
union macaddr router_mac = THIS_INTERFACE_MAC;
#endif
int ret = 0;
ctx_store_meta(ctx, CB_PROXY_MAGIC,
MARK_MAGIC_TO_PROXY | (proxy_port << 16));
bpf_barrier(); /* verifier workaround */
if (!ip4) {
#ifdef ENABLE_IPV6
ret = ipv6_l3(ctx, ETH_HLEN, (__u8 *)&router_mac, (__u8 *)&host_mac,
METRIC_EGRESS);
#endif
} else {
#ifdef ENABLE_IPV4
ret = ipv4_l3(ctx, ETH_HLEN, (__u8 *)&router_mac, (__u8 *)&host_mac,
ip4);
#endif
}
if (IS_ERR(ret))
return ret;
cilium_dbg_capture(ctx, DBG_CAPTURE_PROXY_PRE, proxy_port);
/* Note that the actual __ctx_buff preparation for submitting the
* packet to the proxy will occur in a subsequent program via
* ctx_redirect_to_proxy_first().
*/
return ctx_redirect(ctx, HOST_IFINDEX, 0);
}
#ifdef ENABLE_IPV4
static __always_inline int
ctx_redirect_to_proxy_hairpin_ipv4(struct __ctx_buff *ctx, struct iphdr *ip4,
__be16 proxy_port)
{
return ctx_redirect_to_proxy_hairpin(ctx, ip4, proxy_port);
}
#endif
#ifdef ENABLE_IPV6
static __always_inline int
ctx_redirect_to_proxy_hairpin_ipv6(struct __ctx_buff *ctx, __be16 proxy_port)
{
return ctx_redirect_to_proxy_hairpin(ctx, NULL, proxy_port);
}
#endif
#endif /* HOST_IFINDEX_MAC && HOST_IFINDEX */
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...