mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-04 07:22:25 -06:00 
			
		
		
		
	
		
			
				
	
	
		
			222 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2016 The Go Authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a BSD-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
package bpf
 | 
						|
 | 
						|
// A Register is a register of the BPF virtual machine.
 | 
						|
type Register uint16
 | 
						|
 | 
						|
const (
 | 
						|
	// RegA is the accumulator register. RegA is always the
 | 
						|
	// destination register of ALU operations.
 | 
						|
	RegA Register = iota
 | 
						|
	// RegX is the indirection register, used by LoadIndirect
 | 
						|
	// operations.
 | 
						|
	RegX
 | 
						|
)
 | 
						|
 | 
						|
// An ALUOp is an arithmetic or logic operation.
 | 
						|
type ALUOp uint16
 | 
						|
 | 
						|
// ALU binary operation types.
 | 
						|
const (
 | 
						|
	ALUOpAdd ALUOp = iota << 4
 | 
						|
	ALUOpSub
 | 
						|
	ALUOpMul
 | 
						|
	ALUOpDiv
 | 
						|
	ALUOpOr
 | 
						|
	ALUOpAnd
 | 
						|
	ALUOpShiftLeft
 | 
						|
	ALUOpShiftRight
 | 
						|
	aluOpNeg // Not exported because it's the only unary ALU operation, and gets its own instruction type.
 | 
						|
	ALUOpMod
 | 
						|
	ALUOpXor
 | 
						|
)
 | 
						|
 | 
						|
// A JumpTest is a comparison operator used in conditional jumps.
 | 
						|
type JumpTest uint16
 | 
						|
 | 
						|
// Supported operators for conditional jumps.
 | 
						|
// K can be RegX for JumpIfX
 | 
						|
const (
 | 
						|
	// K == A
 | 
						|
	JumpEqual JumpTest = iota
 | 
						|
	// K != A
 | 
						|
	JumpNotEqual
 | 
						|
	// K > A
 | 
						|
	JumpGreaterThan
 | 
						|
	// K < A
 | 
						|
	JumpLessThan
 | 
						|
	// K >= A
 | 
						|
	JumpGreaterOrEqual
 | 
						|
	// K <= A
 | 
						|
	JumpLessOrEqual
 | 
						|
	// K & A != 0
 | 
						|
	JumpBitsSet
 | 
						|
	// K & A == 0
 | 
						|
	JumpBitsNotSet
 | 
						|
)
 | 
						|
 | 
						|
// An Extension is a function call provided by the kernel that
 | 
						|
// performs advanced operations that are expensive or impossible
 | 
						|
// within the BPF virtual machine.
 | 
						|
//
 | 
						|
// Extensions are only implemented by the Linux kernel.
 | 
						|
//
 | 
						|
// TODO: should we prune this list? Some of these extensions seem
 | 
						|
// either broken or near-impossible to use correctly, whereas other
 | 
						|
// (len, random, ifindex) are quite useful.
 | 
						|
type Extension int
 | 
						|
 | 
						|
// Extension functions available in the Linux kernel.
 | 
						|
const (
 | 
						|
	// extOffset is the negative maximum number of instructions used
 | 
						|
	// to load instructions by overloading the K argument.
 | 
						|
	extOffset = -0x1000
 | 
						|
	// ExtLen returns the length of the packet.
 | 
						|
	ExtLen Extension = 1
 | 
						|
	// ExtProto returns the packet's L3 protocol type.
 | 
						|
	ExtProto Extension = 0
 | 
						|
	// ExtType returns the packet's type (skb->pkt_type in the kernel)
 | 
						|
	//
 | 
						|
	// TODO: better documentation. How nice an API do we want to
 | 
						|
	// provide for these esoteric extensions?
 | 
						|
	ExtType Extension = 4
 | 
						|
	// ExtPayloadOffset returns the offset of the packet payload, or
 | 
						|
	// the first protocol header that the kernel does not know how to
 | 
						|
	// parse.
 | 
						|
	ExtPayloadOffset Extension = 52
 | 
						|
	// ExtInterfaceIndex returns the index of the interface on which
 | 
						|
	// the packet was received.
 | 
						|
	ExtInterfaceIndex Extension = 8
 | 
						|
	// ExtNetlinkAttr returns the netlink attribute of type X at
 | 
						|
	// offset A.
 | 
						|
	ExtNetlinkAttr Extension = 12
 | 
						|
	// ExtNetlinkAttrNested returns the nested netlink attribute of
 | 
						|
	// type X at offset A.
 | 
						|
	ExtNetlinkAttrNested Extension = 16
 | 
						|
	// ExtMark returns the packet's mark value.
 | 
						|
	ExtMark Extension = 20
 | 
						|
	// ExtQueue returns the packet's assigned hardware queue.
 | 
						|
	ExtQueue Extension = 24
 | 
						|
	// ExtLinkLayerType returns the packet's hardware address type
 | 
						|
	// (e.g. Ethernet, Infiniband).
 | 
						|
	ExtLinkLayerType Extension = 28
 | 
						|
	// ExtRXHash returns the packets receive hash.
 | 
						|
	//
 | 
						|
	// TODO: figure out what this rxhash actually is.
 | 
						|
	ExtRXHash Extension = 32
 | 
						|
	// ExtCPUID returns the ID of the CPU processing the current
 | 
						|
	// packet.
 | 
						|
	ExtCPUID Extension = 36
 | 
						|
	// ExtVLANTag returns the packet's VLAN tag.
 | 
						|
	ExtVLANTag Extension = 44
 | 
						|
	// ExtVLANTagPresent returns non-zero if the packet has a VLAN
 | 
						|
	// tag.
 | 
						|
	//
 | 
						|
	// TODO: I think this might be a lie: it reads bit 0x1000 of the
 | 
						|
	// VLAN header, which changed meaning in recent revisions of the
 | 
						|
	// spec - this extension may now return meaningless information.
 | 
						|
	ExtVLANTagPresent Extension = 48
 | 
						|
	// ExtVLANProto returns 0x8100 if the frame has a VLAN header,
 | 
						|
	// 0x88a8 if the frame has a "Q-in-Q" double VLAN header, or some
 | 
						|
	// other value if no VLAN information is present.
 | 
						|
	ExtVLANProto Extension = 60
 | 
						|
	// ExtRand returns a uniformly random uint32.
 | 
						|
	ExtRand Extension = 56
 | 
						|
)
 | 
						|
 | 
						|
// The following gives names to various bit patterns used in opcode construction.
 | 
						|
 | 
						|
const (
 | 
						|
	opMaskCls uint16 = 0x7
 | 
						|
	// opClsLoad masks
 | 
						|
	opMaskLoadDest  = 0x01
 | 
						|
	opMaskLoadWidth = 0x18
 | 
						|
	opMaskLoadMode  = 0xe0
 | 
						|
	// opClsALU & opClsJump
 | 
						|
	opMaskOperand  = 0x08
 | 
						|
	opMaskOperator = 0xf0
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	// +---------------+-----------------+---+---+---+
 | 
						|
	// | AddrMode (3b) | LoadWidth (2b)  | 0 | 0 | 0 |
 | 
						|
	// +---------------+-----------------+---+---+---+
 | 
						|
	opClsLoadA uint16 = iota
 | 
						|
	// +---------------+-----------------+---+---+---+
 | 
						|
	// | AddrMode (3b) | LoadWidth (2b)  | 0 | 0 | 1 |
 | 
						|
	// +---------------+-----------------+---+---+---+
 | 
						|
	opClsLoadX
 | 
						|
	// +---+---+---+---+---+---+---+---+
 | 
						|
	// | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
 | 
						|
	// +---+---+---+---+---+---+---+---+
 | 
						|
	opClsStoreA
 | 
						|
	// +---+---+---+---+---+---+---+---+
 | 
						|
	// | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
 | 
						|
	// +---+---+---+---+---+---+---+---+
 | 
						|
	opClsStoreX
 | 
						|
	// +---------------+-----------------+---+---+---+
 | 
						|
	// | Operator (4b) | OperandSrc (1b) | 1 | 0 | 0 |
 | 
						|
	// +---------------+-----------------+---+---+---+
 | 
						|
	opClsALU
 | 
						|
	// +-----------------------------+---+---+---+---+
 | 
						|
	// |      TestOperator (4b)      | 0 | 1 | 0 | 1 |
 | 
						|
	// +-----------------------------+---+---+---+---+
 | 
						|
	opClsJump
 | 
						|
	// +---+-------------------------+---+---+---+---+
 | 
						|
	// | 0 | 0 | 0 |   RetSrc (1b)   | 0 | 1 | 1 | 0 |
 | 
						|
	// +---+-------------------------+---+---+---+---+
 | 
						|
	opClsReturn
 | 
						|
	// +---+-------------------------+---+---+---+---+
 | 
						|
	// | 0 | 0 | 0 |  TXAorTAX (1b)  | 0 | 1 | 1 | 1 |
 | 
						|
	// +---+-------------------------+---+---+---+---+
 | 
						|
	opClsMisc
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	opAddrModeImmediate uint16 = iota << 5
 | 
						|
	opAddrModeAbsolute
 | 
						|
	opAddrModeIndirect
 | 
						|
	opAddrModeScratch
 | 
						|
	opAddrModePacketLen // actually an extension, not an addressing mode.
 | 
						|
	opAddrModeMemShift
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	opLoadWidth4 uint16 = iota << 3
 | 
						|
	opLoadWidth2
 | 
						|
	opLoadWidth1
 | 
						|
)
 | 
						|
 | 
						|
// Operand for ALU and Jump instructions
 | 
						|
type opOperand uint16
 | 
						|
 | 
						|
// Supported operand sources.
 | 
						|
const (
 | 
						|
	opOperandConstant opOperand = iota << 3
 | 
						|
	opOperandX
 | 
						|
)
 | 
						|
 | 
						|
// An jumpOp is a conditional jump condition.
 | 
						|
type jumpOp uint16
 | 
						|
 | 
						|
// Supported jump conditions.
 | 
						|
const (
 | 
						|
	opJumpAlways jumpOp = iota << 4
 | 
						|
	opJumpEqual
 | 
						|
	opJumpGT
 | 
						|
	opJumpGE
 | 
						|
	opJumpSet
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	opRetSrcConstant uint16 = iota << 4
 | 
						|
	opRetSrcA
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	opMiscTAX = 0x00
 | 
						|
	opMiscTXA = 0x80
 | 
						|
)
 |