| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 | package firewallimport (	"encoding/json"	"fmt"	"net/netip")type m = map[string]anyconst (	ProtoAny    = 0 // When we want to handle HOPOPT (0) we can change this, if ever	ProtoTCP    = 6	ProtoUDP    = 17	ProtoICMP   = 1	ProtoICMPv6 = 58	PortAny      = 0  // Special value for matching `port: any`	PortFragment = -1 // Special value for matching `port: fragment`)type Packet struct {	LocalAddr  netip.Addr	RemoteAddr netip.Addr	LocalPort  uint16	RemotePort uint16	Protocol   uint8	Fragment   bool}func (fp *Packet) Copy() *Packet {	return &Packet{		LocalAddr:  fp.LocalAddr,		RemoteAddr: fp.RemoteAddr,		LocalPort:  fp.LocalPort,		RemotePort: fp.RemotePort,		Protocol:   fp.Protocol,		Fragment:   fp.Fragment,	}}func (fp Packet) MarshalJSON() ([]byte, error) {	var proto string	switch fp.Protocol {	case ProtoTCP:		proto = "tcp"	case ProtoICMP:		proto = "icmp"	case ProtoUDP:		proto = "udp"	default:		proto = fmt.Sprintf("unknown %v", fp.Protocol)	}	return json.Marshal(m{		"LocalAddr":  fp.LocalAddr.String(),		"RemoteAddr": fp.RemoteAddr.String(),		"LocalPort":  fp.LocalPort,		"RemotePort": fp.RemotePort,		"Protocol":   proto,		"Fragment":   fp.Fragment,	})}
 |