(root)/
strace-6.5/
src/
bpf_sock_filter.c
       1  /*
       2   * Decoder of socket filter programs.
       3   *
       4   * Copyright (c) 2017 Dmitry V. Levin <ldv@strace.io>
       5   * Copyright (c) 2017-2022 The strace developers.
       6   * All rights reserved.
       7   *
       8   * SPDX-License-Identifier: LGPL-2.1-or-later
       9   */
      10  
      11  #include "defs.h"
      12  
      13  #include "bpf_filter.h"
      14  
      15  #include <linux/filter.h>
      16  #include "xlat/skf_ad.h"
      17  #define XLAT_MACROS_ONLY
      18  # include "xlat/skf_off.h"
      19  #undef XLAT_MACROS_ONLY
      20  
      21  static bool
      22  print_sock_filter_k(const struct bpf_filter_block *const fp)
      23  {
      24  	if (BPF_CLASS(fp->code) == BPF_LD && BPF_MODE(fp->code) == BPF_ABS) {
      25  		if (fp->k >= (unsigned int) SKF_AD_OFF) {
      26  			print_xlat32(SKF_AD_OFF);
      27  			tprint_plus();
      28  			printxval(skf_ad, fp->k - (unsigned int) SKF_AD_OFF,
      29  				  "SKF_AD_???");
      30  			return true;
      31  		} else if (fp->k >= (unsigned int) SKF_NET_OFF) {
      32  			print_xlat32(SKF_NET_OFF);
      33  			tprint_plus();
      34  			PRINT_VAL_U(fp->k - (unsigned int) SKF_NET_OFF);
      35  			return true;
      36  		} else if (fp->k >= (unsigned int) SKF_LL_OFF) {
      37  			print_xlat32(SKF_LL_OFF);
      38  			tprint_plus();
      39  			PRINT_VAL_U(fp->k - (unsigned int) SKF_LL_OFF);
      40  			return true;
      41  		}
      42  	}
      43  
      44  	return false;
      45  }
      46  
      47  void
      48  print_sock_fprog(struct tcb *const tcp, const kernel_ulong_t addr,
      49  		    const unsigned short len)
      50  {
      51  	print_bpf_fprog(tcp, addr, len, print_sock_filter_k);
      52  }
      53  
      54  void
      55  decode_sock_fprog(struct tcb *const tcp, const kernel_ulong_t addr)
      56  {
      57  	decode_bpf_fprog(tcp, addr, print_sock_filter_k);
      58  }