constants.go raw

   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  )
 223