162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci/* 462306a36Sopenharmony_ci * Copyright 2022 Google LLC. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/bpf.h> 862306a36Sopenharmony_ci#include <bpf/bpf_helpers.h> 962306a36Sopenharmony_ci#include <bpf/bpf_endian.h> 1062306a36Sopenharmony_ci#include <netinet/in.h> 1162306a36Sopenharmony_ci#include <sys/socket.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* 2001:db8::1 */ 1462306a36Sopenharmony_ci#define BINDADDR_V6 { { { 0x20,0x01,0x0d,0xb8,0,0,0,0,0,0,0,0,0,0,0,1 } } } 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci__u32 do_bind = 0; 1762306a36Sopenharmony_ci__u32 has_error = 0; 1862306a36Sopenharmony_ci__u32 invocations_v4 = 0; 1962306a36Sopenharmony_ci__u32 invocations_v6 = 0; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ciSEC("cgroup/connect4") 2262306a36Sopenharmony_ciint connect_v4_prog(struct bpf_sock_addr *ctx) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci struct sockaddr_in sa = { 2562306a36Sopenharmony_ci .sin_family = AF_INET, 2662306a36Sopenharmony_ci .sin_addr.s_addr = bpf_htonl(0x01010101), 2762306a36Sopenharmony_ci }; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci __sync_fetch_and_add(&invocations_v4, 1); 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci if (do_bind && bpf_bind(ctx, (struct sockaddr *)&sa, sizeof(sa))) 3262306a36Sopenharmony_ci has_error = 1; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci return 1; 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ciSEC("cgroup/connect6") 3862306a36Sopenharmony_ciint connect_v6_prog(struct bpf_sock_addr *ctx) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci struct sockaddr_in6 sa = { 4162306a36Sopenharmony_ci .sin6_family = AF_INET6, 4262306a36Sopenharmony_ci .sin6_addr = BINDADDR_V6, 4362306a36Sopenharmony_ci }; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci __sync_fetch_and_add(&invocations_v6, 1); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci if (do_bind && bpf_bind(ctx, (struct sockaddr *)&sa, sizeof(sa))) 4862306a36Sopenharmony_ci has_error = 1; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci return 1; 5162306a36Sopenharmony_ci} 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cichar _license[] SEC("license") = "GPL"; 54