github.com/binkynet/BinkyNet@v1.12.1-0.20240421190447-da4e34c20be0/proto_vendor/golang.org/x/net/bpf/constants.go (about)

     1  // Copyright 2016 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package bpf
     6  
     7  // A Register is a register of the BPF virtual machine.
     8  type Register uint16
     9  
    10  const (
    11  	// RegA is the accumulator register. RegA is always the
    12  	// destination register of ALU operations.
    13  	RegA Register = iota
    14  	// RegX is the indirection register, used by LoadIndirect
    15  	// operations.
    16  	RegX
    17  )
    18  
    19  // An ALUOp is an arithmetic or logic operation.
    20  type ALUOp uint16
    21  
    22  // ALU binary operation types.
    23  const (
    24  	ALUOpAdd ALUOp = iota << 4
    25  	ALUOpSub
    26  	ALUOpMul
    27  	ALUOpDiv
    28  	ALUOpOr
    29  	ALUOpAnd
    30  	ALUOpShiftLeft
    31  	ALUOpShiftRight
    32  	aluOpNeg // Not exported because it's the only unary ALU operation, and gets its own instruction type.
    33  	ALUOpMod
    34  	ALUOpXor
    35  )
    36  
    37  // A JumpTest is a comparison operator used in conditional jumps.
    38  type JumpTest uint16
    39  
    40  // Supported operators for conditional jumps.
    41  // K can be RegX for JumpIfX
    42  const (
    43  	// K == A
    44  	JumpEqual JumpTest = iota
    45  	// K != A
    46  	JumpNotEqual
    47  	// K > A
    48  	JumpGreaterThan
    49  	// K < A
    50  	JumpLessThan
    51  	// K >= A
    52  	JumpGreaterOrEqual
    53  	// K <= A
    54  	JumpLessOrEqual
    55  	// K & A != 0
    56  	JumpBitsSet
    57  	// K & A == 0
    58  	JumpBitsNotSet
    59  )
    60  
    61  // An Extension is a function call provided by the kernel that
    62  // performs advanced operations that are expensive or impossible
    63  // within the BPF virtual machine.
    64  //
    65  // Extensions are only implemented by the Linux kernel.
    66  //
    67  // TODO: should we prune this list? Some of these extensions seem
    68  // either broken or near-impossible to use correctly, whereas other
    69  // (len, random, ifindex) are quite useful.
    70  type Extension int
    71  
    72  // Extension functions available in the Linux kernel.
    73  const (
    74  	// extOffset is the negative maximum number of instructions used
    75  	// to load instructions by overloading the K argument.
    76  	extOffset = -0x1000
    77  	// ExtLen returns the length of the packet.
    78  	ExtLen Extension = 1
    79  	// ExtProto returns the packet's L3 protocol type.
    80  	ExtProto Extension = 0
    81  	// ExtType returns the packet's type (skb->pkt_type in the kernel)
    82  	//
    83  	// TODO: better documentation. How nice an API do we want to
    84  	// provide for these esoteric extensions?
    85  	ExtType Extension = 4
    86  	// ExtPayloadOffset returns the offset of the packet payload, or
    87  	// the first protocol header that the kernel does not know how to
    88  	// parse.
    89  	ExtPayloadOffset Extension = 52
    90  	// ExtInterfaceIndex returns the index of the interface on which
    91  	// the packet was received.
    92  	ExtInterfaceIndex Extension = 8
    93  	// ExtNetlinkAttr returns the netlink attribute of type X at
    94  	// offset A.
    95  	ExtNetlinkAttr Extension = 12
    96  	// ExtNetlinkAttrNested returns the nested netlink attribute of
    97  	// type X at offset A.
    98  	ExtNetlinkAttrNested Extension = 16
    99  	// ExtMark returns the packet's mark value.
   100  	ExtMark Extension = 20
   101  	// ExtQueue returns the packet's assigned hardware queue.
   102  	ExtQueue Extension = 24
   103  	// ExtLinkLayerType returns the packet's hardware address type
   104  	// (e.g. Ethernet, Infiniband).
   105  	ExtLinkLayerType Extension = 28
   106  	// ExtRXHash returns the packets receive hash.
   107  	//
   108  	// TODO: figure out what this rxhash actually is.
   109  	ExtRXHash Extension = 32
   110  	// ExtCPUID returns the ID of the CPU processing the current
   111  	// packet.
   112  	ExtCPUID Extension = 36
   113  	// ExtVLANTag returns the packet's VLAN tag.
   114  	ExtVLANTag Extension = 44
   115  	// ExtVLANTagPresent returns non-zero if the packet has a VLAN
   116  	// tag.
   117  	//
   118  	// TODO: I think this might be a lie: it reads bit 0x1000 of the
   119  	// VLAN header, which changed meaning in recent revisions of the
   120  	// spec - this extension may now return meaningless information.
   121  	ExtVLANTagPresent Extension = 48
   122  	// ExtVLANProto returns 0x8100 if the frame has a VLAN header,
   123  	// 0x88a8 if the frame has a "Q-in-Q" double VLAN header, or some
   124  	// other value if no VLAN information is present.
   125  	ExtVLANProto Extension = 60
   126  	// ExtRand returns a uniformly random uint32.
   127  	ExtRand Extension = 56
   128  )
   129  
   130  // The following gives names to various bit patterns used in opcode construction.
   131  
   132  const (
   133  	opMaskCls uint16 = 0x7
   134  	// opClsLoad masks
   135  	opMaskLoadDest  = 0x01
   136  	opMaskLoadWidth = 0x18
   137  	opMaskLoadMode  = 0xe0
   138  	// opClsALU & opClsJump
   139  	opMaskOperand  = 0x08
   140  	opMaskOperator = 0xf0
   141  )
   142  
   143  const (
   144  	// +---------------+-----------------+---+---+---+
   145  	// | AddrMode (3b) | LoadWidth (2b)  | 0 | 0 | 0 |
   146  	// +---------------+-----------------+---+---+---+
   147  	opClsLoadA uint16 = iota
   148  	// +---------------+-----------------+---+---+---+
   149  	// | AddrMode (3b) | LoadWidth (2b)  | 0 | 0 | 1 |
   150  	// +---------------+-----------------+---+---+---+
   151  	opClsLoadX
   152  	// +---+---+---+---+---+---+---+---+
   153  	// | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
   154  	// +---+---+---+---+---+---+---+---+
   155  	opClsStoreA
   156  	// +---+---+---+---+---+---+---+---+
   157  	// | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
   158  	// +---+---+---+---+---+---+---+---+
   159  	opClsStoreX
   160  	// +---------------+-----------------+---+---+---+
   161  	// | Operator (4b) | OperandSrc (1b) | 1 | 0 | 0 |
   162  	// +---------------+-----------------+---+---+---+
   163  	opClsALU
   164  	// +-----------------------------+---+---+---+---+
   165  	// |      TestOperator (4b)      | 0 | 1 | 0 | 1 |
   166  	// +-----------------------------+---+---+---+---+
   167  	opClsJump
   168  	// +---+-------------------------+---+---+---+---+
   169  	// | 0 | 0 | 0 |   RetSrc (1b)   | 0 | 1 | 1 | 0 |
   170  	// +---+-------------------------+---+---+---+---+
   171  	opClsReturn
   172  	// +---+-------------------------+---+---+---+---+
   173  	// | 0 | 0 | 0 |  TXAorTAX (1b)  | 0 | 1 | 1 | 1 |
   174  	// +---+-------------------------+---+---+---+---+
   175  	opClsMisc
   176  )
   177  
   178  const (
   179  	opAddrModeImmediate uint16 = iota << 5
   180  	opAddrModeAbsolute
   181  	opAddrModeIndirect
   182  	opAddrModeScratch
   183  	opAddrModePacketLen // actually an extension, not an addressing mode.
   184  	opAddrModeMemShift
   185  )
   186  
   187  const (
   188  	opLoadWidth4 uint16 = iota << 3
   189  	opLoadWidth2
   190  	opLoadWidth1
   191  )
   192  
   193  // Operand for ALU and Jump instructions
   194  type opOperand uint16
   195  
   196  // Supported operand sources.
   197  const (
   198  	opOperandConstant opOperand = iota << 3
   199  	opOperandX
   200  )
   201  
   202  // An jumpOp is a conditional jump condition.
   203  type jumpOp uint16
   204  
   205  // Supported jump conditions.
   206  const (
   207  	opJumpAlways jumpOp = iota << 4
   208  	opJumpEqual
   209  	opJumpGT
   210  	opJumpGE
   211  	opJumpSet
   212  )
   213  
   214  const (
   215  	opRetSrcConstant uint16 = iota << 4
   216  	opRetSrcA
   217  )
   218  
   219  const (
   220  	opMiscTAX = 0x00
   221  	opMiscTXA = 0x80
   222  )