linux/tools/testing/selftests/bpf/progs/sendmsg4_prog.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2// Copyright (c) 2018 Facebook
   3
   4#include <linux/stddef.h>
   5#include <linux/bpf.h>
   6#include <sys/socket.h>
   7
   8#include <bpf/bpf_helpers.h>
   9#include <bpf/bpf_endian.h>
  10
  11#include <bpf_sockopt_helpers.h>
  12
  13#define SRC1_IP4                0xAC100001U /* 172.16.0.1 */
  14#define SRC2_IP4                0x00000000U
  15#define SRC_REWRITE_IP4         0x7f000004U
  16#define DST_IP4                 0xC0A801FEU /* 192.168.1.254 */
  17#define DST_REWRITE_IP4         0x7f000001U
  18#define DST_PORT                4040
  19#define DST_REWRITE_PORT4       4444
  20
  21int _version SEC("version") = 1;
  22
  23SEC("cgroup/sendmsg4")
  24int sendmsg_v4_prog(struct bpf_sock_addr *ctx)
  25{
  26        int prio;
  27
  28        if (ctx->type != SOCK_DGRAM)
  29                return 0;
  30
  31        if (!get_set_sk_priority(ctx))
  32                return 0;
  33
  34        /* Rewrite source. */
  35        if (ctx->msg_src_ip4 == bpf_htonl(SRC1_IP4) ||
  36            ctx->msg_src_ip4 == bpf_htonl(SRC2_IP4)) {
  37                ctx->msg_src_ip4 = bpf_htonl(SRC_REWRITE_IP4);
  38        } else {
  39                /* Unexpected source. Reject sendmsg. */
  40                return 0;
  41        }
  42
  43        /* Rewrite destination. */
  44        if ((ctx->user_ip4 >> 24) == (bpf_htonl(DST_IP4) >> 24) &&
  45             ctx->user_port == bpf_htons(DST_PORT)) {
  46                ctx->user_ip4 = bpf_htonl(DST_REWRITE_IP4);
  47                ctx->user_port = bpf_htons(DST_REWRITE_PORT4);
  48        } else {
  49                /* Unexpected source. Reject sendmsg. */
  50                return 0;
  51        }
  52
  53        return 1;
  54}
  55
  56char _license[] SEC("license") = "GPL";
  57