vpp_l3

package
v3.0.0-beta.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 17, 2020 License: Apache-2.0 Imports: 5 Imported by: 29

Documentation

Index

Constants

View Source
const ModuleName = "vpp"

ModuleName is the module name used for models.

Variables

View Source
var (
	ModelARPEntry = models.Register(&ARPEntry{}, models.Spec{
		Module:  ModuleName,
		Type:    "arp",
		Version: "v2",
	}, models.WithNameTemplate(
		"{{.Interface}}/{{.IpAddress}}",
	))

	ModelRoute = models.Register(&Route{}, models.Spec{
		Module:  ModuleName,
		Type:    "route",
		Version: "v2",
	}, models.WithNameTemplate(
		`{{if .OutgoingInterface}}{{printf "if/%s/" .OutgoingInterface}}{{end}}`+
			`vrf/{{.VrfId}}/`+
			`{{with ipnet .DstNetwork}}{{printf "dst/%s/%d/" .IP .MaskSize}}`+
			`{{else}}{{printf "dst/%s/" .DstNetwork}}{{end}}`+
			`{{if .NextHopAddr}}gw/{{.NextHopAddr}}{{end}}`,
	))

	ModelProxyARP = models.Register(&ProxyARP{}, models.Spec{
		Module:  ModuleName,
		Type:    "proxyarp-global",
		Version: "v2",
	})

	ModelIPScanNeighbor = models.Register(&IPScanNeighbor{}, models.Spec{
		Module:  ModuleName,
		Type:    "ipscanneigh-global",
		Version: "v2",
	})

	ModelVrfTable = models.Register(&VrfTable{}, models.Spec{
		Module:  ModuleName,
		Type:    "vrf-table",
		Version: "v2",
	}, models.WithNameTemplate(
		`id/{{.Id}}/protocol/{{.Protocol}}`,
	))

	ModelDHCPProxy = models.Register(&DHCPProxy{}, models.Spec{
		Module:  ModuleName,
		Type:    "dhcp-proxy",
		Version: "v2",
	}, models.WithNameTemplate(
		`{{ protoip .SourceIpAddress}}`,
	))
)
View Source
var IPScanNeighbor_Mode_name = map[int32]string{
	0: "DISABLED",
	1: "IPV4",
	2: "IPV6",
	3: "BOTH",
}
View Source
var IPScanNeighbor_Mode_value = map[string]int32{
	"DISABLED": 0,
	"IPV4":     1,
	"IPV6":     2,
	"BOTH":     3,
}
View Source
var Route_RouteType_name = map[int32]string{
	0: "INTRA_VRF",
	1: "INTER_VRF",
	2: "DROP",
}
View Source
var Route_RouteType_value = map[string]int32{
	"INTRA_VRF": 0,
	"INTER_VRF": 1,
	"DROP":      2,
}
View Source
var VrfTable_Protocol_name = map[int32]string{
	0: "IPV4",
	1: "IPV6",
}
View Source
var VrfTable_Protocol_value = map[string]int32{
	"IPV4": 0,
	"IPV6": 1,
}

Functions

func ArpEntryKey

func ArpEntryKey(iface, ipAddr string) string

ArpEntryKey returns the key to store ARP entry

func DHCPProxyKey

func DHCPProxyKey(srcIP string) string

DHCPProxyKey is key for DHCP proxy

func IPScanNeighborKey

func IPScanNeighborKey() string

ProxyARPKey is key for global ip scan neighbor

func ParseProxyARPInterfaceKey

func ParseProxyARPInterfaceKey(key string) (iface string, isProxyARPInterfaceKey bool)

ParseProxyARPInterfaceKey parses key representing binding for interface with enabled proxy ARP.

func ParseRouteKey

func ParseRouteKey(key string) (outIface, vrfIndex, dstNet, nextHopAddr string, isRouteKey bool)

ParseRouteKey parses VRF label and route address from a route key.

func ProxyARPInterfaceKey

func ProxyARPInterfaceKey(iface string) string

ProxyARPInterfaceKey returns the key used to represent binding for interface with enabled proxy ARP.

func ProxyARPKey

func ProxyARPKey() string

ProxyARPKey is key for global proxy arp

func RouteKey

func RouteKey(iface string, vrf uint32, dstNet string, nextHopAddr string) string

RouteKey returns the key used in ETCD to store vpp route for vpp instance.

func RouteVrfPrefix

func RouteVrfPrefix(vrf uint32) string

RouteVrfPrefix returns longest-common prefix of keys representing route that is written to given vrf table.

func VrfTableKey

func VrfTableKey(id uint32, protocol VrfTable_Protocol) string

VrfTableKey returns the key used to represent configuration for VPP VRF table.

Types

type ARPEntry

type ARPEntry struct {
	Interface            string   `protobuf:"bytes,1,opt,name=interface,proto3" json:"interface,omitempty"`
	IpAddress            string   `protobuf:"bytes,2,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"`
	PhysAddress          string   `protobuf:"bytes,3,opt,name=phys_address,json=physAddress,proto3" json:"phys_address,omitempty"`
	Static               bool     `protobuf:"varint,4,opt,name=static,proto3" json:"static,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (*ARPEntry) Descriptor

func (*ARPEntry) Descriptor() ([]byte, []int)

func (*ARPEntry) GetInterface

func (m *ARPEntry) GetInterface() string

func (*ARPEntry) GetIpAddress

func (m *ARPEntry) GetIpAddress() string

func (*ARPEntry) GetPhysAddress

func (m *ARPEntry) GetPhysAddress() string

func (*ARPEntry) GetStatic

func (m *ARPEntry) GetStatic() bool

func (*ARPEntry) ProtoMessage

func (*ARPEntry) ProtoMessage()

func (*ARPEntry) Reset

func (m *ARPEntry) Reset()

func (*ARPEntry) String

func (m *ARPEntry) String() string

func (*ARPEntry) XXX_DiscardUnknown

func (m *ARPEntry) XXX_DiscardUnknown()

func (*ARPEntry) XXX_Marshal

func (m *ARPEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*ARPEntry) XXX_Merge

func (m *ARPEntry) XXX_Merge(src proto.Message)

func (*ARPEntry) XXX_Size

func (m *ARPEntry) XXX_Size() int

func (*ARPEntry) XXX_Unmarshal

func (m *ARPEntry) XXX_Unmarshal(b []byte) error

type DHCPProxy

type DHCPProxy struct {
	SourceIpAddress      string                  `protobuf:"bytes,1,opt,name=source_ip_address,json=sourceIpAddress,proto3" json:"source_ip_address,omitempty"`
	RxVrfId              uint32                  `protobuf:"varint,2,opt,name=rx_vrf_id,json=rxVrfId,proto3" json:"rx_vrf_id,omitempty"`
	Servers              []*DHCPProxy_DHCPServer `protobuf:"bytes,4,rep,name=servers,proto3" json:"servers,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (*DHCPProxy) Descriptor

func (*DHCPProxy) Descriptor() ([]byte, []int)

func (*DHCPProxy) GetRxVrfId

func (m *DHCPProxy) GetRxVrfId() uint32

func (*DHCPProxy) GetServers

func (m *DHCPProxy) GetServers() []*DHCPProxy_DHCPServer

func (*DHCPProxy) GetSourceIpAddress

func (m *DHCPProxy) GetSourceIpAddress() string

func (*DHCPProxy) ProtoMessage

func (*DHCPProxy) ProtoMessage()

func (*DHCPProxy) Reset

func (m *DHCPProxy) Reset()

func (*DHCPProxy) String

func (m *DHCPProxy) String() string

func (*DHCPProxy) XXX_DiscardUnknown

func (m *DHCPProxy) XXX_DiscardUnknown()

func (*DHCPProxy) XXX_Marshal

func (m *DHCPProxy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*DHCPProxy) XXX_Merge

func (m *DHCPProxy) XXX_Merge(src proto.Message)

func (*DHCPProxy) XXX_Size

func (m *DHCPProxy) XXX_Size() int

func (*DHCPProxy) XXX_Unmarshal

func (m *DHCPProxy) XXX_Unmarshal(b []byte) error

type DHCPProxy_DHCPServer

type DHCPProxy_DHCPServer struct {
	VrfId                uint32   `protobuf:"varint,1,opt,name=vrf_id,json=vrfId,proto3" json:"vrf_id,omitempty"`
	IpAddress            string   `protobuf:"bytes,2,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (*DHCPProxy_DHCPServer) Descriptor

func (*DHCPProxy_DHCPServer) Descriptor() ([]byte, []int)

func (*DHCPProxy_DHCPServer) GetIpAddress

func (m *DHCPProxy_DHCPServer) GetIpAddress() string

func (*DHCPProxy_DHCPServer) GetVrfId

func (m *DHCPProxy_DHCPServer) GetVrfId() uint32

func (*DHCPProxy_DHCPServer) ProtoMessage

func (*DHCPProxy_DHCPServer) ProtoMessage()

func (*DHCPProxy_DHCPServer) Reset

func (m *DHCPProxy_DHCPServer) Reset()

func (*DHCPProxy_DHCPServer) String

func (m *DHCPProxy_DHCPServer) String() string

func (*DHCPProxy_DHCPServer) XXX_DiscardUnknown

func (m *DHCPProxy_DHCPServer) XXX_DiscardUnknown()

func (*DHCPProxy_DHCPServer) XXX_Marshal

func (m *DHCPProxy_DHCPServer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*DHCPProxy_DHCPServer) XXX_Merge

func (m *DHCPProxy_DHCPServer) XXX_Merge(src proto.Message)

func (*DHCPProxy_DHCPServer) XXX_Size

func (m *DHCPProxy_DHCPServer) XXX_Size() int

func (*DHCPProxy_DHCPServer) XXX_Unmarshal

func (m *DHCPProxy_DHCPServer) XXX_Unmarshal(b []byte) error

type IPScanNeighbor

type IPScanNeighbor struct {
	Mode                 IPScanNeighbor_Mode `protobuf:"varint,1,opt,name=mode,proto3,enum=ligato.vpp.l3.IPScanNeighbor_Mode" json:"mode,omitempty"`
	ScanInterval         uint32              `protobuf:"varint,2,opt,name=scan_interval,json=scanInterval,proto3" json:"scan_interval,omitempty"`
	MaxProcTime          uint32              `protobuf:"varint,3,opt,name=max_proc_time,json=maxProcTime,proto3" json:"max_proc_time,omitempty"`
	MaxUpdate            uint32              `protobuf:"varint,4,opt,name=max_update,json=maxUpdate,proto3" json:"max_update,omitempty"`
	ScanIntDelay         uint32              `protobuf:"varint,5,opt,name=scan_int_delay,json=scanIntDelay,proto3" json:"scan_int_delay,omitempty"`
	StaleThreshold       uint32              `protobuf:"varint,6,opt,name=stale_threshold,json=staleThreshold,proto3" json:"stale_threshold,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (*IPScanNeighbor) Descriptor

func (*IPScanNeighbor) Descriptor() ([]byte, []int)

func (*IPScanNeighbor) GetMaxProcTime

func (m *IPScanNeighbor) GetMaxProcTime() uint32

func (*IPScanNeighbor) GetMaxUpdate

func (m *IPScanNeighbor) GetMaxUpdate() uint32

func (*IPScanNeighbor) GetMode

func (m *IPScanNeighbor) GetMode() IPScanNeighbor_Mode

func (*IPScanNeighbor) GetScanIntDelay

func (m *IPScanNeighbor) GetScanIntDelay() uint32

func (*IPScanNeighbor) GetScanInterval

func (m *IPScanNeighbor) GetScanInterval() uint32

func (*IPScanNeighbor) GetStaleThreshold

func (m *IPScanNeighbor) GetStaleThreshold() uint32

func (*IPScanNeighbor) ProtoMessage

func (*IPScanNeighbor) ProtoMessage()

func (*IPScanNeighbor) Reset

func (m *IPScanNeighbor) Reset()

func (*IPScanNeighbor) String

func (m *IPScanNeighbor) String() string

func (*IPScanNeighbor) XXX_DiscardUnknown

func (m *IPScanNeighbor) XXX_DiscardUnknown()

func (*IPScanNeighbor) XXX_Marshal

func (m *IPScanNeighbor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*IPScanNeighbor) XXX_Merge

func (m *IPScanNeighbor) XXX_Merge(src proto.Message)

func (*IPScanNeighbor) XXX_Size

func (m *IPScanNeighbor) XXX_Size() int

func (*IPScanNeighbor) XXX_Unmarshal

func (m *IPScanNeighbor) XXX_Unmarshal(b []byte) error

type IPScanNeighbor_Mode

type IPScanNeighbor_Mode int32
const (
	IPScanNeighbor_DISABLED IPScanNeighbor_Mode = 0
	IPScanNeighbor_IPV4     IPScanNeighbor_Mode = 1
	IPScanNeighbor_IPV6     IPScanNeighbor_Mode = 2
	IPScanNeighbor_BOTH     IPScanNeighbor_Mode = 3
)

func (IPScanNeighbor_Mode) EnumDescriptor

func (IPScanNeighbor_Mode) EnumDescriptor() ([]byte, []int)

func (IPScanNeighbor_Mode) String

func (x IPScanNeighbor_Mode) String() string

type ProxyARP

type ProxyARP struct {
	Interfaces           []*ProxyARP_Interface `protobuf:"bytes,1,rep,name=interfaces,proto3" json:"interfaces,omitempty"`
	Ranges               []*ProxyARP_Range     `protobuf:"bytes,2,rep,name=ranges,proto3" json:"ranges,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (*ProxyARP) Descriptor

func (*ProxyARP) Descriptor() ([]byte, []int)

func (*ProxyARP) GetInterfaces

func (m *ProxyARP) GetInterfaces() []*ProxyARP_Interface

func (*ProxyARP) GetRanges

func (m *ProxyARP) GetRanges() []*ProxyARP_Range

func (*ProxyARP) ProtoMessage

func (*ProxyARP) ProtoMessage()

func (*ProxyARP) Reset

func (m *ProxyARP) Reset()

func (*ProxyARP) String

func (m *ProxyARP) String() string

func (*ProxyARP) XXX_DiscardUnknown

func (m *ProxyARP) XXX_DiscardUnknown()

func (*ProxyARP) XXX_Marshal

func (m *ProxyARP) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*ProxyARP) XXX_Merge

func (m *ProxyARP) XXX_Merge(src proto.Message)

func (*ProxyARP) XXX_Size

func (m *ProxyARP) XXX_Size() int

func (*ProxyARP) XXX_Unmarshal

func (m *ProxyARP) XXX_Unmarshal(b []byte) error

type ProxyARP_Interface

type ProxyARP_Interface struct {
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (*ProxyARP_Interface) Descriptor

func (*ProxyARP_Interface) Descriptor() ([]byte, []int)

func (*ProxyARP_Interface) GetName

func (m *ProxyARP_Interface) GetName() string

func (*ProxyARP_Interface) ProtoMessage

func (*ProxyARP_Interface) ProtoMessage()

func (*ProxyARP_Interface) Reset

func (m *ProxyARP_Interface) Reset()

func (*ProxyARP_Interface) String

func (m *ProxyARP_Interface) String() string

func (*ProxyARP_Interface) XXX_DiscardUnknown

func (m *ProxyARP_Interface) XXX_DiscardUnknown()

func (*ProxyARP_Interface) XXX_Marshal

func (m *ProxyARP_Interface) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*ProxyARP_Interface) XXX_Merge

func (m *ProxyARP_Interface) XXX_Merge(src proto.Message)

func (*ProxyARP_Interface) XXX_Size

func (m *ProxyARP_Interface) XXX_Size() int

func (*ProxyARP_Interface) XXX_Unmarshal

func (m *ProxyARP_Interface) XXX_Unmarshal(b []byte) error

type ProxyARP_Range

type ProxyARP_Range struct {
	FirstIpAddr          string   `protobuf:"bytes,1,opt,name=first_ip_addr,json=firstIpAddr,proto3" json:"first_ip_addr,omitempty"`
	LastIpAddr           string   `protobuf:"bytes,2,opt,name=last_ip_addr,json=lastIpAddr,proto3" json:"last_ip_addr,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (*ProxyARP_Range) Descriptor

func (*ProxyARP_Range) Descriptor() ([]byte, []int)

func (*ProxyARP_Range) GetFirstIpAddr

func (m *ProxyARP_Range) GetFirstIpAddr() string

func (*ProxyARP_Range) GetLastIpAddr

func (m *ProxyARP_Range) GetLastIpAddr() string

func (*ProxyARP_Range) ProtoMessage

func (*ProxyARP_Range) ProtoMessage()

func (*ProxyARP_Range) Reset

func (m *ProxyARP_Range) Reset()

func (*ProxyARP_Range) String

func (m *ProxyARP_Range) String() string

func (*ProxyARP_Range) XXX_DiscardUnknown

func (m *ProxyARP_Range) XXX_DiscardUnknown()

func (*ProxyARP_Range) XXX_Marshal

func (m *ProxyARP_Range) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*ProxyARP_Range) XXX_Merge

func (m *ProxyARP_Range) XXX_Merge(src proto.Message)

func (*ProxyARP_Range) XXX_Size

func (m *ProxyARP_Range) XXX_Size() int

func (*ProxyARP_Range) XXX_Unmarshal

func (m *ProxyARP_Range) XXX_Unmarshal(b []byte) error

type Route

type Route struct {
	Type              Route_RouteType `protobuf:"varint,10,opt,name=type,proto3,enum=ligato.vpp.l3.Route_RouteType" json:"type,omitempty"`
	VrfId             uint32          `protobuf:"varint,1,opt,name=vrf_id,json=vrfId,proto3" json:"vrf_id,omitempty"`
	DstNetwork        string          `protobuf:"bytes,3,opt,name=dst_network,json=dstNetwork,proto3" json:"dst_network,omitempty"`
	NextHopAddr       string          `protobuf:"bytes,4,opt,name=next_hop_addr,json=nextHopAddr,proto3" json:"next_hop_addr,omitempty"`
	OutgoingInterface string          `protobuf:"bytes,5,opt,name=outgoing_interface,json=outgoingInterface,proto3" json:"outgoing_interface,omitempty"`
	Weight            uint32          `protobuf:"varint,6,opt,name=weight,proto3" json:"weight,omitempty"`
	Preference        uint32          `protobuf:"varint,7,opt,name=preference,proto3" json:"preference,omitempty"`
	// (a poor man's primary and backup)
	ViaVrfId             uint32   `protobuf:"varint,8,opt,name=via_vrf_id,json=viaVrfId,proto3" json:"via_vrf_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (*Route) Descriptor

func (*Route) Descriptor() ([]byte, []int)

func (*Route) GetDstNetwork

func (m *Route) GetDstNetwork() string

func (*Route) GetNextHopAddr

func (m *Route) GetNextHopAddr() string

func (*Route) GetOutgoingInterface

func (m *Route) GetOutgoingInterface() string

func (*Route) GetPreference

func (m *Route) GetPreference() uint32

func (*Route) GetType

func (m *Route) GetType() Route_RouteType

func (*Route) GetViaVrfId

func (m *Route) GetViaVrfId() uint32

func (*Route) GetVrfId

func (m *Route) GetVrfId() uint32

func (*Route) GetWeight

func (m *Route) GetWeight() uint32

func (*Route) ProtoMessage

func (*Route) ProtoMessage()

func (*Route) Reset

func (m *Route) Reset()

func (*Route) String

func (m *Route) String() string

func (*Route) XXX_DiscardUnknown

func (m *Route) XXX_DiscardUnknown()

func (*Route) XXX_Marshal

func (m *Route) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*Route) XXX_Merge

func (m *Route) XXX_Merge(src proto.Message)

func (*Route) XXX_Size

func (m *Route) XXX_Size() int

func (*Route) XXX_Unmarshal

func (m *Route) XXX_Unmarshal(b []byte) error

type Route_RouteType

type Route_RouteType int32
const (
	Route_INTRA_VRF Route_RouteType = 0
	Route_INTER_VRF Route_RouteType = 1
	Route_DROP      Route_RouteType = 2
)

func (Route_RouteType) EnumDescriptor

func (Route_RouteType) EnumDescriptor() ([]byte, []int)

func (Route_RouteType) String

func (x Route_RouteType) String() string

type VrfTable

type VrfTable struct {
	Id                   uint32            `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
	Protocol             VrfTable_Protocol `protobuf:"varint,2,opt,name=protocol,proto3,enum=ligato.vpp.l3.VrfTable_Protocol" json:"protocol,omitempty"`
	Label                string            `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (*VrfTable) Descriptor

func (*VrfTable) Descriptor() ([]byte, []int)

func (*VrfTable) GetId

func (m *VrfTable) GetId() uint32

func (*VrfTable) GetLabel

func (m *VrfTable) GetLabel() string

func (*VrfTable) GetProtocol

func (m *VrfTable) GetProtocol() VrfTable_Protocol

func (*VrfTable) ProtoMessage

func (*VrfTable) ProtoMessage()

func (*VrfTable) Reset

func (m *VrfTable) Reset()

func (*VrfTable) String

func (m *VrfTable) String() string

func (*VrfTable) XXX_DiscardUnknown

func (m *VrfTable) XXX_DiscardUnknown()

func (*VrfTable) XXX_Marshal

func (m *VrfTable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*VrfTable) XXX_Merge

func (m *VrfTable) XXX_Merge(src proto.Message)

func (*VrfTable) XXX_Size

func (m *VrfTable) XXX_Size() int

func (*VrfTable) XXX_Unmarshal

func (m *VrfTable) XXX_Unmarshal(b []byte) error

type VrfTable_Protocol

type VrfTable_Protocol int32
const (
	VrfTable_IPV4 VrfTable_Protocol = 0
	VrfTable_IPV6 VrfTable_Protocol = 1
)

func (VrfTable_Protocol) EnumDescriptor

func (VrfTable_Protocol) EnumDescriptor() ([]byte, []int)

func (VrfTable_Protocol) String

func (x VrfTable_Protocol) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL