linux/tools/testing/selftests/bpf/sendmsg6_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_helpers.h"
   9#include "bpf_endian.h"
  10
  11#define SRC_REWRITE_IP6_0       0
  12#define SRC_REWRITE_IP6_1       0
  13#define SRC_REWRITE_IP6_2       0
  14#define SRC_REWRITE_IP6_3       6
  15
  16#define DST_REWRITE_IP6_0       0
  17#define DST_REWRITE_IP6_1       0
  18#define DST_REWRITE_IP6_2       0
  19#define DST_REWRITE_IP6_3       1
  20
  21#define DST_REWRITE_PORT6       6666
  22
  23int _version SEC("version") = 1;
  24
  25SEC("cgroup/sendmsg6")
  26int sendmsg_v6_prog(struct bpf_sock_addr *ctx)
  27{
  28        if (ctx->type != SOCK_DGRAM)
  29                return 0;
  30
  31        /* Rewrite source. */
  32        if (ctx->msg_src_ip6[3] == bpf_htonl(1) ||
  33            ctx->msg_src_ip6[3] == bpf_htonl(0)) {
  34                ctx->msg_src_ip6[0] = bpf_htonl(SRC_REWRITE_IP6_0);
  35                ctx->msg_src_ip6[1] = bpf_htonl(SRC_REWRITE_IP6_1);
  36                ctx->msg_src_ip6[2] = bpf_htonl(SRC_REWRITE_IP6_2);
  37                ctx->msg_src_ip6[3] = bpf_htonl(SRC_REWRITE_IP6_3);
  38        } else {
  39                /* Unexpected source. Reject sendmsg. */
  40                return 0;
  41        }
  42
  43        /* Rewrite destination. */
  44        if ((ctx->user_ip6[0] & 0xFFFF) == bpf_htons(0xFACE) &&
  45             ctx->user_ip6[0] >> 16 == bpf_htons(0xB00C)) {
  46                ctx->user_ip6[0] = bpf_htonl(DST_REWRITE_IP6_0);
  47                ctx->user_ip6[1] = bpf_htonl(DST_REWRITE_IP6_1);
  48                ctx->user_ip6[2] = bpf_htonl(DST_REWRITE_IP6_2);
  49                ctx->user_ip6[3] = bpf_htonl(DST_REWRITE_IP6_3);
  50
  51                ctx->user_port = bpf_htons(DST_REWRITE_PORT6);
  52        } else {
  53                /* Unexpected destination. Reject sendmsg. */
  54                return 0;
  55        }
  56
  57        return 1;
  58}
  59
  60char _license[] SEC("license") = "GPL";
  61