123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- // Copyright 2012 Google, Inc. All rights reserved.
- //
- // Use of this source code is governed by a BSD-style license
- // that can be found in the LICENSE file in the root of the source
- // tree.
- package layers
- import (
- "fmt"
- "strconv"
- "github.com/google/gopacket"
- )
- // TCPPort is a port in a TCP layer.
- type TCPPort uint16
- // UDPPort is a port in a UDP layer.
- type UDPPort uint16
- // RUDPPort is a port in a RUDP layer.
- type RUDPPort uint8
- // SCTPPort is a port in a SCTP layer.
- type SCTPPort uint16
- // UDPLitePort is a port in a UDPLite layer.
- type UDPLitePort uint16
- // RUDPPortNames contains the string names for all RUDP ports.
- var RUDPPortNames = map[RUDPPort]string{}
- // UDPLitePortNames contains the string names for all UDPLite ports.
- var UDPLitePortNames = map[UDPLitePort]string{}
- // {TCP,UDP,SCTP}PortNames can be found in iana_ports.go
- // String returns the port as "number(name)" if there's a well-known port name,
- // or just "number" if there isn't. Well-known names are stored in
- // TCPPortNames.
- func (a TCPPort) String() string {
- if name, ok := TCPPortNames[a]; ok {
- return fmt.Sprintf("%d(%s)", a, name)
- }
- return strconv.Itoa(int(a))
- }
- // LayerType returns a LayerType that would be able to decode the
- // application payload. It uses some well-known ports such as 53 for
- // DNS.
- //
- // Returns gopacket.LayerTypePayload for unknown/unsupported port numbers.
- func (a TCPPort) LayerType() gopacket.LayerType {
- lt := tcpPortLayerType[uint16(a)]
- if lt != 0 {
- return lt
- }
- return gopacket.LayerTypePayload
- }
- var tcpPortLayerType = [65536]gopacket.LayerType{
- 53: LayerTypeDNS,
- }
- // RegisterTCPPortLayerType creates a new mapping between a TCPPort
- // and an underlaying LayerType.
- func RegisterTCPPortLayerType(port TCPPort, layerType gopacket.LayerType) {
- tcpPortLayerType[port] = layerType
- }
- // String returns the port as "number(name)" if there's a well-known port name,
- // or just "number" if there isn't. Well-known names are stored in
- // UDPPortNames.
- func (a UDPPort) String() string {
- if name, ok := UDPPortNames[a]; ok {
- return fmt.Sprintf("%d(%s)", a, name)
- }
- return strconv.Itoa(int(a))
- }
- // LayerType returns a LayerType that would be able to decode the
- // application payload. It uses some well-known ports such as 53 for
- // DNS.
- //
- // Returns gopacket.LayerTypePayload for unknown/unsupported port numbers.
- func (a UDPPort) LayerType() gopacket.LayerType {
- lt := udpPortLayerType[uint16(a)]
- if lt != 0 {
- return lt
- }
- return gopacket.LayerTypePayload
- }
- var udpPortLayerType = [65536]gopacket.LayerType{
- 53: LayerTypeDNS,
- 123: LayerTypeNTP,
- 4789: LayerTypeVXLAN,
- 67: LayerTypeDHCPv4,
- 68: LayerTypeDHCPv4,
- 6343: LayerTypeSFlow,
- 6081: LayerTypeGeneve,
- 3784: LayerTypeBFD,
- }
- // RegisterUDPPortLayerType creates a new mapping between a UDPPort
- // and an underlaying LayerType.
- func RegisterUDPPortLayerType(port UDPPort, layerType gopacket.LayerType) {
- udpPortLayerType[port] = layerType
- }
- // String returns the port as "number(name)" if there's a well-known port name,
- // or just "number" if there isn't. Well-known names are stored in
- // RUDPPortNames.
- func (a RUDPPort) String() string {
- if name, ok := RUDPPortNames[a]; ok {
- return fmt.Sprintf("%d(%s)", a, name)
- }
- return strconv.Itoa(int(a))
- }
- // String returns the port as "number(name)" if there's a well-known port name,
- // or just "number" if there isn't. Well-known names are stored in
- // SCTPPortNames.
- func (a SCTPPort) String() string {
- if name, ok := SCTPPortNames[a]; ok {
- return fmt.Sprintf("%d(%s)", a, name)
- }
- return strconv.Itoa(int(a))
- }
- // String returns the port as "number(name)" if there's a well-known port name,
- // or just "number" if there isn't. Well-known names are stored in
- // UDPLitePortNames.
- func (a UDPLitePort) String() string {
- if name, ok := UDPLitePortNames[a]; ok {
- return fmt.Sprintf("%d(%s)", a, name)
- }
- return strconv.Itoa(int(a))
- }
|