pcap

package
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Oct 20, 2023 License: Apache-2.0 Imports: 8 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	OperatingBand_name = map[int32]string{
		0: "BAND_2G",
		1: "BAND_5G",
		2: "BAND_6G",
		3: "BAND_ALL",
	}
	OperatingBand_value = map[string]int32{
		"BAND_2G":  0,
		"BAND_5G":  1,
		"BAND_6G":  2,
		"BAND_ALL": 3,
	}
)

Enum value maps for OperatingBand.

View Source
var (
	Protocol_name = map[int32]string{
		0: "TCP",
		1: "UDP",
	}
	Protocol_value = map[string]int32{
		"TCP": 0,
		"UDP": 1,
	}
)

Enum value maps for Protocol.

View Source
var (
	Direction_name = map[int32]string{
		0: "RX",
		1: "TX",
		2: "BOTH",
	}
	Direction_value = map[string]int32{
		"RX":   0,
		"TX":   1,
		"BOTH": 2,
	}
)

Enum value maps for Direction.

View Source
var (
	ChannelWidth_name = map[int32]string{
		0: "WIDTH_20MHZ",
		1: "WIDTH_40MHZ",
		2: "WIDTH_80MHZ",
		3: "WIDTH_160MHZ",
	}
	ChannelWidth_value = map[string]int32{
		"WIDTH_20MHZ":  0,
		"WIDTH_40MHZ":  1,
		"WIDTH_80MHZ":  2,
		"WIDTH_160MHZ": 3,
	}
)

Enum value maps for ChannelWidth.

View Source
var File_packet_capture_packet_capture_proto protoreflect.FileDescriptor
View Source
var PacketCapture_ServiceDesc = grpc.ServiceDesc{
	ServiceName: "gnoi.pcap.PacketCapture",
	HandlerType: (*PacketCaptureServer)(nil),
	Methods:     []grpc.MethodDesc{},
	Streams: []grpc.StreamDesc{
		{
			StreamName:    "Pcap",
			Handler:       _PacketCapture_Pcap_Handler,
			ServerStreams: true,
		},
	},
	Metadata: "packet_capture/packet_capture.proto",
}

PacketCapture_ServiceDesc is the grpc.ServiceDesc for PacketCapture service. It's only intended for direct use with grpc.RegisterService, and not to be introspected or modified (even as a copy)

Functions

func RegisterPacketCaptureServer

func RegisterPacketCaptureServer(s grpc.ServiceRegistrar, srv PacketCaptureServer)

Types

type AccessCaptureType

type AccessCaptureType struct {

	// Operating band: 2.4G, 5G, 6G.
	OperatingBand []OperatingBand `` /* 137-byte string literal not displayed */
	// Types that are assignable to FilterType:
	//	*AccessCaptureType_Ssid
	//	*AccessCaptureType_Mac
	FilterType isAccessCaptureType_FilterType `protobuf_oneof:"filter_type"`
	// Capture packets in promiscuous mode.  When enabled, all possible packets
	// meeting the criteria are captured.  When disabled, only own tx/rx packets
	// meeting the criteria are captured.
	PromiscuousMode bool `protobuf:"varint,4,opt,name=promiscuous_mode,json=promiscuousMode,proto3" json:"promiscuous_mode,omitempty"`
	// contains filtered or unexported fields
}

The capture is performed on the operating access radio(s) and it is not client impacting.

func (*AccessCaptureType) Descriptor deprecated

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

Deprecated: Use AccessCaptureType.ProtoReflect.Descriptor instead.

func (*AccessCaptureType) GetFilterType

func (m *AccessCaptureType) GetFilterType() isAccessCaptureType_FilterType

func (*AccessCaptureType) GetMac

func (x *AccessCaptureType) GetMac() string

func (*AccessCaptureType) GetOperatingBand

func (x *AccessCaptureType) GetOperatingBand() []OperatingBand

func (*AccessCaptureType) GetPromiscuousMode

func (x *AccessCaptureType) GetPromiscuousMode() bool

func (*AccessCaptureType) GetSsid

func (x *AccessCaptureType) GetSsid() string

func (*AccessCaptureType) ProtoMessage

func (*AccessCaptureType) ProtoMessage()

func (*AccessCaptureType) ProtoReflect

func (x *AccessCaptureType) ProtoReflect() protoreflect.Message

func (*AccessCaptureType) Reset

func (x *AccessCaptureType) Reset()

func (*AccessCaptureType) String

func (x *AccessCaptureType) String() string

type AccessCaptureType_Mac

type AccessCaptureType_Mac struct {
	// Optional, MAC addresss matching a BSSID or a client MAC.
	Mac string `protobuf:"bytes,3,opt,name=mac,proto3,oneof"`
}

type AccessCaptureType_Ssid

type AccessCaptureType_Ssid struct {
	// Optional, SSID of a VAP.
	Ssid string `protobuf:"bytes,2,opt,name=ssid,proto3,oneof"`
}

type BandChannelCombo

type BandChannelCombo struct {

	// Operating band: 2.4G, 5G, 6G.
	OperatingBand OperatingBand `` /* 130-byte string literal not displayed */
	// Channel Info.
	ChannelInfo []*ChannelInfo `protobuf:"bytes,2,rep,name=channel_info,json=channelInfo,proto3" json:"channel_info,omitempty"`
	// contains filtered or unexported fields
}

BandChannelCombo specifies the bands and channels to capture on.

func (*BandChannelCombo) Descriptor deprecated

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

Deprecated: Use BandChannelCombo.ProtoReflect.Descriptor instead.

func (*BandChannelCombo) GetChannelInfo

func (x *BandChannelCombo) GetChannelInfo() []*ChannelInfo

func (*BandChannelCombo) GetOperatingBand

func (x *BandChannelCombo) GetOperatingBand() OperatingBand

func (*BandChannelCombo) ProtoMessage

func (*BandChannelCombo) ProtoMessage()

func (*BandChannelCombo) ProtoReflect

func (x *BandChannelCombo) ProtoReflect() protoreflect.Message

func (*BandChannelCombo) Reset

func (x *BandChannelCombo) Reset()

func (*BandChannelCombo) String

func (x *BandChannelCombo) String() string

type ChannelInfo

type ChannelInfo struct {

	// Channels.
	Channel string `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"`
	// Channel width: 20/40/80/160 MHz, if not specified defaults to 20MHz.
	ChannelWidth ChannelWidth `` /* 126-byte string literal not displayed */
	// contains filtered or unexported fields
}

func (*ChannelInfo) Descriptor deprecated

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

Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead.

func (*ChannelInfo) GetChannel

func (x *ChannelInfo) GetChannel() string

func (*ChannelInfo) GetChannelWidth

func (x *ChannelInfo) GetChannelWidth() ChannelWidth

func (*ChannelInfo) ProtoMessage

func (*ChannelInfo) ProtoMessage()

func (*ChannelInfo) ProtoReflect

func (x *ChannelInfo) ProtoReflect() protoreflect.Message

func (*ChannelInfo) Reset

func (x *ChannelInfo) Reset()

func (*ChannelInfo) String

func (x *ChannelInfo) String() string

type ChannelWidth

type ChannelWidth int32
const (
	ChannelWidth_WIDTH_20MHZ  ChannelWidth = 0
	ChannelWidth_WIDTH_40MHZ  ChannelWidth = 1
	ChannelWidth_WIDTH_80MHZ  ChannelWidth = 2
	ChannelWidth_WIDTH_160MHZ ChannelWidth = 3
)

func (ChannelWidth) Descriptor

func (ChannelWidth) Enum

func (x ChannelWidth) Enum() *ChannelWidth

func (ChannelWidth) EnumDescriptor deprecated

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

Deprecated: Use ChannelWidth.Descriptor instead.

func (ChannelWidth) Number

func (ChannelWidth) String

func (x ChannelWidth) String() string

func (ChannelWidth) Type

type Direction

type Direction int32
const (
	// When applied to an interface, the Direction of packets to capture, receive
	// transmit, or both.
	Direction_RX   Direction = 0
	Direction_TX   Direction = 1
	Direction_BOTH Direction = 2
)

func (Direction) Descriptor

func (Direction) Descriptor() protoreflect.EnumDescriptor

func (Direction) Enum

func (x Direction) Enum() *Direction

func (Direction) EnumDescriptor deprecated

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

Deprecated: Use Direction.Descriptor instead.

func (Direction) Number

func (x Direction) Number() protoreflect.EnumNumber

func (Direction) String

func (x Direction) String() string

func (Direction) Type

type Filter

type Filter struct {

	// filter_name can be a reference to a filter already configured on the device
	// such as an ACL/class-map or other platform-specific abstraction that
	// may allow for the configuration of other filtering not otherwise available.
	FilterName string `protobuf:"bytes,1,opt,name=filter_name,json=filterName,proto3" json:"filter_name,omitempty"`
	// Source/destination net may be used to match traffic and should be specified
	// using CIDR notation.  eg. 1.1.1.1/32
	SrcNet   string     `protobuf:"bytes,2,opt,name=src_net,json=srcNet,proto3" json:"src_net,omitempty"`
	DestNet  string     `protobuf:"bytes,3,opt,name=dest_net,json=destNet,proto3" json:"dest_net,omitempty"`
	Protocol []Protocol `protobuf:"varint,4,rep,packed,name=protocol,proto3,enum=gnoi.pcap.Protocol" json:"protocol,omitempty"`
	// The specific protocol port number to match, eg. HTTP=80.
	Port []uint32 `protobuf:"varint,5,rep,packed,name=port,proto3" json:"port,omitempty"`
	// A VLAN ID.
	Vlan []uint32 `protobuf:"varint,6,rep,packed,name=vlan,proto3" json:"vlan,omitempty"`
	// contains filtered or unexported fields
}

func (*Filter) Descriptor deprecated

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

Deprecated: Use Filter.ProtoReflect.Descriptor instead.

func (*Filter) GetDestNet

func (x *Filter) GetDestNet() string

func (*Filter) GetFilterName

func (x *Filter) GetFilterName() string

func (*Filter) GetPort

func (x *Filter) GetPort() []uint32

func (*Filter) GetProtocol

func (x *Filter) GetProtocol() []Protocol

func (*Filter) GetSrcNet

func (x *Filter) GetSrcNet() string

func (*Filter) GetVlan

func (x *Filter) GetVlan() []uint32

func (*Filter) ProtoMessage

func (*Filter) ProtoMessage()

func (*Filter) ProtoReflect

func (x *Filter) ProtoReflect() protoreflect.Message

func (*Filter) Reset

func (x *Filter) Reset()

func (*Filter) String

func (x *Filter) String() string

type OperatingBand

type OperatingBand int32
const (
	OperatingBand_BAND_2G  OperatingBand = 0
	OperatingBand_BAND_5G  OperatingBand = 1
	OperatingBand_BAND_6G  OperatingBand = 2
	OperatingBand_BAND_ALL OperatingBand = 3
)

func (OperatingBand) Descriptor

func (OperatingBand) Enum

func (x OperatingBand) Enum() *OperatingBand

func (OperatingBand) EnumDescriptor deprecated

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

Deprecated: Use OperatingBand.Descriptor instead.

func (OperatingBand) Number

func (OperatingBand) String

func (x OperatingBand) String() string

func (OperatingBand) Type

type Packet

type Packet struct {

	// The raw bytes making up the packet.
	Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
	// contains filtered or unexported fields
}

func (*Packet) Descriptor deprecated

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

Deprecated: Use Packet.ProtoReflect.Descriptor instead.

func (*Packet) GetData

func (x *Packet) GetData() []byte

func (*Packet) ProtoMessage

func (*Packet) ProtoMessage()

func (*Packet) ProtoReflect

func (x *Packet) ProtoReflect() protoreflect.Message

func (*Packet) Reset

func (x *Packet) Reset()

func (*Packet) String

func (x *Packet) String() string

type PacketCaptureClient

type PacketCaptureClient interface {
	// Pcap starts packet capture on the target and streams back the results as
	// raw data packets that should be appropriately decoded by the receiver.
	// For example, most commonly an Ethernet decoder would be used for a typical
	// WiredRequest.  A WirelessRequest may require a Prism decoder or
	// related 802.11 decoder.
	Pcap(ctx context.Context, in *PcapRequest, opts ...grpc.CallOption) (PacketCapture_PcapClient, error)
}

PacketCaptureClient is the client API for PacketCapture service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.

type PacketCaptureServer

type PacketCaptureServer interface {
	// Pcap starts packet capture on the target and streams back the results as
	// raw data packets that should be appropriately decoded by the receiver.
	// For example, most commonly an Ethernet decoder would be used for a typical
	// WiredRequest.  A WirelessRequest may require a Prism decoder or
	// related 802.11 decoder.
	Pcap(*PcapRequest, PacketCapture_PcapServer) error
	// contains filtered or unexported methods
}

PacketCaptureServer is the server API for PacketCapture service. All implementations must embed UnimplementedPacketCaptureServer for forward compatibility

type PacketCapture_PcapClient

type PacketCapture_PcapClient interface {
	Recv() (*PcapResponse, error)
	grpc.ClientStream
}

type PacketCapture_PcapServer

type PacketCapture_PcapServer interface {
	Send(*PcapResponse) error
	grpc.ServerStream
}

type PcapRequest

type PcapRequest struct {

	// Types that are assignable to RequestType:
	//	*PcapRequest_WiredRequest
	//	*PcapRequest_WirelessRequest
	RequestType isPcapRequest_RequestType `protobuf_oneof:"request_type"`
	// Bytes to trim the data during packet capture: 0 for entire packet.
	TrimPayload uint32 `protobuf:"varint,3,opt,name=trim_payload,json=trimPayload,proto3" json:"trim_payload,omitempty"`
	// The number of pakets to capture, after which the capture will end; 0 for
	// for unlimited.
	PacketCount uint32 `protobuf:"varint,4,opt,name=packet_count,json=packetCount,proto3" json:"packet_count,omitempty"`
	// Capture duration in nanoseconds; 0 for indefinite.
	Duration uint64 `protobuf:"varint,5,opt,name=duration,proto3" json:"duration,omitempty"`
	// contains filtered or unexported fields
}

func (*PcapRequest) Descriptor deprecated

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

Deprecated: Use PcapRequest.ProtoReflect.Descriptor instead.

func (*PcapRequest) GetDuration

func (x *PcapRequest) GetDuration() uint64

func (*PcapRequest) GetPacketCount

func (x *PcapRequest) GetPacketCount() uint32

func (*PcapRequest) GetRequestType

func (m *PcapRequest) GetRequestType() isPcapRequest_RequestType

func (*PcapRequest) GetTrimPayload

func (x *PcapRequest) GetTrimPayload() uint32

func (*PcapRequest) GetWiredRequest

func (x *PcapRequest) GetWiredRequest() *WiredRequest

func (*PcapRequest) GetWirelessRequest

func (x *PcapRequest) GetWirelessRequest() *WirelessRequest

func (*PcapRequest) ProtoMessage

func (*PcapRequest) ProtoMessage()

func (*PcapRequest) ProtoReflect

func (x *PcapRequest) ProtoReflect() protoreflect.Message

func (*PcapRequest) Reset

func (x *PcapRequest) Reset()

func (*PcapRequest) String

func (x *PcapRequest) String() string

type PcapRequest_WiredRequest

type PcapRequest_WiredRequest struct {
	// Wired capture request.
	WiredRequest *WiredRequest `protobuf:"bytes,1,opt,name=wired_request,json=wiredRequest,proto3,oneof"`
}

type PcapRequest_WirelessRequest

type PcapRequest_WirelessRequest struct {
	// Wireless capture request.
	WirelessRequest *WirelessRequest `protobuf:"bytes,2,opt,name=wireless_request,json=wirelessRequest,proto3,oneof"`
}

type PcapResponse

type PcapResponse struct {

	// A packet is the raw network packet that must be decoded. Libraries exist
	// for different languages for decoding.
	// Python: https://scapy.readthedocs.io/en/latest/api/scapy.layers.html
	// GoLang: https://github.com/google/gopacket/blob/master/layers/layertypes.go
	Packets []*Packet `protobuf:"bytes,1,rep,name=packets,proto3" json:"packets,omitempty"`
	// contains filtered or unexported fields
}

func (*PcapResponse) Descriptor deprecated

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

Deprecated: Use PcapResponse.ProtoReflect.Descriptor instead.

func (*PcapResponse) GetPackets

func (x *PcapResponse) GetPackets() []*Packet

func (*PcapResponse) ProtoMessage

func (*PcapResponse) ProtoMessage()

func (*PcapResponse) ProtoReflect

func (x *PcapResponse) ProtoReflect() protoreflect.Message

func (*PcapResponse) Reset

func (x *PcapResponse) Reset()

func (*PcapResponse) String

func (x *PcapResponse) String() string

type Protocol

type Protocol int32
const (
	Protocol_TCP Protocol = 0
	Protocol_UDP Protocol = 1
)

func (Protocol) Descriptor

func (Protocol) Descriptor() protoreflect.EnumDescriptor

func (Protocol) Enum

func (x Protocol) Enum() *Protocol

func (Protocol) EnumDescriptor deprecated

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

Deprecated: Use Protocol.Descriptor instead.

func (Protocol) Number

func (x Protocol) Number() protoreflect.EnumNumber

func (Protocol) String

func (x Protocol) String() string

func (Protocol) Type

type ScanCaptureType

type ScanCaptureType struct {
	Combo []*BandChannelCombo `protobuf:"bytes,1,rep,name=combo,proto3" json:"combo,omitempty"`
	// Channel capture duration in nanoseconds, if not specified
	// defaults to something, supported by the platform.
	DwellTime uint64 `protobuf:"varint,2,opt,name=dwell_time,json=dwellTime,proto3" json:"dwell_time,omitempty"`
	// contains filtered or unexported fields
}

A ScanCaptureType on a dedicated scan radio. If a dedicated scan radio does not exist, the device may turn an access radio(s) into scan radio(s), which may impact clients.

func (*ScanCaptureType) Descriptor deprecated

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

Deprecated: Use ScanCaptureType.ProtoReflect.Descriptor instead.

func (*ScanCaptureType) GetCombo

func (x *ScanCaptureType) GetCombo() []*BandChannelCombo

func (*ScanCaptureType) GetDwellTime

func (x *ScanCaptureType) GetDwellTime() uint64

func (*ScanCaptureType) ProtoMessage

func (*ScanCaptureType) ProtoMessage()

func (*ScanCaptureType) ProtoReflect

func (x *ScanCaptureType) ProtoReflect() protoreflect.Message

func (*ScanCaptureType) Reset

func (x *ScanCaptureType) Reset()

func (*ScanCaptureType) String

func (x *ScanCaptureType) String() string

type UnimplementedPacketCaptureServer

type UnimplementedPacketCaptureServer struct {
}

UnimplementedPacketCaptureServer must be embedded to have forward compatible implementations.

func (UnimplementedPacketCaptureServer) Pcap

type UnsafePacketCaptureServer

type UnsafePacketCaptureServer interface {
	// contains filtered or unexported methods
}

UnsafePacketCaptureServer may be embedded to opt out of forward compatibility for this service. Use of this interface is not recommended, as added methods to PacketCaptureServer will result in compilation errors.

type WiredRequest

type WiredRequest struct {

	// Interface name.
	Ifname string `protobuf:"bytes,1,opt,name=ifname,proto3" json:"ifname,omitempty"`
	// The Direction to capture from, if not specified defaults to BOTH.
	Direction Direction `protobuf:"varint,2,opt,name=direction,proto3,enum=gnoi.pcap.Direction" json:"direction,omitempty"`
	// Filtering based on protocols.
	//
	// Types that are assignable to FilterType:
	//	*WiredRequest_TcpdumpExpression
	//	*WiredRequest_Filter
	FilterType isWiredRequest_FilterType `protobuf_oneof:"filter_type"`
	// contains filtered or unexported fields
}

func (*WiredRequest) Descriptor deprecated

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

Deprecated: Use WiredRequest.ProtoReflect.Descriptor instead.

func (*WiredRequest) GetDirection

func (x *WiredRequest) GetDirection() Direction

func (*WiredRequest) GetFilter

func (x *WiredRequest) GetFilter() *Filter

func (*WiredRequest) GetFilterType

func (m *WiredRequest) GetFilterType() isWiredRequest_FilterType

func (*WiredRequest) GetIfname

func (x *WiredRequest) GetIfname() string

func (*WiredRequest) GetTcpdumpExpression

func (x *WiredRequest) GetTcpdumpExpression() string

func (*WiredRequest) ProtoMessage

func (*WiredRequest) ProtoMessage()

func (*WiredRequest) ProtoReflect

func (x *WiredRequest) ProtoReflect() protoreflect.Message

func (*WiredRequest) Reset

func (x *WiredRequest) Reset()

func (*WiredRequest) String

func (x *WiredRequest) String() string

type WiredRequest_Filter

type WiredRequest_Filter struct {
	// A Filter as defined in a message.
	Filter *Filter `protobuf:"bytes,4,opt,name=filter,proto3,oneof"`
}

type WiredRequest_TcpdumpExpression

type WiredRequest_TcpdumpExpression struct {
	// A tcpdump expression: https://www.tcpdump.org/manpages/pcap-filter.7.html
	// if raw expressions are supported by the device.
	TcpdumpExpression string `protobuf:"bytes,3,opt,name=tcpdump_expression,json=tcpdumpExpression,proto3,oneof"`
}

type WirelessRequest

type WirelessRequest struct {

	// A WirelessRequest may be on the access radio(s) or a dedicated scan
	// radio(s). On a device with a dedicated scan radio, an AccessCaptureType or
	// ScanCaptureType should not impact clients -- the access radios should not
	// go off channel or stop servicing clients.  On a device *without* a
	// dedicated scan radio, an AccessCaptureType should not be client impacting.
	// If ScanCaptureType is used on a device without a dedicated scan radio; the
	// device MAY impact clients and honor the packet capture requirements.
	//
	// Types that are assignable to CaptureType:
	//	*WirelessRequest_AccessType
	//	*WirelessRequest_ScanType
	CaptureType isWirelessRequest_CaptureType `protobuf_oneof:"capture_type"`
	// contains filtered or unexported fields
}

func (*WirelessRequest) Descriptor deprecated

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

Deprecated: Use WirelessRequest.ProtoReflect.Descriptor instead.

func (*WirelessRequest) GetAccessType

func (x *WirelessRequest) GetAccessType() *AccessCaptureType

func (*WirelessRequest) GetCaptureType

func (m *WirelessRequest) GetCaptureType() isWirelessRequest_CaptureType

func (*WirelessRequest) GetScanType

func (x *WirelessRequest) GetScanType() *ScanCaptureType

func (*WirelessRequest) ProtoMessage

func (*WirelessRequest) ProtoMessage()

func (*WirelessRequest) ProtoReflect

func (x *WirelessRequest) ProtoReflect() protoreflect.Message

func (*WirelessRequest) Reset

func (x *WirelessRequest) Reset()

func (*WirelessRequest) String

func (x *WirelessRequest) String() string

type WirelessRequest_AccessType

type WirelessRequest_AccessType struct {
	// Access radio.
	AccessType *AccessCaptureType `protobuf:"bytes,1,opt,name=access_type,json=accessType,proto3,oneof"`
}

type WirelessRequest_ScanType

type WirelessRequest_ScanType struct {
	// Scan radio.
	ScanType *ScanCaptureType `protobuf:"bytes,2,opt,name=scan_type,json=scanType,proto3,oneof"`
}

Jump to

Keyboard shortcuts

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