From 40f11c50a1c031873f9771d21d0468cd38ffe879 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Tue, 23 Nov 2021 14:43:04 -0800 Subject: [PATCH] net/portmapper: make PCP/PMP result codes stringers Signed-off-by: Josh Bleecher Snyder --- net/portmapper/pcp.go | 14 ++++++---- net/portmapper/pcpresultcode_string.go | 37 ++++++++++++++++++++++++++ net/portmapper/pmpresultcode_string.go | 32 ++++++++++++++++++++++ net/portmapper/portmapper.go | 2 ++ 4 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 net/portmapper/pcpresultcode_string.go create mode 100644 net/portmapper/pmpresultcode_string.go diff --git a/net/portmapper/pcp.go b/net/portmapper/pcp.go index 1db18687d..43417947e 100644 --- a/net/portmapper/pcp.go +++ b/net/portmapper/pcp.go @@ -19,6 +19,10 @@ import ( // https://www.rfc-editor.org/rfc/pdfrfc/rfc6887.txt.pdf // https://tools.ietf.org/html/rfc6887 +//go:generate go run tailscale.com/cmd/addlicense -year 2021 -file pcpresultcode_string.go go run golang.org/x/tools/cmd/stringer -type=pcpResultCode -trimprefix=pcpCode + +type pcpResultCode uint8 + // PCP constants const ( pcpVersion = 2 @@ -26,14 +30,14 @@ const ( pcpMapLifetimeSec = 7200 // TODO does the RFC recommend anything? This is taken from PMP. - pcpCodeOK = 0 - pcpCodeNotAuthorized = 2 + pcpCodeOK pcpResultCode = 0 + pcpCodeNotAuthorized pcpResultCode = 2 // From RFC 6887: // ADDRESS_MISMATCH: The source IP address of the request packet does // not match the contents of the PCP Client's IP Address field, due // to an unexpected NAT on the path between the PCP client and the // PCP-controlled NAT or firewall. - pcpCodeAddressMismatch = 12 + pcpCodeAddressMismatch pcpResultCode = 12 pcpOpReply = 0x80 // OR'd into request's op code on response pcpOpAnnounce = 0 @@ -146,7 +150,7 @@ func pcpAnnounceRequest(myIP netaddr.IP) []byte { type pcpResponse struct { OpCode uint8 - ResultCode uint8 + ResultCode pcpResultCode Lifetime uint32 Epoch uint32 } @@ -156,7 +160,7 @@ func parsePCPResponse(b []byte) (res pcpResponse, ok bool) { return } res.OpCode = b[1] - res.ResultCode = b[3] + res.ResultCode = pcpResultCode(b[3]) res.Lifetime = binary.BigEndian.Uint32(b[4:]) res.Epoch = binary.BigEndian.Uint32(b[8:]) return res, true diff --git a/net/portmapper/pcpresultcode_string.go b/net/portmapper/pcpresultcode_string.go new file mode 100644 index 000000000..91f4ac738 --- /dev/null +++ b/net/portmapper/pcpresultcode_string.go @@ -0,0 +1,37 @@ +// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by "stringer -type=pcpResultCode -trimprefix=pcpCode"; DO NOT EDIT. + +package portmapper + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[pcpCodeOK-0] + _ = x[pcpCodeNotAuthorized-2] + _ = x[pcpCodeAddressMismatch-12] +} + +const ( + _pcpResultCode_name_0 = "OK" + _pcpResultCode_name_1 = "NotAuthorized" + _pcpResultCode_name_2 = "AddressMismatch" +) + +func (i pcpResultCode) String() string { + switch { + case i == 0: + return _pcpResultCode_name_0 + case i == 2: + return _pcpResultCode_name_1 + case i == 12: + return _pcpResultCode_name_2 + default: + return "pcpResultCode(" + strconv.FormatInt(int64(i), 10) + ")" + } +} diff --git a/net/portmapper/pmpresultcode_string.go b/net/portmapper/pmpresultcode_string.go new file mode 100644 index 000000000..01ce61fbc --- /dev/null +++ b/net/portmapper/pmpresultcode_string.go @@ -0,0 +1,32 @@ +// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by "stringer -type=pmpResultCode -trimprefix=pmpCode"; DO NOT EDIT. + +package portmapper + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[pmpCodeOK-0] + _ = x[pmpCodeUnsupportedVersion-1] + _ = x[pmpCodeNotAuthorized-2] + _ = x[pmpCodeNetworkFailure-3] + _ = x[pmpCodeOutOfResources-4] + _ = x[pmpCodeUnsupportedOpcode-5] +} + +const _pmpResultCode_name = "OKUnsupportedVersionNotAuthorizedNetworkFailureOutOfResourcesUnsupportedOpcode" + +var _pmpResultCode_index = [...]uint8{0, 2, 20, 33, 47, 61, 78} + +func (i pmpResultCode) String() string { + if i >= pmpResultCode(len(_pmpResultCode_index)-1) { + return "pmpResultCode(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _pmpResultCode_name[_pmpResultCode_index[i]:_pmpResultCode_index[i+1]] +} diff --git a/net/portmapper/portmapper.go b/net/portmapper/portmapper.go index 802caa3a5..69c1947ad 100644 --- a/net/portmapper/portmapper.go +++ b/net/portmapper/portmapper.go @@ -564,6 +564,8 @@ func (c *Client) createOrGetMapping(ctx context.Context) (external netaddr.IPPor } } +//go:generate go run tailscale.com/cmd/addlicense -year 2021 -file pmpresultcode_string.go go run golang.org/x/tools/cmd/stringer -type=pmpResultCode -trimprefix=pmpCode + type pmpResultCode uint16 // NAT-PMP constants.