blob: 4b8d6f3791c036b8a288b267b8007b18457ae73c [file] [log] [blame]
// Copyright 2017 The Fuchsia 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 netstack
import (
"fmt"
"strconv"
"github.com/google/netstack/tcpip"
"github.com/google/netstack/tcpip/transport/tcp"
"github.com/google/netstack/tcpip/transport/udp"
)
type serviceKey struct {
name string
transport tcpip.TransportProtocolNumber
}
// http://www.iana.org/assignments/port-numbers
var services = map[serviceKey]uint16{
{"echo", tcp.ProtocolNumber}: 7,
{"echo", udp.ProtocolNumber}: 7,
{"ftp", tcp.ProtocolNumber}: 21,
{"ssh", tcp.ProtocolNumber}: 22,
{"telnet", tcp.ProtocolNumber}: 23,
{"tftp", udp.ProtocolNumber}: 69,
{"http", tcp.ProtocolNumber}: 80,
{"ntp", tcp.ProtocolNumber}: 123,
{"ntp", udp.ProtocolNumber}: 123,
{"imap", tcp.ProtocolNumber}: 143,
{"irc", tcp.ProtocolNumber}: 194,
{"irc", udp.ProtocolNumber}: 194,
{"ldap", tcp.ProtocolNumber}: 389,
{"ldap", udp.ProtocolNumber}: 389,
{"https", tcp.ProtocolNumber}: 443,
}
func serviceLookup(name string, t tcpip.TransportProtocolNumber) (port uint16, err error) {
portNum, err := strconv.Atoi(name)
if err == nil {
return uint16(portNum), nil
}
port, ok := services[serviceKey{name, t}]
if !ok {
return 0, fmt.Errorf("unknown service: %q", name)
}
return port, nil
}