Browse Source

Merge pull request #756 from rod-hynes/panic-protobuf

Add protobuf support for panicwrap logs
Rod Hynes 4 months ago
parent
commit
ea6888faa8
36 changed files with 656 additions and 580 deletions
  1. 123 39
      Server/main.go
  2. 14 0
      psiphon/server/config.go
  3. 1 16
      psiphon/server/log.go
  4. 16 16
      psiphon/server/pb/psiphond/base_params.pb.go
  5. 34 34
      psiphon/server/pb/psiphond/dial_params.pb.go
  6. 3 3
      psiphon/server/pb/psiphond/domain_bytes.pb.go
  7. 3 3
      psiphon/server/pb/psiphond/failed_tunnel.pb.go
  8. 20 20
      psiphon/server/pb/psiphond/inproxy_broker.pb.go
  9. 48 48
      psiphon/server/pb/psiphond/inproxy_dial_params.pb.go
  10. 11 11
      psiphon/server/pb/psiphond/irregular_tunnel.pb.go
  11. 2 2
      psiphon/server/pb/psiphond/orphan_packet.pb.go
  12. 6 6
      psiphon/server/pb/psiphond/psiphond.pb.go
  13. 4 4
      psiphon/server/pb/psiphond/remote_server_list.pb.go
  14. 5 5
      psiphon/server/pb/psiphond/server_blocklist.pb.go
  15. 5 5
      psiphon/server/pb/psiphond/server_load.pb.go
  16. 2 2
      psiphon/server/pb/psiphond/server_packet.pb.go
  17. 5 25
      psiphon/server/pb/psiphond/server_panic.pb.go
  18. 5 5
      psiphon/server/pb/psiphond/server_tunnel.pb.go
  19. 6 6
      psiphon/server/pb/psiphond/tactics.pb.go
  20. 2 2
      psiphon/server/pb/psiphond/unique_user.pb.go
  21. 2 2
      psiphon/server/pb/router/router.pb.go
  22. 14 14
      psiphon/server/proto/ca.psiphon.psiphond/base_params.proto
  23. 32 32
      psiphon/server/proto/ca.psiphon.psiphond/dial_params.proto
  24. 1 1
      psiphon/server/proto/ca.psiphon.psiphond/domain_bytes.proto
  25. 1 1
      psiphon/server/proto/ca.psiphon.psiphond/failed_tunnel.proto
  26. 18 18
      psiphon/server/proto/ca.psiphon.psiphond/inproxy_broker.proto
  27. 46 46
      psiphon/server/proto/ca.psiphon.psiphond/inproxy_dial_params.proto
  28. 9 9
      psiphon/server/proto/ca.psiphon.psiphond/irregular_tunnel.proto
  29. 4 4
      psiphon/server/proto/ca.psiphon.psiphond/psiphond.proto
  30. 2 2
      psiphon/server/proto/ca.psiphon.psiphond/remote_server_list.proto
  31. 3 3
      psiphon/server/proto/ca.psiphon.psiphond/server_blocklist.proto
  32. 3 3
      psiphon/server/proto/ca.psiphon.psiphond/server_load.proto
  33. 0 2
      psiphon/server/proto/ca.psiphon.psiphond/server_panic.proto
  34. 3 3
      psiphon/server/proto/ca.psiphon.psiphond/server_tunnel.proto
  35. 4 4
      psiphon/server/proto/ca.psiphon.psiphond/tactics.proto
  36. 199 184
      psiphon/server/protobufConverter.go

+ 123 - 39
Server/main.go

@@ -20,6 +20,7 @@
 package main
 
 import (
+	"context"
 	"encoding/json"
 	"flag"
 	"fmt"
@@ -33,10 +34,15 @@ import (
 	"time"
 
 	"github.com/Psiphon-Inc/rotate-safe-writer"
+	udsipc "github.com/Psiphon-Inc/uds-ipc"
 	"github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common"
 	"github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo"
+	"github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/errors"
 	"github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/server"
+	pb "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/server/pb/psiphond"
 	"github.com/mitchellh/panicwrap"
+	"google.golang.org/protobuf/proto"
+	"google.golang.org/protobuf/types/known/timestamppb"
 )
 
 var loadedConfigJSON []byte
@@ -277,56 +283,134 @@ func (list *stringListFlag) Set(flagValue string) error {
 }
 
 func panicHandler(output string) {
-	if len(loadedConfigJSON) > 0 {
-		config, err := server.LoadConfig([]byte(loadedConfigJSON))
+
+	// As this is the parent panicwrap process, no config or logging is
+	// initialized. Each of the JSON and protobuf panic logging helpers
+	// directly initialize the bare minimum required to emit the single panic
+	// log.
+
+	if len(loadedConfigJSON) == 0 {
+		fmt.Printf("no configuration JSON was loaded, cannot continue\n%s\n", output)
+		os.Exit(1)
+	}
+
+	config, err := server.LoadConfig([]byte(loadedConfigJSON))
+	if err != nil {
+		fmt.Printf("error parsing configuration file: %s\n%s\n", err, output)
+		os.Exit(1)
+	}
+
+	if config.LogFormat == "protobuf" || config.LogFormat == "both" {
+		err := panicHandlerProtobuf(config, output)
 		if err != nil {
-			fmt.Printf("error parsing configuration file: %s\n%s\n", err, output)
-			os.Exit(1)
+			fmt.Printf("error logging panic: %s\n%s\n", err, output)
+			// continue
 		}
+	}
 
-		logEvent := make(map[string]string)
-		logEvent["host_id"] = config.HostID
-		logEvent["build_rev"] = buildinfo.GetBuildInfo().BuildRev
-		logEvent["timestamp"] = time.Now().Format(time.RFC3339)
-		logEvent["event_name"] = "server_panic"
-
-		// ELK has a maximum field length of 32766 UTF8 bytes. Over that length, the
-		// log won't be delivered. Truncate the panic field, as it may be much longer.
-		maxLen := 32766
-		if len(output) > maxLen {
-			output = output[:maxLen]
-		}
+	// To maximize the chance of recording a panic log, always emit a classic
+	// log even in "protobuf" mode.
 
-		logEvent["panic"] = output
+	err = panicHandlerJSON(config, output)
+	if err != nil {
+		fmt.Printf("error logging panic: %s\n%s\n", err, output)
+		// continue
+	}
 
-		// Logs are written to the configured file name. If no name is specified, logs are written to stderr
-		var jsonWriter io.Writer
-		if config.LogFilename != "" {
+	os.Exit(1)
+}
 
-			retries, create, mode := config.GetLogFileReopenConfig()
-			panicLog, err := rotate.NewRotatableFileWriter(
-				config.LogFilename, retries, create, mode)
-			if err != nil {
-				fmt.Printf("unable to set panic log output: %s\n%s\n", err, output)
-				os.Exit(1)
-			}
-			defer panicLog.Close()
+func panicHandlerJSON(config *server.Config, output string) error {
 
-			jsonWriter = panicLog
-		} else {
-			jsonWriter = os.Stderr
-		}
+	logEvent := make(map[string]string)
+	logEvent["timestamp"] = time.Now().Format(time.RFC3339)
+	logEvent["host_id"] = config.HostID
+	logEvent["build_rev"] = buildinfo.GetBuildInfo().BuildRev
+	if config.HostProvider != "" {
+		logEvent["provider"] = config.HostProvider
+	}
+	logEvent["event_name"] = "server_panic"
+
+	// ELK has a maximum field length of 32766 UTF8 bytes. Over that length, the
+	// log won't be delivered. Truncate the panic field, as it may be much longer.
+	maxLen := 32766
+	if len(output) > maxLen {
+		output = output[:maxLen]
+	}
 
-		enc := json.NewEncoder(jsonWriter)
-		err = enc.Encode(logEvent)
+	logEvent["panic"] = output
+
+	// Logs are written to the configured file name. If no name is specified,
+	// logs are written to stderr.
+	var jsonWriter io.Writer
+	if config.LogFilename != "" {
+
+		retries, create, mode := config.GetLogFileReopenConfig()
+		panicLog, err := rotate.NewRotatableFileWriter(
+			config.LogFilename, retries, create, mode)
 		if err != nil {
-			fmt.Printf("unable to serialize panic message to JSON: %s\n%s\n", err, output)
-			os.Exit(1)
+			return errors.Trace(err)
 		}
+		defer panicLog.Close()
+
+		jsonWriter = panicLog
 	} else {
-		fmt.Printf("no configuration JSON was loaded, cannot continue\n%s\n", output)
-		os.Exit(1)
+		jsonWriter = os.Stderr
 	}
 
-	os.Exit(1)
+	err := json.NewEncoder(jsonWriter).Encode(logEvent)
+	if err != nil {
+		return errors.Trace(err)
+	}
+
+	return nil
+}
+
+func panicHandlerProtobuf(config *server.Config, output string) error {
+
+	metricSocketWriter, err := udsipc.NewWriter(config.MetricSocketPath)
+	if err != nil {
+		return errors.Trace(err)
+	}
+
+	metricSocketWriter.Start()
+	// No stop deadline; prioritize recording the panic
+	defer metricSocketWriter.Stop(context.Background())
+
+	// Avoid shipping a huge set of panic stacks. The main stack, which is
+	// first, and a selection of other stacks is sufficient.
+	maxLen := 32766
+	if len(output) > maxLen {
+		output = output[:maxLen]
+	}
+
+	psiphondMsg := &pb.Psiphond{
+		Timestamp:    timestamppb.Now(),
+		HostId:       &config.HostID,
+		HostBuildRev: &buildinfo.GetBuildInfo().BuildRev,
+		Provider:     &config.HostProvider,
+		Metric: &pb.Psiphond_ServerPanic{
+			ServerPanic: &pb.ServerPanic{
+				Panic: &output,
+			}},
+	}
+
+	routedMsg, err := server.NewProtobufRoutedMessage(
+		config.LogDestinationPrefix,
+		psiphondMsg)
+	if err != nil {
+		return errors.Trace(err)
+	}
+
+	serialized, err := proto.Marshal(routedMsg)
+	if err != nil {
+		return errors.Trace(err)
+	}
+
+	err = metricSocketWriter.WriteMessage(serialized)
+	if err != nil {
+		return errors.Trace(err)
+	}
+
+	return nil
 }

+ 14 - 0
psiphon/server/config.go

@@ -29,6 +29,7 @@ import (
 	"encoding/pem"
 	"net"
 	"os"
+	"slices"
 	"strconv"
 	"strings"
 	"sync/atomic"
@@ -675,6 +676,19 @@ func LoadConfig(configJSON []byte) (*Config, error) {
 		return nil, errors.Trace(err)
 	}
 
+	if !slices.Contains([]string{"", "json", "protobuf", "both"}, config.LogFormat) {
+		return nil, errors.Tracef("invalid log format: %s", logFormat)
+	}
+
+	if config.LogFormat == "protobuf" || config.LogFormat == "both" {
+		if config.LogDestinationPrefix == "" {
+			return nil, errors.TraceNew("LogDestinationPrefix must be set if protobuf logging is enabled")
+		}
+		if config.MetricSocketPath == "" {
+			return nil, errors.TraceNew("MetricSocketPath must be set if protobuf logging is enabled")
+		}
+	}
+
 	if config.ServerIPAddress == "" {
 		return nil, errors.TraceNew("ServerIPAddress is required")
 	}

+ 1 - 16
psiphon/server/log.go

@@ -26,7 +26,6 @@ import (
 	"io/ioutil"
 	go_log "log"
 	"os"
-	"slices"
 	"sync"
 	"sync/atomic"
 	"time"
@@ -141,7 +140,7 @@ func (logger *TraceLogger) LogRawFieldsWithTimestamp(fields LogFields) {
 	}
 
 	if ShouldLogProtobuf() {
-		for _, protoMsg := range LogFieldsToProtobuf(fields) {
+		for _, protoMsg := range logFieldsToProtobuf(fields) {
 			if protoMsg == nil {
 				logger.WithTrace().Error("failed to populate protobuf message struct")
 				continue
@@ -323,11 +322,6 @@ func InitLogging(config *Config) (retErr error) {
 			logFormat = "json"
 		}
 
-		if !slices.Contains([]string{"json", "protobuf", "both"}, logFormat) {
-			retErr = errors.Tracef("invalid log format: %s", logFormat)
-			return
-		}
-
 		shouldLogProtobuf = (logFormat == "protobuf" || logFormat == "both")
 		shouldLogJSON = (logFormat == "json" || logFormat == "both")
 
@@ -382,15 +376,6 @@ func InitLogging(config *Config) (retErr error) {
 		}
 
 		if shouldLogProtobuf {
-			if logDestinationPrefix == "" {
-				retErr = errors.TraceNew("LogDestinationPrefix must be set if protobuf logging is enabled")
-				return
-			}
-
-			if config.MetricSocketPath == "" {
-				retErr = errors.TraceNew("MetricSocketPath must be set if protobuf logging is enabled")
-				return
-			}
 
 			metricSocketWriter, retErr = udsipc.NewWriter(config.MetricSocketPath)
 			if retErr != nil {

+ 16 - 16
psiphon/server/pb/psiphond/base_params.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/base_params.proto
 
 package psiphond
@@ -24,24 +24,24 @@ const (
 
 type BaseParams struct {
 	state                 protoimpl.MessageState `protogen:"open.v1"`
-	ClientAsn             *string                `protobuf:"bytes,1,opt,name=client_asn,json=clientAsn,proto3,oneof" json:"client_asn,omitempty"`                  //LowCardinality
-	ClientAso             *string                `protobuf:"bytes,2,opt,name=client_aso,json=clientAso,proto3,oneof" json:"client_aso,omitempty"`                  //LowCardinality
-	ClientBuildRev        *string                `protobuf:"bytes,3,opt,name=client_build_rev,json=clientBuildRev,proto3,oneof" json:"client_build_rev,omitempty"` //LowCardinality
-	ClientCity            *string                `protobuf:"bytes,4,opt,name=client_city,json=clientCity,proto3,oneof" json:"client_city,omitempty"`               //LowCardinality
-	ClientFeatures        []string               `protobuf:"bytes,5,rep,name=client_features,json=clientFeatures,proto3" json:"client_features,omitempty"`         //LowCardinality
-	ClientIsp             *string                `protobuf:"bytes,6,opt,name=client_isp,json=clientIsp,proto3,oneof" json:"client_isp,omitempty"`                  //LowCardinality
-	ClientPlatform        *string                `protobuf:"bytes,7,opt,name=client_platform,json=clientPlatform,proto3,oneof" json:"client_platform,omitempty"`   //LowCardinality
-	ClientRegion          *string                `protobuf:"bytes,8,opt,name=client_region,json=clientRegion,proto3,oneof" json:"client_region,omitempty"`         //LowCardinality
+	ClientAsn             *string                `protobuf:"bytes,1,opt,name=client_asn,json=clientAsn,proto3,oneof" json:"client_asn,omitempty"`
+	ClientAso             *string                `protobuf:"bytes,2,opt,name=client_aso,json=clientAso,proto3,oneof" json:"client_aso,omitempty"`
+	ClientBuildRev        *string                `protobuf:"bytes,3,opt,name=client_build_rev,json=clientBuildRev,proto3,oneof" json:"client_build_rev,omitempty"`
+	ClientCity            *string                `protobuf:"bytes,4,opt,name=client_city,json=clientCity,proto3,oneof" json:"client_city,omitempty"`
+	ClientFeatures        []string               `protobuf:"bytes,5,rep,name=client_features,json=clientFeatures,proto3" json:"client_features,omitempty"`
+	ClientIsp             *string                `protobuf:"bytes,6,opt,name=client_isp,json=clientIsp,proto3,oneof" json:"client_isp,omitempty"`
+	ClientPlatform        *string                `protobuf:"bytes,7,opt,name=client_platform,json=clientPlatform,proto3,oneof" json:"client_platform,omitempty"`
+	ClientRegion          *string                `protobuf:"bytes,8,opt,name=client_region,json=clientRegion,proto3,oneof" json:"client_region,omitempty"`
 	ClientVersion         *int64                 `protobuf:"varint,9,opt,name=client_version,json=clientVersion,proto3,oneof" json:"client_version,omitempty"`
 	DeviceLocation        *string                `protobuf:"bytes,10,opt,name=device_location,json=deviceLocation,proto3,oneof" json:"device_location,omitempty"` //device_location uses geohash encoding
-	DeviceRegion          *string                `protobuf:"bytes,11,opt,name=device_region,json=deviceRegion,proto3,oneof" json:"device_region,omitempty"`       //LowCardinality
+	DeviceRegion          *string                `protobuf:"bytes,11,opt,name=device_region,json=deviceRegion,proto3,oneof" json:"device_region,omitempty"`
 	SessionId             *string                `protobuf:"bytes,12,opt,name=session_id,json=sessionId,proto3,oneof" json:"session_id,omitempty"`
-	SponsorId             *string                `protobuf:"bytes,13,opt,name=sponsor_id,json=sponsorId,proto3,oneof" json:"sponsor_id,omitempty"`                                    //LowCardinality
-	PropagationChannelId  *string                `protobuf:"bytes,14,opt,name=propagation_channel_id,json=propagationChannelId,proto3,oneof" json:"propagation_channel_id,omitempty"` //LowCardinality
-	AppliedTacticsTag     *string                `protobuf:"bytes,15,opt,name=applied_tactics_tag,json=appliedTacticsTag,proto3,oneof" json:"applied_tactics_tag,omitempty"`          //LowCardinality
-	EgressRegion          *string                `protobuf:"bytes,16,opt,name=egress_region,json=egressRegion,proto3,oneof" json:"egress_region,omitempty"`                           //LowCardinality
+	SponsorId             *string                `protobuf:"bytes,13,opt,name=sponsor_id,json=sponsorId,proto3,oneof" json:"sponsor_id,omitempty"`
+	PropagationChannelId  *string                `protobuf:"bytes,14,opt,name=propagation_channel_id,json=propagationChannelId,proto3,oneof" json:"propagation_channel_id,omitempty"`
+	AppliedTacticsTag     *string                `protobuf:"bytes,15,opt,name=applied_tactics_tag,json=appliedTacticsTag,proto3,oneof" json:"applied_tactics_tag,omitempty"`
+	EgressRegion          *string                `protobuf:"bytes,16,opt,name=egress_region,json=egressRegion,proto3,oneof" json:"egress_region,omitempty"`
 	LastConnected         *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=last_connected,json=lastConnected,proto3,oneof" json:"last_connected,omitempty"`
-	AuthorizedAccessTypes []string               `protobuf:"bytes,18,rep,name=authorized_access_types,json=authorizedAccessTypes,proto3" json:"authorized_access_types,omitempty"` //LowCardinality
+	AuthorizedAccessTypes []string               `protobuf:"bytes,18,rep,name=authorized_access_types,json=authorizedAccessTypes,proto3" json:"authorized_access_types,omitempty"`
 	unknownFields         protoimpl.UnknownFields
 	sizeCache             protoimpl.SizeCache
 }

+ 34 - 34
psiphon/server/pb/psiphond/dial_params.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/dial_params.proto
 
 package psiphond
@@ -27,20 +27,20 @@ type DialParams struct {
 	ConjureCached                     *bool                  `protobuf:"varint,1,opt,name=conjure_cached,json=conjureCached,proto3,oneof" json:"conjure_cached,omitempty"`
 	ConjureDelay                      *int64                 `protobuf:"varint,2,opt,name=conjure_delay,json=conjureDelay,proto3,oneof" json:"conjure_delay,omitempty"`
 	ConjureEmptyPacket                *bool                  `protobuf:"varint,3,opt,name=conjure_empty_packet,json=conjureEmptyPacket,proto3,oneof" json:"conjure_empty_packet,omitempty"`
-	ConjureNetwork                    *string                `protobuf:"bytes,4,opt,name=conjure_network,json=conjureNetwork,proto3,oneof" json:"conjure_network,omitempty"` //LowCardinality
+	ConjureNetwork                    *string                `protobuf:"bytes,4,opt,name=conjure_network,json=conjureNetwork,proto3,oneof" json:"conjure_network,omitempty"`
 	ConjurePortNumber                 *int64                 `protobuf:"varint,5,opt,name=conjure_port_number,json=conjurePortNumber,proto3,oneof" json:"conjure_port_number,omitempty"`
-	ConjurePrefix                     *string                `protobuf:"bytes,6,opt,name=conjure_prefix,json=conjurePrefix,proto3,oneof" json:"conjure_prefix,omitempty"`          //LowCardinality
-	ConjureStun                       *string                `protobuf:"bytes,7,opt,name=conjure_stun,json=conjureStun,proto3,oneof" json:"conjure_stun,omitempty"`                //LowCardinality
-	ConjureTransport                  *string                `protobuf:"bytes,8,opt,name=conjure_transport,json=conjureTransport,proto3,oneof" json:"conjure_transport,omitempty"` //LowCardinality
+	ConjurePrefix                     *string                `protobuf:"bytes,6,opt,name=conjure_prefix,json=conjurePrefix,proto3,oneof" json:"conjure_prefix,omitempty"`
+	ConjureStun                       *string                `protobuf:"bytes,7,opt,name=conjure_stun,json=conjureStun,proto3,oneof" json:"conjure_stun,omitempty"`
+	ConjureTransport                  *string                `protobuf:"bytes,8,opt,name=conjure_transport,json=conjureTransport,proto3,oneof" json:"conjure_transport,omitempty"`
 	MeekCookieSize                    *int64                 `protobuf:"varint,9,opt,name=meek_cookie_size,json=meekCookieSize,proto3,oneof" json:"meek_cookie_size,omitempty"`
 	MeekContentType                   *string                `protobuf:"bytes,10,opt,name=meek_content_type,json=meekContentType,proto3,oneof" json:"meek_content_type,omitempty"`
-	MeekCookieName                    *string                `protobuf:"bytes,11,opt,name=meek_cookie_name,json=meekCookieName,proto3,oneof" json:"meek_cookie_name,omitempty"`            //LowCardinality
-	MeekDialDomain                    *string                `protobuf:"bytes,12,opt,name=meek_dial_domain,json=meekDialDomain,proto3,oneof" json:"meek_dial_domain,omitempty"`            //LowCardinality
-	MeekDialIpAddress                 *string                `protobuf:"bytes,13,opt,name=meek_dial_ip_address,json=meekDialIpAddress,proto3,oneof" json:"meek_dial_ip_address,omitempty"` //LowCardinality
+	MeekCookieName                    *string                `protobuf:"bytes,11,opt,name=meek_cookie_name,json=meekCookieName,proto3,oneof" json:"meek_cookie_name,omitempty"`
+	MeekDialDomain                    *string                `protobuf:"bytes,12,opt,name=meek_dial_domain,json=meekDialDomain,proto3,oneof" json:"meek_dial_domain,omitempty"`
+	MeekDialIpAddress                 *string                `protobuf:"bytes,13,opt,name=meek_dial_ip_address,json=meekDialIpAddress,proto3,oneof" json:"meek_dial_ip_address,omitempty"`
 	MeekHostHeader                    *string                `protobuf:"bytes,14,opt,name=meek_host_header,json=meekHostHeader,proto3,oneof" json:"meek_host_header,omitempty"`
 	MeekLimitRequest                  *int64                 `protobuf:"varint,15,opt,name=meek_limit_request,json=meekLimitRequest,proto3,oneof" json:"meek_limit_request,omitempty"`
 	MeekRedialProbability             *int64                 `protobuf:"varint,16,opt,name=meek_redial_probability,json=meekRedialProbability,proto3,oneof" json:"meek_redial_probability,omitempty"`
-	MeekResolvedIpAddress             *string                `protobuf:"bytes,17,opt,name=meek_resolved_ip_address,json=meekResolvedIpAddress,proto3,oneof" json:"meek_resolved_ip_address,omitempty"` //LowCardinality
+	MeekResolvedIpAddress             *string                `protobuf:"bytes,17,opt,name=meek_resolved_ip_address,json=meekResolvedIpAddress,proto3,oneof" json:"meek_resolved_ip_address,omitempty"`
 	MeekSniServerName                 *string                `protobuf:"bytes,18,opt,name=meek_sni_server_name,json=meekSniServerName,proto3,oneof" json:"meek_sni_server_name,omitempty"`
 	MeekTlsPadding                    *int64                 `protobuf:"varint,19,opt,name=meek_tls_padding,json=meekTlsPadding,proto3,oneof" json:"meek_tls_padding,omitempty"`
 	MeekTransformedHostName           *bool                  `protobuf:"varint,20,opt,name=meek_transformed_host_name,json=meekTransformedHostName,proto3,oneof" json:"meek_transformed_host_name,omitempty"`
@@ -50,41 +50,41 @@ type DialParams struct {
 	QuicDisableClientPathMtuDiscovery *bool                  `protobuf:"varint,24,opt,name=quic_disable_client_path_mtu_discovery,json=quicDisableClientPathMtuDiscovery,proto3,oneof" json:"quic_disable_client_path_mtu_discovery,omitempty"`
 	QuicObfuscatedPsk                 *bool                  `protobuf:"varint,25,opt,name=quic_obfuscated_psk,json=quicObfuscatedPsk,proto3,oneof" json:"quic_obfuscated_psk,omitempty"`
 	QuicSentTicket                    *bool                  `protobuf:"varint,26,opt,name=quic_sent_ticket,json=quicSentTicket,proto3,oneof" json:"quic_sent_ticket,omitempty"`
-	QuicVersion                       *string                `protobuf:"bytes,27,opt,name=quic_version,json=quicVersion,proto3,oneof" json:"quic_version,omitempty"`                   //LowCardinality
-	ShadowsocksPrefix                 *string                `protobuf:"bytes,28,opt,name=shadowsocks_prefix,json=shadowsocksPrefix,proto3,oneof" json:"shadowsocks_prefix,omitempty"` //LowCardinality
+	QuicVersion                       *string                `protobuf:"bytes,27,opt,name=quic_version,json=quicVersion,proto3,oneof" json:"quic_version,omitempty"`
+	ShadowsocksPrefix                 *string                `protobuf:"bytes,28,opt,name=shadowsocks_prefix,json=shadowsocksPrefix,proto3,oneof" json:"shadowsocks_prefix,omitempty"`
 	TlsDidResume                      *bool                  `protobuf:"varint,29,opt,name=tls_did_resume,json=tlsDidResume,proto3,oneof" json:"tls_did_resume,omitempty"`
 	TlsFragmented                     *bool                  `protobuf:"varint,30,opt,name=tls_fragmented,json=tlsFragmented,proto3,oneof" json:"tls_fragmented,omitempty"`
 	TlsOsshSniServerName              *string                `protobuf:"bytes,31,opt,name=tls_ossh_sni_server_name,json=tlsOsshSniServerName,proto3,oneof" json:"tls_ossh_sni_server_name,omitempty"`
 	TlsOsshTransformedHostName        *bool                  `protobuf:"varint,32,opt,name=tls_ossh_transformed_host_name,json=tlsOsshTransformedHostName,proto3,oneof" json:"tls_ossh_transformed_host_name,omitempty"`
 	TlsPadding                        *int64                 `protobuf:"varint,33,opt,name=tls_padding,json=tlsPadding,proto3,oneof" json:"tls_padding,omitempty"`
-	TlsProfile                        *string                `protobuf:"bytes,34,opt,name=tls_profile,json=tlsProfile,proto3,oneof" json:"tls_profile,omitempty"` //LowCardinality
+	TlsProfile                        *string                `protobuf:"bytes,34,opt,name=tls_profile,json=tlsProfile,proto3,oneof" json:"tls_profile,omitempty"`
 	TlsSentTicket                     *bool                  `protobuf:"varint,35,opt,name=tls_sent_ticket,json=tlsSentTicket,proto3,oneof" json:"tls_sent_ticket,omitempty"`
-	TlsVersion                        *string                `protobuf:"bytes,36,opt,name=tls_version,json=tlsVersion,proto3,oneof" json:"tls_version,omitempty"`                        //LowCardinality
-	ServerEntryRegion                 *string                `protobuf:"bytes,37,opt,name=server_entry_region,json=serverEntryRegion,proto3,oneof" json:"server_entry_region,omitempty"` //LowCardinality
-	ServerEntrySource                 *string                `protobuf:"bytes,38,opt,name=server_entry_source,json=serverEntrySource,proto3,oneof" json:"server_entry_source,omitempty"` //LowCardinality
+	TlsVersion                        *string                `protobuf:"bytes,36,opt,name=tls_version,json=tlsVersion,proto3,oneof" json:"tls_version,omitempty"`
+	ServerEntryRegion                 *string                `protobuf:"bytes,37,opt,name=server_entry_region,json=serverEntryRegion,proto3,oneof" json:"server_entry_region,omitempty"`
+	ServerEntrySource                 *string                `protobuf:"bytes,38,opt,name=server_entry_source,json=serverEntrySource,proto3,oneof" json:"server_entry_source,omitempty"`
 	ServerEntryTag                    *string                `protobuf:"bytes,39,opt,name=server_entry_tag,json=serverEntryTag,proto3,oneof" json:"server_entry_tag,omitempty"`
 	ServerEntryTimestamp              *timestamppb.Timestamp `protobuf:"bytes,40,opt,name=server_entry_timestamp,json=serverEntryTimestamp,proto3,oneof" json:"server_entry_timestamp,omitempty"`
-	ServerPacketManipulation          *string                `protobuf:"bytes,41,opt,name=server_packet_manipulation,json=serverPacketManipulation,proto3,oneof" json:"server_packet_manipulation,omitempty"`                      //LowCardinality
-	ServerReplayFragmentation         *bool                  `protobuf:"varint,42,opt,name=server_replay_fragmentation,json=serverReplayFragmentation,proto3,oneof" json:"server_replay_fragmentation,omitempty"`                  //LowCardinality
-	ServerReplayPacketManipulation    *bool                  `protobuf:"varint,43,opt,name=server_replay_packet_manipulation,json=serverReplayPacketManipulation,proto3,oneof" json:"server_replay_packet_manipulation,omitempty"` //LowCardinality
+	ServerPacketManipulation          *string                `protobuf:"bytes,41,opt,name=server_packet_manipulation,json=serverPacketManipulation,proto3,oneof" json:"server_packet_manipulation,omitempty"`
+	ServerReplayFragmentation         *bool                  `protobuf:"varint,42,opt,name=server_replay_fragmentation,json=serverReplayFragmentation,proto3,oneof" json:"server_replay_fragmentation,omitempty"`
+	ServerReplayPacketManipulation    *bool                  `protobuf:"varint,43,opt,name=server_replay_packet_manipulation,json=serverReplayPacketManipulation,proto3,oneof" json:"server_replay_packet_manipulation,omitempty"`
 	ServerEntryValid                  *bool                  `protobuf:"varint,44,opt,name=server_entry_valid,json=serverEntryValid,proto3,oneof" json:"server_entry_valid,omitempty"`
 	CandidateNumber                   *int32                 `protobuf:"varint,45,opt,name=candidate_number,json=candidateNumber,proto3,oneof" json:"candidate_number,omitempty"`
 	IsReplay                          *bool                  `protobuf:"varint,46,opt,name=is_replay,json=isReplay,proto3,oneof" json:"is_replay,omitempty"`
 	DialPortNumber                    *int64                 `protobuf:"varint,47,opt,name=dial_port_number,json=dialPortNumber,proto3,oneof" json:"dial_port_number,omitempty"`
 	DialDuration                      *int64                 `protobuf:"varint,48,opt,name=dial_duration,json=dialDuration,proto3,oneof" json:"dial_duration,omitempty"`
-	FrontingProviderId                *string                `protobuf:"bytes,49,opt,name=fronting_provider_id,json=frontingProviderId,proto3,oneof" json:"fronting_provider_id,omitempty"` //LowCardinality
-	NetworkType                       *string                `protobuf:"bytes,50,opt,name=network_type,json=networkType,proto3,oneof" json:"network_type,omitempty"`                        //LowCardinality
-	RelayProtocol                     *string                `protobuf:"bytes,51,opt,name=relay_protocol,json=relayProtocol,proto3,oneof" json:"relay_protocol,omitempty"`                  //LowCardinality
-	SshClientVersion                  *string                `protobuf:"bytes,52,opt,name=ssh_client_version,json=sshClientVersion,proto3,oneof" json:"ssh_client_version,omitempty"`       //LowCardinality
-	OsshPrefix                        *string                `protobuf:"bytes,53,opt,name=ossh_prefix,json=osshPrefix,proto3,oneof" json:"ossh_prefix,omitempty"`                           //LowCardinality
+	FrontingProviderId                *string                `protobuf:"bytes,49,opt,name=fronting_provider_id,json=frontingProviderId,proto3,oneof" json:"fronting_provider_id,omitempty"`
+	NetworkType                       *string                `protobuf:"bytes,50,opt,name=network_type,json=networkType,proto3,oneof" json:"network_type,omitempty"`
+	RelayProtocol                     *string                `protobuf:"bytes,51,opt,name=relay_protocol,json=relayProtocol,proto3,oneof" json:"relay_protocol,omitempty"`
+	SshClientVersion                  *string                `protobuf:"bytes,52,opt,name=ssh_client_version,json=sshClientVersion,proto3,oneof" json:"ssh_client_version,omitempty"`
+	OsshPrefix                        *string                `protobuf:"bytes,53,opt,name=ossh_prefix,json=osshPrefix,proto3,oneof" json:"ossh_prefix,omitempty"`
 	UserAgent                         *string                `protobuf:"bytes,54,opt,name=user_agent,json=userAgent,proto3,oneof" json:"user_agent,omitempty"`
-	HttpTransform                     *string                `protobuf:"bytes,55,opt,name=http_transform,json=httpTransform,proto3,oneof" json:"http_transform,omitempty"` //LowCardinality
+	HttpTransform                     *string                `protobuf:"bytes,55,opt,name=http_transform,json=httpTransform,proto3,oneof" json:"http_transform,omitempty"`
 	DnsAttempt                        *int64                 `protobuf:"varint,56,opt,name=dns_attempt,json=dnsAttempt,proto3,oneof" json:"dns_attempt,omitempty"`
-	DnsPreferred                      *string                `protobuf:"bytes,57,opt,name=dns_preferred,json=dnsPreferred,proto3,oneof" json:"dns_preferred,omitempty"`       //LowCardinality
-	DnsPreresolved                    *string                `protobuf:"bytes,58,opt,name=dns_preresolved,json=dnsPreresolved,proto3,oneof" json:"dns_preresolved,omitempty"` //LowCardinality
+	DnsPreferred                      *string                `protobuf:"bytes,57,opt,name=dns_preferred,json=dnsPreferred,proto3,oneof" json:"dns_preferred,omitempty"`
+	DnsPreresolved                    *string                `protobuf:"bytes,58,opt,name=dns_preresolved,json=dnsPreresolved,proto3,oneof" json:"dns_preresolved,omitempty"`
 	DnsQnameMismatches                *int64                 `protobuf:"varint,59,opt,name=dns_qname_mismatches,json=dnsQnameMismatches,proto3,oneof" json:"dns_qname_mismatches,omitempty"`
 	DnsQnameRandomCasing              *bool                  `protobuf:"varint,60,opt,name=dns_qname_random_casing,json=dnsQnameRandomCasing,proto3,oneof" json:"dns_qname_random_casing,omitempty"`
-	DnsTransform                      *string                `protobuf:"bytes,61,opt,name=dns_transform,json=dnsTransform,proto3,oneof" json:"dns_transform,omitempty"` //LowCardinality
+	DnsTransform                      *string                `protobuf:"bytes,61,opt,name=dns_transform,json=dnsTransform,proto3,oneof" json:"dns_transform,omitempty"`
 	DownstreamBytesFragmented         *int64                 `protobuf:"varint,62,opt,name=downstream_bytes_fragmented,json=downstreamBytesFragmented,proto3,oneof" json:"downstream_bytes_fragmented,omitempty"`
 	DownstreamMaxBytesWritten         *int64                 `protobuf:"varint,63,opt,name=downstream_max_bytes_written,json=downstreamMaxBytesWritten,proto3,oneof" json:"downstream_max_bytes_written,omitempty"`
 	DownstreamMaxDelayed              *int64                 `protobuf:"varint,64,opt,name=downstream_max_delayed,json=downstreamMaxDelayed,proto3,oneof" json:"downstream_max_delayed,omitempty"`
@@ -97,16 +97,16 @@ type DialParams struct {
 	UpstreamMinBytesWritten           *int64                 `protobuf:"varint,71,opt,name=upstream_min_bytes_written,json=upstreamMinBytesWritten,proto3,oneof" json:"upstream_min_bytes_written,omitempty"`
 	UpstreamMinDelayed                *int64                 `protobuf:"varint,72,opt,name=upstream_min_delayed,json=upstreamMinDelayed,proto3,oneof" json:"upstream_min_delayed,omitempty"`
 	UpstreamOsshPadding               *int64                 `protobuf:"varint,73,opt,name=upstream_ossh_padding,json=upstreamOsshPadding,proto3,oneof" json:"upstream_ossh_padding,omitempty"`
-	UpstreamProxyCustomHeaderNames    []string               `protobuf:"bytes,74,rep,name=upstream_proxy_custom_header_names,json=upstreamProxyCustomHeaderNames,proto3" json:"upstream_proxy_custom_header_names,omitempty"` //LowCardinality
-	UpstreamProxyType                 *string                `protobuf:"bytes,75,opt,name=upstream_proxy_type,json=upstreamProxyType,proto3,oneof" json:"upstream_proxy_type,omitempty"`                                      //LowCardinality
-	PassthroughAddress                *string                `protobuf:"bytes,76,opt,name=passthrough_address,json=passthroughAddress,proto3,oneof" json:"passthrough_address,omitempty"`                                     //LowCardinality
+	UpstreamProxyCustomHeaderNames    []string               `protobuf:"bytes,74,rep,name=upstream_proxy_custom_header_names,json=upstreamProxyCustomHeaderNames,proto3" json:"upstream_proxy_custom_header_names,omitempty"`
+	UpstreamProxyType                 *string                `protobuf:"bytes,75,opt,name=upstream_proxy_type,json=upstreamProxyType,proto3,oneof" json:"upstream_proxy_type,omitempty"`
+	PassthroughAddress                *string                `protobuf:"bytes,76,opt,name=passthrough_address,json=passthroughAddress,proto3,oneof" json:"passthrough_address,omitempty"`
 	PadResponse                       *int64                 `protobuf:"varint,77,opt,name=pad_response,json=padResponse,proto3,oneof" json:"pad_response,omitempty"`
 	Padding                           *int64                 `protobuf:"varint,78,opt,name=padding,proto3,oneof" json:"padding,omitempty"`
-	ClientBpf                         *string                `protobuf:"bytes,79,opt,name=client_bpf,json=clientBpf,proto3,oneof" json:"client_bpf,omitempty"` //LowCardinality
-	ServerBpf                         *string                `protobuf:"bytes,80,opt,name=server_bpf,json=serverBpf,proto3,oneof" json:"server_bpf,omitempty"` //LowCardinality
+	ClientBpf                         *string                `protobuf:"bytes,79,opt,name=client_bpf,json=clientBpf,proto3,oneof" json:"client_bpf,omitempty"`
+	ServerBpf                         *string                `protobuf:"bytes,80,opt,name=server_bpf,json=serverBpf,proto3,oneof" json:"server_bpf,omitempty"`
 	EstablishedTunnelsCount           *int64                 `protobuf:"varint,81,opt,name=established_tunnels_count,json=establishedTunnelsCount,proto3,oneof" json:"established_tunnels_count,omitempty"`
 	NetworkLatencyMultiplier          *float64               `protobuf:"fixed64,82,opt,name=network_latency_multiplier,json=networkLatencyMultiplier,proto3,oneof" json:"network_latency_multiplier,omitempty"`
-	SeedTransform                     *string                `protobuf:"bytes,83,opt,name=seed_transform,json=seedTransform,proto3,oneof" json:"seed_transform,omitempty"` //LowCardinality
+	SeedTransform                     *string                `protobuf:"bytes,83,opt,name=seed_transform,json=seedTransform,proto3,oneof" json:"seed_transform,omitempty"`
 	unknownFields                     protoimpl.UnknownFields
 	sizeCache                         protoimpl.SizeCache
 }

+ 3 - 3
psiphon/server/pb/psiphond/domain_bytes.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/domain_bytes.proto
 
 package psiphond
@@ -25,7 +25,7 @@ type DomainBytes struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	BaseParams    *BaseParams            `protobuf:"bytes,1,opt,name=base_params,json=baseParams,proto3,oneof" json:"base_params,omitempty"`
 	Bytes         *int64                 `protobuf:"varint,100,opt,name=bytes,proto3,oneof" json:"bytes,omitempty"`
-	Domain        *string                `protobuf:"bytes,101,opt,name=domain,proto3,oneof" json:"domain,omitempty"` //LowCardinality
+	Domain        *string                `protobuf:"bytes,101,opt,name=domain,proto3,oneof" json:"domain,omitempty"`
 	unknownFields protoimpl.UnknownFields
 	sizeCache     protoimpl.SizeCache
 }

+ 3 - 3
psiphon/server/pb/psiphond/failed_tunnel.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/failed_tunnel.proto
 
 package psiphond
@@ -35,7 +35,7 @@ type FailedTunnel struct {
 	LivenessTestSentUpstreamBytes       *int64                 `protobuf:"varint,105,opt,name=liveness_test_sent_upstream_bytes,json=livenessTestSentUpstreamBytes,proto3,oneof" json:"liveness_test_sent_upstream_bytes,omitempty"`
 	LivenessTestUpstreamBytes           *int64                 `protobuf:"varint,106,opt,name=liveness_test_upstream_bytes,json=livenessTestUpstreamBytes,proto3,oneof" json:"liveness_test_upstream_bytes,omitempty"`
 	RecordProbability                   *float64               `protobuf:"fixed64,107,opt,name=record_probability,json=recordProbability,proto3,oneof" json:"record_probability,omitempty"`
-	TunnelError                         *string                `protobuf:"bytes,108,opt,name=tunnel_error,json=tunnelError,proto3,oneof" json:"tunnel_error,omitempty"` //LowCardinality
+	TunnelError                         *string                `protobuf:"bytes,108,opt,name=tunnel_error,json=tunnelError,proto3,oneof" json:"tunnel_error,omitempty"`
 	unknownFields                       protoimpl.UnknownFields
 	sizeCache                           protoimpl.SizeCache
 }

+ 20 - 20
psiphon/server/pb/psiphond/inproxy_broker.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/inproxy_broker.proto
 
 package psiphond
@@ -26,43 +26,43 @@ type InproxyBroker struct {
 	BaseParams                    *BaseParams            `protobuf:"bytes,1,opt,name=base_params,json=baseParams,proto3,oneof" json:"base_params,omitempty"`
 	AnnouncementMatchIndex        *int32                 `protobuf:"varint,100,opt,name=announcement_match_index,json=announcementMatchIndex,proto3,oneof" json:"announcement_match_index,omitempty"`
 	AnnouncementQueueSize         *int32                 `protobuf:"varint,101,opt,name=announcement_queue_size,json=announcementQueueSize,proto3,oneof" json:"announcement_queue_size,omitempty"`
-	AnswerError                   *string                `protobuf:"bytes,102,opt,name=answer_error,json=answerError,proto3,oneof" json:"answer_error,omitempty"` //LowCardinality
-	BrokerEvent                   *string                `protobuf:"bytes,103,opt,name=broker_event,json=brokerEvent,proto3,oneof" json:"broker_event,omitempty"` //LowCardinality
-	BrokerId                      *string                `protobuf:"bytes,104,opt,name=broker_id,json=brokerId,proto3,oneof" json:"broker_id,omitempty"`          //LowCardinality
+	AnswerError                   *string                `protobuf:"bytes,102,opt,name=answer_error,json=answerError,proto3,oneof" json:"answer_error,omitempty"`
+	BrokerEvent                   *string                `protobuf:"bytes,103,opt,name=broker_event,json=brokerEvent,proto3,oneof" json:"broker_event,omitempty"`
+	BrokerId                      *string                `protobuf:"bytes,104,opt,name=broker_id,json=brokerId,proto3,oneof" json:"broker_id,omitempty"`
 	ConnectedClients              *int64                 `protobuf:"varint,105,opt,name=connected_clients,json=connectedClients,proto3,oneof" json:"connected_clients,omitempty"`
 	ConnectingClients             *int64                 `protobuf:"varint,106,opt,name=connecting_clients,json=connectingClients,proto3,oneof" json:"connecting_clients,omitempty"`
 	ConnectionId                  *string                `protobuf:"bytes,107,opt,name=connection_id,json=connectionId,proto3,oneof" json:"connection_id,omitempty"`
-	DestinationServerId           *string                `protobuf:"bytes,108,opt,name=destination_server_id,json=destinationServerId,proto3,oneof" json:"destination_server_id,omitempty"` //LowCardinality
+	DestinationServerId           *string                `protobuf:"bytes,108,opt,name=destination_server_id,json=destinationServerId,proto3,oneof" json:"destination_server_id,omitempty"`
 	ElapsedTime                   *int64                 `protobuf:"varint,109,opt,name=elapsed_time,json=elapsedTime,proto3,oneof" json:"elapsed_time,omitempty"`
-	Error                         *string                `protobuf:"bytes,110,opt,name=error,proto3,oneof" json:"error,omitempty"`                                                          //LowCardinality
-	FilteredIceCandidates         []string               `protobuf:"bytes,111,rep,name=filtered_ice_candidates,json=filteredIceCandidates,proto3" json:"filtered_ice_candidates,omitempty"` //LowCardinality
-	FrontingProviderId            *string                `protobuf:"bytes,112,opt,name=fronting_provider_id,json=frontingProviderId,proto3,oneof" json:"fronting_provider_id,omitempty"`    //LowCardinality
+	Error                         *string                `protobuf:"bytes,110,opt,name=error,proto3,oneof" json:"error,omitempty"`
+	FilteredIceCandidates         []string               `protobuf:"bytes,111,rep,name=filtered_ice_candidates,json=filteredIceCandidates,proto3" json:"filtered_ice_candidates,omitempty"`
+	FrontingProviderId            *string                `protobuf:"bytes,112,opt,name=fronting_provider_id,json=frontingProviderId,proto3,oneof" json:"fronting_provider_id,omitempty"`
 	Has_IPv6                      *bool                  `protobuf:"varint,113,opt,name=has_IPv6,json=hasIPv6,proto3,oneof" json:"has_IPv6,omitempty"`
 	HasCommonCompartmentIds       *bool                  `protobuf:"varint,114,opt,name=has_common_compartment_ids,json=hasCommonCompartmentIds,proto3,oneof" json:"has_common_compartment_ids,omitempty"`
 	HasPersonalCompartmentIds     *bool                  `protobuf:"varint,115,opt,name=has_personal_compartment_ids,json=hasPersonalCompartmentIds,proto3,oneof" json:"has_personal_compartment_ids,omitempty"`
 	HasPrivate_IP                 *bool                  `protobuf:"varint,116,opt,name=has_private_IP,json=hasPrivateIP,proto3,oneof" json:"has_private_IP,omitempty"`
-	IceCandidateTypes             []string               `protobuf:"bytes,117,rep,name=ice_candidate_types,json=iceCandidateTypes,proto3" json:"ice_candidate_types,omitempty"` //LowCardinality
+	IceCandidateTypes             []string               `protobuf:"bytes,117,rep,name=ice_candidate_types,json=iceCandidateTypes,proto3" json:"ice_candidate_types,omitempty"`
 	IsPriority                    *bool                  `protobuf:"varint,118,opt,name=is_priority,json=isPriority,proto3,oneof" json:"is_priority,omitempty"`
 	LimitDownstreamBytesPerSecond *int64                 `protobuf:"varint,119,opt,name=limit_downstream_bytes_per_second,json=limitDownstreamBytesPerSecond,proto3,oneof" json:"limit_downstream_bytes_per_second,omitempty"`
 	LimitUpstreamBytesPerSecond   *int64                 `protobuf:"varint,120,opt,name=limit_upstream_bytes_per_second,json=limitUpstreamBytesPerSecond,proto3,oneof" json:"limit_upstream_bytes_per_second,omitempty"`
 	MaxClients                    *int64                 `protobuf:"varint,121,opt,name=max_clients,json=maxClients,proto3,oneof" json:"max_clients,omitempty"`
-	NatType                       *string                `protobuf:"bytes,122,opt,name=nat_type,json=natType,proto3,oneof" json:"nat_type,omitempty"`                     //LowCardinality
-	NetworkType                   *string                `protobuf:"bytes,123,opt,name=network_type,json=networkType,proto3,oneof" json:"network_type,omitempty"`         //LowCardinality
-	NewTacticsTag                 *string                `protobuf:"bytes,124,opt,name=new_tactics_tag,json=newTacticsTag,proto3,oneof" json:"new_tactics_tag,omitempty"` //LowCardinality
+	NatType                       *string                `protobuf:"bytes,122,opt,name=nat_type,json=natType,proto3,oneof" json:"nat_type,omitempty"`
+	NetworkType                   *string                `protobuf:"bytes,123,opt,name=network_type,json=networkType,proto3,oneof" json:"network_type,omitempty"`
+	NewTacticsTag                 *string                `protobuf:"bytes,124,opt,name=new_tactics_tag,json=newTacticsTag,proto3,oneof" json:"new_tactics_tag,omitempty"`
 	OfferMatchIndex               *int64                 `protobuf:"varint,125,opt,name=offer_match_index,json=offerMatchIndex,proto3,oneof" json:"offer_match_index,omitempty"`
 	OfferQueueSize                *int64                 `protobuf:"varint,126,opt,name=offer_queue_size,json=offerQueueSize,proto3,oneof" json:"offer_queue_size,omitempty"`
 	PeakDownstreamBytesPerSecond  *int64                 `protobuf:"varint,127,opt,name=peak_downstream_bytes_per_second,json=peakDownstreamBytesPerSecond,proto3,oneof" json:"peak_downstream_bytes_per_second,omitempty"`
 	PeakUpstreamBytesPerSecond    *int64                 `protobuf:"varint,128,opt,name=peak_upstream_bytes_per_second,json=peakUpstreamBytesPerSecond,proto3,oneof" json:"peak_upstream_bytes_per_second,omitempty"`
-	PortMappingTypes              []string               `protobuf:"bytes,129,rep,name=port_mapping_types,json=portMappingTypes,proto3" json:"port_mapping_types,omitempty"` //LowCardinality
+	PortMappingTypes              []string               `protobuf:"bytes,129,rep,name=port_mapping_types,json=portMappingTypes,proto3" json:"port_mapping_types,omitempty"`
 	PreferredNatMatch             *bool                  `protobuf:"varint,130,opt,name=preferred_nat_match,json=preferredNatMatch,proto3,oneof" json:"preferred_nat_match,omitempty"`
 	ProtocolVersion               *int32                 `protobuf:"varint,131,opt,name=protocol_version,json=protocolVersion,proto3,oneof" json:"protocol_version,omitempty"`
-	ProxyId                       *string                `protobuf:"bytes,132,opt,name=proxy_id,json=proxyId,proto3,oneof" json:"proxy_id,omitempty"`                                         //LowCardinality
-	ProxyNatType                  *string                `protobuf:"bytes,133,opt,name=proxy_nat_type,json=proxyNatType,proto3,oneof" json:"proxy_nat_type,omitempty"`                        //LowCardinality
-	ProxyPortMappingTypes         []string               `protobuf:"bytes,134,rep,name=proxy_port_mapping_types,json=proxyPortMappingTypes,proto3" json:"proxy_port_mapping_types,omitempty"` //LowCardinality
-	ServerId                      *string                `protobuf:"bytes,135,opt,name=server_id,json=serverId,proto3,oneof" json:"server_id,omitempty"`                                      //LowCardinality
-	StoredTacticsTag              *string                `protobuf:"bytes,136,opt,name=stored_tactics_tag,json=storedTacticsTag,proto3,oneof" json:"stored_tactics_tag,omitempty"`            //LowCardinality
+	ProxyId                       *string                `protobuf:"bytes,132,opt,name=proxy_id,json=proxyId,proto3,oneof" json:"proxy_id,omitempty"`
+	ProxyNatType                  *string                `protobuf:"bytes,133,opt,name=proxy_nat_type,json=proxyNatType,proto3,oneof" json:"proxy_nat_type,omitempty"`
+	ProxyPortMappingTypes         []string               `protobuf:"bytes,134,rep,name=proxy_port_mapping_types,json=proxyPortMappingTypes,proto3" json:"proxy_port_mapping_types,omitempty"`
+	ServerId                      *string                `protobuf:"bytes,135,opt,name=server_id,json=serverId,proto3,oneof" json:"server_id,omitempty"`
+	StoredTacticsTag              *string                `protobuf:"bytes,136,opt,name=stored_tactics_tag,json=storedTacticsTag,proto3,oneof" json:"stored_tactics_tag,omitempty"`
 	TimedOut                      *bool                  `protobuf:"varint,137,opt,name=timed_out,json=timedOut,proto3,oneof" json:"timed_out,omitempty"`
-	MeekServerHttpVersion         *string                `protobuf:"bytes,138,opt,name=meek_server_http_version,json=meekServerHttpVersion,proto3,oneof" json:"meek_server_http_version,omitempty"` //LowCardinality
+	MeekServerHttpVersion         *string                `protobuf:"bytes,138,opt,name=meek_server_http_version,json=meekServerHttpVersion,proto3,oneof" json:"meek_server_http_version,omitempty"`
 	unknownFields                 protoimpl.UnknownFields
 	sizeCache                     protoimpl.SizeCache
 }

+ 48 - 48
psiphon/server/pb/psiphond/inproxy_dial_params.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/inproxy_dial_params.proto
 
 package psiphond
@@ -23,95 +23,95 @@ const (
 
 type InproxyDialParams struct {
 	state                                            protoimpl.MessageState `protogen:"open.v1"`
-	InproxyBrokerClientBpf                           *string                `protobuf:"bytes,1,opt,name=inproxy_broker_client_bpf,json=inproxyBrokerClientBpf,proto3,oneof" json:"inproxy_broker_client_bpf,omitempty"`       //LowCardinality
-	InproxyBrokerDialAddress                         *string                `protobuf:"bytes,2,opt,name=inproxy_broker_dial_address,json=inproxyBrokerDialAddress,proto3,oneof" json:"inproxy_broker_dial_address,omitempty"` //LowCardinality
+	InproxyBrokerClientBpf                           *string                `protobuf:"bytes,1,opt,name=inproxy_broker_client_bpf,json=inproxyBrokerClientBpf,proto3,oneof" json:"inproxy_broker_client_bpf,omitempty"`
+	InproxyBrokerDialAddress                         *string                `protobuf:"bytes,2,opt,name=inproxy_broker_dial_address,json=inproxyBrokerDialAddress,proto3,oneof" json:"inproxy_broker_dial_address,omitempty"`
 	InproxyBrokerDnsAttempt                          *int64                 `protobuf:"varint,3,opt,name=inproxy_broker_dns_attempt,json=inproxyBrokerDnsAttempt,proto3,oneof" json:"inproxy_broker_dns_attempt,omitempty"`
-	InproxyBrokerDnsPreferred                        *string                `protobuf:"bytes,4,opt,name=inproxy_broker_dns_preferred,json=inproxyBrokerDnsPreferred,proto3,oneof" json:"inproxy_broker_dns_preferred,omitempty"`       //LowCardinality
-	InproxyBrokerDnsPreresolved                      *string                `protobuf:"bytes,5,opt,name=inproxy_broker_dns_preresolved,json=inproxyBrokerDnsPreresolved,proto3,oneof" json:"inproxy_broker_dns_preresolved,omitempty"` //LowCardinality
+	InproxyBrokerDnsPreferred                        *string                `protobuf:"bytes,4,opt,name=inproxy_broker_dns_preferred,json=inproxyBrokerDnsPreferred,proto3,oneof" json:"inproxy_broker_dns_preferred,omitempty"`
+	InproxyBrokerDnsPreresolved                      *string                `protobuf:"bytes,5,opt,name=inproxy_broker_dns_preresolved,json=inproxyBrokerDnsPreresolved,proto3,oneof" json:"inproxy_broker_dns_preresolved,omitempty"`
 	InproxyBrokerDnsQnameMismatches                  *int64                 `protobuf:"varint,6,opt,name=inproxy_broker_dns_qname_mismatches,json=inproxyBrokerDnsQnameMismatches,proto3,oneof" json:"inproxy_broker_dns_qname_mismatches,omitempty"`
 	InproxyBrokerDnsQnameMustMatch                   *bool                  `protobuf:"varint,7,opt,name=inproxy_broker_dns_qname_must_match,json=inproxyBrokerDnsQnameMustMatch,proto3,oneof" json:"inproxy_broker_dns_qname_must_match,omitempty"`
 	InproxyBrokerDnsQnameRandomCasing                *bool                  `protobuf:"varint,8,opt,name=inproxy_broker_dns_qname_random_casing,json=inproxyBrokerDnsQnameRandomCasing,proto3,oneof" json:"inproxy_broker_dns_qname_random_casing,omitempty"`
-	InproxyBrokerDnsTransform                        *string                `protobuf:"bytes,9,opt,name=inproxy_broker_dns_transform,json=inproxyBrokerDnsTransform,proto3,oneof" json:"inproxy_broker_dns_transform,omitempty"` //LowCardinality
+	InproxyBrokerDnsTransform                        *string                `protobuf:"bytes,9,opt,name=inproxy_broker_dns_transform,json=inproxyBrokerDnsTransform,proto3,oneof" json:"inproxy_broker_dns_transform,omitempty"`
 	InproxyBrokerDownstreamBytesFragmented           *int64                 `protobuf:"varint,10,opt,name=inproxy_broker_downstream_bytes_fragmented,json=inproxyBrokerDownstreamBytesFragmented,proto3,oneof" json:"inproxy_broker_downstream_bytes_fragmented,omitempty"`
-	InproxyBrokerFrontingProviderId                  *string                `protobuf:"bytes,11,opt,name=inproxy_broker_fronting_provider_id,json=inproxyBrokerFrontingProviderId,proto3,oneof" json:"inproxy_broker_fronting_provider_id,omitempty"` //LowCardinality
-	InproxyBrokerHostHeader                          *string                `protobuf:"bytes,12,opt,name=inproxy_broker_host_header,json=inproxyBrokerHostHeader,proto3,oneof" json:"inproxy_broker_host_header,omitempty"`                           //LowCardinality
-	InproxyBrokerHttpTransform                       *string                `protobuf:"bytes,13,opt,name=inproxy_broker_http_transform,json=inproxyBrokerHttpTransform,proto3,oneof" json:"inproxy_broker_http_transform,omitempty"`                  //LowCardinality
-	InproxyBrokerId                                  *string                `protobuf:"bytes,14,opt,name=inproxy_broker_id,json=inproxyBrokerId,proto3,oneof" json:"inproxy_broker_id,omitempty"`                                                     //LowCardinality
+	InproxyBrokerFrontingProviderId                  *string                `protobuf:"bytes,11,opt,name=inproxy_broker_fronting_provider_id,json=inproxyBrokerFrontingProviderId,proto3,oneof" json:"inproxy_broker_fronting_provider_id,omitempty"`
+	InproxyBrokerHostHeader                          *string                `protobuf:"bytes,12,opt,name=inproxy_broker_host_header,json=inproxyBrokerHostHeader,proto3,oneof" json:"inproxy_broker_host_header,omitempty"`
+	InproxyBrokerHttpTransform                       *string                `protobuf:"bytes,13,opt,name=inproxy_broker_http_transform,json=inproxyBrokerHttpTransform,proto3,oneof" json:"inproxy_broker_http_transform,omitempty"`
+	InproxyBrokerId                                  *string                `protobuf:"bytes,14,opt,name=inproxy_broker_id,json=inproxyBrokerId,proto3,oneof" json:"inproxy_broker_id,omitempty"`
 	InproxyBrokerIsReplay                            *bool                  `protobuf:"varint,15,opt,name=inproxy_broker_is_replay,json=inproxyBrokerIsReplay,proto3,oneof" json:"inproxy_broker_is_replay,omitempty"`
 	InproxyBrokerIsReuse                             *bool                  `protobuf:"varint,16,opt,name=inproxy_broker_is_reuse,json=inproxyBrokerIsReuse,proto3,oneof" json:"inproxy_broker_is_reuse,omitempty"`
-	InproxyBrokerResolvedIpAddress                   *string                `protobuf:"bytes,17,opt,name=inproxy_broker_resolved_ip_address,json=inproxyBrokerResolvedIpAddress,proto3,oneof" json:"inproxy_broker_resolved_ip_address,omitempty"` //LowCardinality
-	InproxyBrokerSniServerName                       *string                `protobuf:"bytes,18,opt,name=inproxy_broker_sni_server_name,json=inproxyBrokerSniServerName,proto3,oneof" json:"inproxy_broker_sni_server_name,omitempty"`             //LowCardinality
+	InproxyBrokerResolvedIpAddress                   *string                `protobuf:"bytes,17,opt,name=inproxy_broker_resolved_ip_address,json=inproxyBrokerResolvedIpAddress,proto3,oneof" json:"inproxy_broker_resolved_ip_address,omitempty"`
+	InproxyBrokerSniServerName                       *string                `protobuf:"bytes,18,opt,name=inproxy_broker_sni_server_name,json=inproxyBrokerSniServerName,proto3,oneof" json:"inproxy_broker_sni_server_name,omitempty"`
 	InproxyBrokerTlsFragmented                       *bool                  `protobuf:"varint,19,opt,name=inproxy_broker_tls_fragmented,json=inproxyBrokerTlsFragmented,proto3,oneof" json:"inproxy_broker_tls_fragmented,omitempty"`
-	InproxyBrokerTlsProfile                          *string                `protobuf:"bytes,20,opt,name=inproxy_broker_tls_profile,json=inproxyBrokerTlsProfile,proto3,oneof" json:"inproxy_broker_tls_profile,omitempty"` //LowCardinality
-	InproxyBrokerTlsVersion                          *string                `protobuf:"bytes,21,opt,name=inproxy_broker_tls_version,json=inproxyBrokerTlsVersion,proto3,oneof" json:"inproxy_broker_tls_version,omitempty"` //LowCardinality
+	InproxyBrokerTlsProfile                          *string                `protobuf:"bytes,20,opt,name=inproxy_broker_tls_profile,json=inproxyBrokerTlsProfile,proto3,oneof" json:"inproxy_broker_tls_profile,omitempty"`
+	InproxyBrokerTlsVersion                          *string                `protobuf:"bytes,21,opt,name=inproxy_broker_tls_version,json=inproxyBrokerTlsVersion,proto3,oneof" json:"inproxy_broker_tls_version,omitempty"`
 	InproxyBrokerTransformedHostName                 *bool                  `protobuf:"varint,22,opt,name=inproxy_broker_transformed_host_name,json=inproxyBrokerTransformedHostName,proto3,oneof" json:"inproxy_broker_transformed_host_name,omitempty"`
-	InproxyBrokerTransport                           *string                `protobuf:"bytes,23,opt,name=inproxy_broker_transport,json=inproxyBrokerTransport,proto3,oneof" json:"inproxy_broker_transport,omitempty"` //LowCardinality
+	InproxyBrokerTransport                           *string                `protobuf:"bytes,23,opt,name=inproxy_broker_transport,json=inproxyBrokerTransport,proto3,oneof" json:"inproxy_broker_transport,omitempty"`
 	InproxyBrokerUpstreamBytesFragmented             *int64                 `protobuf:"varint,24,opt,name=inproxy_broker_upstream_bytes_fragmented,json=inproxyBrokerUpstreamBytesFragmented,proto3,oneof" json:"inproxy_broker_upstream_bytes_fragmented,omitempty"`
-	InproxyBrokerUserAgent                           *string                `protobuf:"bytes,25,opt,name=inproxy_broker_user_agent,json=inproxyBrokerUserAgent,proto3,oneof" json:"inproxy_broker_user_agent,omitempty"`                  //LowCardinality
-	InproxyClientNatType                             *string                `protobuf:"bytes,26,opt,name=inproxy_client_nat_type,json=inproxyClientNatType,proto3,oneof" json:"inproxy_client_nat_type,omitempty"`                        //LowCardinality
-	InproxyClientPortMappingTypes                    []string               `protobuf:"bytes,27,rep,name=inproxy_client_port_mapping_types,json=inproxyClientPortMappingTypes,proto3" json:"inproxy_client_port_mapping_types,omitempty"` //LowCardinality
+	InproxyBrokerUserAgent                           *string                `protobuf:"bytes,25,opt,name=inproxy_broker_user_agent,json=inproxyBrokerUserAgent,proto3,oneof" json:"inproxy_broker_user_agent,omitempty"`
+	InproxyClientNatType                             *string                `protobuf:"bytes,26,opt,name=inproxy_client_nat_type,json=inproxyClientNatType,proto3,oneof" json:"inproxy_client_nat_type,omitempty"`
+	InproxyClientPortMappingTypes                    []string               `protobuf:"bytes,27,rep,name=inproxy_client_port_mapping_types,json=inproxyClientPortMappingTypes,proto3" json:"inproxy_client_port_mapping_types,omitempty"`
 	InproxyConnectionId                              *string                `protobuf:"bytes,28,opt,name=inproxy_connection_id,json=inproxyConnectionId,proto3,oneof" json:"inproxy_connection_id,omitempty"`
 	InproxyDialBrokerOfferDuration                   *int64                 `protobuf:"varint,29,opt,name=inproxy_dial_broker_offer_duration,json=inproxyDialBrokerOfferDuration,proto3,oneof" json:"inproxy_dial_broker_offer_duration,omitempty"`
 	InproxyDialFailedAttemptsDuration                *int64                 `protobuf:"varint,30,opt,name=inproxy_dial_failed_attempts_duration,json=inproxyDialFailedAttemptsDuration,proto3,oneof" json:"inproxy_dial_failed_attempts_duration,omitempty"`
 	InproxyDialNatDisoveryDuration                   *int64                 `protobuf:"varint,31,opt,name=inproxy_dial_nat_disovery_duration,json=inproxyDialNatDisoveryDuration,proto3,oneof" json:"inproxy_dial_nat_disovery_duration,omitempty"`
 	InproxyDialWebrtcConnectionDuration              *int64                 `protobuf:"varint,32,opt,name=inproxy_dial_webrtc_connection_duration,json=inproxyDialWebrtcConnectionDuration,proto3,oneof" json:"inproxy_dial_webrtc_connection_duration,omitempty"`
 	InproxyDialWebrtcIceGatheringDuration            *int64                 `protobuf:"varint,33,opt,name=inproxy_dial_webrtc_ice_gathering_duration,json=inproxyDialWebrtcIceGatheringDuration,proto3,oneof" json:"inproxy_dial_webrtc_ice_gathering_duration,omitempty"`
-	InproxyMatchedCommonCompartments                 *bool                  `protobuf:"varint,34,opt,name=inproxy_matched_common_compartments,json=inproxyMatchedCommonCompartments,proto3,oneof" json:"inproxy_matched_common_compartments,omitempty"` //LowCardinality
+	InproxyMatchedCommonCompartments                 *bool                  `protobuf:"varint,34,opt,name=inproxy_matched_common_compartments,json=inproxyMatchedCommonCompartments,proto3,oneof" json:"inproxy_matched_common_compartments,omitempty"`
 	InproxyMatchedPersonalCompartments               *bool                  `protobuf:"varint,35,opt,name=inproxy_matched_personal_compartments,json=inproxyMatchedPersonalCompartments,proto3,oneof" json:"inproxy_matched_personal_compartments,omitempty"`
-	InproxyProxyAppliedTacticsTag                    *string                `protobuf:"bytes,36,opt,name=inproxy_proxy_applied_tactics_tag,json=inproxyProxyAppliedTacticsTag,proto3,oneof" json:"inproxy_proxy_applied_tactics_tag,omitempty"` //LowCardinality
-	InproxyProxyAsn                                  *string                `protobuf:"bytes,37,opt,name=inproxy_proxy_asn,json=inproxyProxyAsn,proto3,oneof" json:"inproxy_proxy_asn,omitempty"`                                               //LowCardinality
-	InproxyProxyAso                                  *string                `protobuf:"bytes,38,opt,name=inproxy_proxy_aso,json=inproxyProxyAso,proto3,oneof" json:"inproxy_proxy_aso,omitempty"`                                               //LowCardinality
-	InproxyProxyCity                                 *string                `protobuf:"bytes,39,opt,name=inproxy_proxy_city,json=inproxyProxyCity,proto3,oneof" json:"inproxy_proxy_city,omitempty"`                                            //LowCardinality
-	InproxyProxyClientBuildRev                       *string                `protobuf:"bytes,40,opt,name=inproxy_proxy_client_build_rev,json=inproxyProxyClientBuildRev,proto3,oneof" json:"inproxy_proxy_client_build_rev,omitempty"`          //LowCardinality
-	InproxyProxyClientPlatform                       *string                `protobuf:"bytes,41,opt,name=inproxy_proxy_client_platform,json=inproxyProxyClientPlatform,proto3,oneof" json:"inproxy_proxy_client_platform,omitempty"`            //LowCardinality
-	InproxyProxyClientVersion                        *int64                 `protobuf:"varint,42,opt,name=inproxy_proxy_client_version,json=inproxyProxyClientVersion,proto3,oneof" json:"inproxy_proxy_client_version,omitempty"`              //LowCardinality
+	InproxyProxyAppliedTacticsTag                    *string                `protobuf:"bytes,36,opt,name=inproxy_proxy_applied_tactics_tag,json=inproxyProxyAppliedTacticsTag,proto3,oneof" json:"inproxy_proxy_applied_tactics_tag,omitempty"`
+	InproxyProxyAsn                                  *string                `protobuf:"bytes,37,opt,name=inproxy_proxy_asn,json=inproxyProxyAsn,proto3,oneof" json:"inproxy_proxy_asn,omitempty"`
+	InproxyProxyAso                                  *string                `protobuf:"bytes,38,opt,name=inproxy_proxy_aso,json=inproxyProxyAso,proto3,oneof" json:"inproxy_proxy_aso,omitempty"`
+	InproxyProxyCity                                 *string                `protobuf:"bytes,39,opt,name=inproxy_proxy_city,json=inproxyProxyCity,proto3,oneof" json:"inproxy_proxy_city,omitempty"`
+	InproxyProxyClientBuildRev                       *string                `protobuf:"bytes,40,opt,name=inproxy_proxy_client_build_rev,json=inproxyProxyClientBuildRev,proto3,oneof" json:"inproxy_proxy_client_build_rev,omitempty"`
+	InproxyProxyClientPlatform                       *string                `protobuf:"bytes,41,opt,name=inproxy_proxy_client_platform,json=inproxyProxyClientPlatform,proto3,oneof" json:"inproxy_proxy_client_platform,omitempty"`
+	InproxyProxyClientVersion                        *int64                 `protobuf:"varint,42,opt,name=inproxy_proxy_client_version,json=inproxyProxyClientVersion,proto3,oneof" json:"inproxy_proxy_client_version,omitempty"`
 	InproxyProxyConnectedClients                     *int64                 `protobuf:"varint,43,opt,name=inproxy_proxy_connected_clients,json=inproxyProxyConnectedClients,proto3,oneof" json:"inproxy_proxy_connected_clients,omitempty"`
 	InproxyProxyConnectingClients                    *int64                 `protobuf:"varint,44,opt,name=inproxy_proxy_connecting_clients,json=inproxyProxyConnectingClients,proto3,oneof" json:"inproxy_proxy_connecting_clients,omitempty"`
 	InproxyProxyDeviceLocation                       *string                `protobuf:"bytes,45,opt,name=inproxy_proxy_device_location,json=inproxyProxyDeviceLocation,proto3,oneof" json:"inproxy_proxy_device_location,omitempty"`
-	InproxyProxyDeviceRegion                         *string                `protobuf:"bytes,46,opt,name=inproxy_proxy_device_region,json=inproxyProxyDeviceRegion,proto3,oneof" json:"inproxy_proxy_device_region,omitempty"`                     //LowCardinality
-	InproxyProxyFeatures                             *string                `protobuf:"bytes,47,opt,name=inproxy_proxy_features,json=inproxyProxyFeatures,proto3,oneof" json:"inproxy_proxy_features,omitempty"`                                   //LowCardinality
-	InproxyProxyFrontingProviderId                   *string                `protobuf:"bytes,48,opt,name=inproxy_proxy_fronting_provider_id,json=inproxyProxyFrontingProviderId,proto3,oneof" json:"inproxy_proxy_fronting_provider_id,omitempty"` //LowCardinality
+	InproxyProxyDeviceRegion                         *string                `protobuf:"bytes,46,opt,name=inproxy_proxy_device_region,json=inproxyProxyDeviceRegion,proto3,oneof" json:"inproxy_proxy_device_region,omitempty"`
+	InproxyProxyFeatures                             *string                `protobuf:"bytes,47,opt,name=inproxy_proxy_features,json=inproxyProxyFeatures,proto3,oneof" json:"inproxy_proxy_features,omitempty"`
+	InproxyProxyFrontingProviderId                   *string                `protobuf:"bytes,48,opt,name=inproxy_proxy_fronting_provider_id,json=inproxyProxyFrontingProviderId,proto3,oneof" json:"inproxy_proxy_fronting_provider_id,omitempty"`
 	InproxyProxyId                                   *string                `protobuf:"bytes,49,opt,name=inproxy_proxy_id,json=inproxyProxyId,proto3,oneof" json:"inproxy_proxy_id,omitempty"`
 	InproxyProxyIsPriority                           *bool                  `protobuf:"varint,50,opt,name=inproxy_proxy_is_priority,json=inproxyProxyIsPriority,proto3,oneof" json:"inproxy_proxy_is_priority,omitempty"`
-	InproxyProxyIsp                                  *string                `protobuf:"bytes,51,opt,name=inproxy_proxy_isp,json=inproxyProxyIsp,proto3,oneof" json:"inproxy_proxy_isp,omitempty"` //LowCardinality
+	InproxyProxyIsp                                  *string                `protobuf:"bytes,51,opt,name=inproxy_proxy_isp,json=inproxyProxyIsp,proto3,oneof" json:"inproxy_proxy_isp,omitempty"`
 	InproxyProxyLimitDownstreamBytesPerSecond        *int64                 `protobuf:"varint,52,opt,name=inproxy_proxy_limit_downstream_bytes_per_second,json=inproxyProxyLimitDownstreamBytesPerSecond,proto3,oneof" json:"inproxy_proxy_limit_downstream_bytes_per_second,omitempty"`
 	InproxyProxyLimitUpstreamBytesPerSecond          *int64                 `protobuf:"varint,53,opt,name=inproxy_proxy_limit_upstream_bytes_per_second,json=inproxyProxyLimitUpstreamBytesPerSecond,proto3,oneof" json:"inproxy_proxy_limit_upstream_bytes_per_second,omitempty"`
 	InproxyProxyMaxClients                           *int64                 `protobuf:"varint,54,opt,name=inproxy_proxy_max_clients,json=inproxyProxyMaxClients,proto3,oneof" json:"inproxy_proxy_max_clients,omitempty"`
-	InproxyProxyNatType                              *string                `protobuf:"bytes,55,opt,name=inproxy_proxy_nat_type,json=inproxyProxyNatType,proto3,oneof" json:"inproxy_proxy_nat_type,omitempty"`             //LowCardinality
-	InproxyProxyNetworkType                          *string                `protobuf:"bytes,56,opt,name=inproxy_proxy_network_type,json=inproxyProxyNetworkType,proto3,oneof" json:"inproxy_proxy_network_type,omitempty"` //LowCardinality
+	InproxyProxyNatType                              *string                `protobuf:"bytes,55,opt,name=inproxy_proxy_nat_type,json=inproxyProxyNatType,proto3,oneof" json:"inproxy_proxy_nat_type,omitempty"`
+	InproxyProxyNetworkType                          *string                `protobuf:"bytes,56,opt,name=inproxy_proxy_network_type,json=inproxyProxyNetworkType,proto3,oneof" json:"inproxy_proxy_network_type,omitempty"`
 	InproxyProxyPeakDownstreamBytesPerSecond         *int64                 `protobuf:"varint,57,opt,name=inproxy_proxy_peak_downstream_bytes_per_second,json=inproxyProxyPeakDownstreamBytesPerSecond,proto3,oneof" json:"inproxy_proxy_peak_downstream_bytes_per_second,omitempty"`
 	InproxyProxyPeakUpstreamBytesPerSecond           *int64                 `protobuf:"varint,58,opt,name=inproxy_proxy_peak_upstream_bytes_per_second,json=inproxyProxyPeakUpstreamBytesPerSecond,proto3,oneof" json:"inproxy_proxy_peak_upstream_bytes_per_second,omitempty"`
-	InproxyProxyPortMappingTypes                     []string               `protobuf:"bytes,59,rep,name=inproxy_proxy_port_mapping_types,json=inproxyProxyPortMappingTypes,proto3" json:"inproxy_proxy_port_mapping_types,omitempty"`                   //LowCardinality
-	InproxyProxyPropagationChannelId                 *string                `protobuf:"bytes,60,opt,name=inproxy_proxy_propagation_channel_id,json=inproxyProxyPropagationChannelId,proto3,oneof" json:"inproxy_proxy_propagation_channel_id,omitempty"` //LowCardinality
+	InproxyProxyPortMappingTypes                     []string               `protobuf:"bytes,59,rep,name=inproxy_proxy_port_mapping_types,json=inproxyProxyPortMappingTypes,proto3" json:"inproxy_proxy_port_mapping_types,omitempty"`
+	InproxyProxyPropagationChannelId                 *string                `protobuf:"bytes,60,opt,name=inproxy_proxy_propagation_channel_id,json=inproxyProxyPropagationChannelId,proto3,oneof" json:"inproxy_proxy_propagation_channel_id,omitempty"`
 	InproxyProxyProtocolVersion                      *int64                 `protobuf:"varint,61,opt,name=inproxy_proxy_protocol_version,json=inproxyProxyProtocolVersion,proto3,oneof" json:"inproxy_proxy_protocol_version,omitempty"`
-	InproxyProxyRegion                               *string                `protobuf:"bytes,62,opt,name=inproxy_proxy_region,json=inproxyProxyRegion,proto3,oneof" json:"inproxy_proxy_region,omitempty"` //LowCardinality
+	InproxyProxyRegion                               *string                `protobuf:"bytes,62,opt,name=inproxy_proxy_region,json=inproxyProxyRegion,proto3,oneof" json:"inproxy_proxy_region,omitempty"`
 	InproxyProxySessionId                            *string                `protobuf:"bytes,63,opt,name=inproxy_proxy_session_id,json=inproxyProxySessionId,proto3,oneof" json:"inproxy_proxy_session_id,omitempty"`
-	InproxyProxySponsorId                            *string                `protobuf:"bytes,64,opt,name=inproxy_proxy_sponsor_id,json=inproxyProxySponsorId,proto3,oneof" json:"inproxy_proxy_sponsor_id,omitempty"`                        //LowCardinality
-	InproxyProxyStoredTacticsTag                     *string                `protobuf:"bytes,65,opt,name=inproxy_proxy_stored_tactics_tag,json=inproxyProxyStoredTacticsTag,proto3,oneof" json:"inproxy_proxy_stored_tactics_tag,omitempty"` //LowCardinality
-	InproxyProxyClientFeatures                       []string               `protobuf:"bytes,66,rep,name=inproxy_proxy_client_features,json=inproxyProxyClientFeatures,proto3" json:"inproxy_proxy_client_features,omitempty"`               //LowCardinality
+	InproxyProxySponsorId                            *string                `protobuf:"bytes,64,opt,name=inproxy_proxy_sponsor_id,json=inproxyProxySponsorId,proto3,oneof" json:"inproxy_proxy_sponsor_id,omitempty"`
+	InproxyProxyStoredTacticsTag                     *string                `protobuf:"bytes,65,opt,name=inproxy_proxy_stored_tactics_tag,json=inproxyProxyStoredTacticsTag,proto3,oneof" json:"inproxy_proxy_stored_tactics_tag,omitempty"`
+	InproxyProxyClientFeatures                       []string               `protobuf:"bytes,66,rep,name=inproxy_proxy_client_features,json=inproxyProxyClientFeatures,proto3" json:"inproxy_proxy_client_features,omitempty"`
 	InproxyWebrtcDecoyMessagesReceived               *int64                 `protobuf:"varint,67,opt,name=inproxy_webrtc_decoy_messages_received,json=inproxyWebrtcDecoyMessagesReceived,proto3,oneof" json:"inproxy_webrtc_decoy_messages_received,omitempty"`
 	InproxyWebrtcDecoyMessagesSent                   *int64                 `protobuf:"varint,68,opt,name=inproxy_webrtc_decoy_messages_sent,json=inproxyWebrtcDecoyMessagesSent,proto3,oneof" json:"inproxy_webrtc_decoy_messages_sent,omitempty"`
 	InproxyWebrtcDnsAttempt                          *int64                 `protobuf:"varint,69,opt,name=inproxy_webrtc_dns_attempt,json=inproxyWebrtcDnsAttempt,proto3,oneof" json:"inproxy_webrtc_dns_attempt,omitempty"`
-	InproxyWebrtcDnsPreferred                        *string                `protobuf:"bytes,70,opt,name=inproxy_webrtc_dns_preferred,json=inproxyWebrtcDnsPreferred,proto3,oneof" json:"inproxy_webrtc_dns_preferred,omitempty"`       //LowCardinality
-	InproxyWebrtcDnsPreresolved                      *string                `protobuf:"bytes,71,opt,name=inproxy_webrtc_dns_preresolved,json=inproxyWebrtcDnsPreresolved,proto3,oneof" json:"inproxy_webrtc_dns_preresolved,omitempty"` //LowCardinality
+	InproxyWebrtcDnsPreferred                        *string                `protobuf:"bytes,70,opt,name=inproxy_webrtc_dns_preferred,json=inproxyWebrtcDnsPreferred,proto3,oneof" json:"inproxy_webrtc_dns_preferred,omitempty"`
+	InproxyWebrtcDnsPreresolved                      *string                `protobuf:"bytes,71,opt,name=inproxy_webrtc_dns_preresolved,json=inproxyWebrtcDnsPreresolved,proto3,oneof" json:"inproxy_webrtc_dns_preresolved,omitempty"`
 	InproxyWebrtcDnsQnameMismatches                  *int64                 `protobuf:"varint,72,opt,name=inproxy_webrtc_dns_qname_mismatches,json=inproxyWebrtcDnsQnameMismatches,proto3,oneof" json:"inproxy_webrtc_dns_qname_mismatches,omitempty"`
 	InproxyWebrtcDnsQnameMustMatch                   *bool                  `protobuf:"varint,73,opt,name=inproxy_webrtc_dns_qname_must_match,json=inproxyWebrtcDnsQnameMustMatch,proto3,oneof" json:"inproxy_webrtc_dns_qname_must_match,omitempty"`
 	InproxyWebrtcDnsQnameRandomCasing                *bool                  `protobuf:"varint,74,opt,name=inproxy_webrtc_dns_qname_random_casing,json=inproxyWebrtcDnsQnameRandomCasing,proto3,oneof" json:"inproxy_webrtc_dns_qname_random_casing,omitempty"`
-	InproxyWebrtcDnsTransform                        *string                `protobuf:"bytes,75,opt,name=inproxy_webrtc_dns_transform,json=inproxyWebrtcDnsTransform,proto3,oneof" json:"inproxy_webrtc_dns_transform,omitempty"` //LowCardinality
+	InproxyWebrtcDnsTransform                        *string                `protobuf:"bytes,75,opt,name=inproxy_webrtc_dns_transform,json=inproxyWebrtcDnsTransform,proto3,oneof" json:"inproxy_webrtc_dns_transform,omitempty"`
 	InproxyWebrtcLocalIceCandidateIs_IPv6            *bool                  `protobuf:"varint,76,opt,name=inproxy_webrtc_local_ice_candidate_is_IPv6,json=inproxyWebrtcLocalIceCandidateIsIPv6,proto3,oneof" json:"inproxy_webrtc_local_ice_candidate_is_IPv6,omitempty"`
 	InproxyWebrtcLocalIceCandidateIsInitiator        *bool                  `protobuf:"varint,77,opt,name=inproxy_webrtc_local_ice_candidate_is_initiator,json=inproxyWebrtcLocalIceCandidateIsInitiator,proto3,oneof" json:"inproxy_webrtc_local_ice_candidate_is_initiator,omitempty"`
 	InproxyWebrtcLocalIceCandidatePort               *int64                 `protobuf:"varint,78,opt,name=inproxy_webrtc_local_ice_candidate_port,json=inproxyWebrtcLocalIceCandidatePort,proto3,oneof" json:"inproxy_webrtc_local_ice_candidate_port,omitempty"`
-	InproxyWebrtcLocalIceCandidateType               *string                `protobuf:"bytes,79,opt,name=inproxy_webrtc_local_ice_candidate_type,json=inproxyWebrtcLocalIceCandidateType,proto3,oneof" json:"inproxy_webrtc_local_ice_candidate_type,omitempty"` //LowCardinality
+	InproxyWebrtcLocalIceCandidateType               *string                `protobuf:"bytes,79,opt,name=inproxy_webrtc_local_ice_candidate_type,json=inproxyWebrtcLocalIceCandidateType,proto3,oneof" json:"inproxy_webrtc_local_ice_candidate_type,omitempty"`
 	InproxyWebrtcPaddedMessagesReceived              *int64                 `protobuf:"varint,80,opt,name=inproxy_webrtc_padded_messages_received,json=inproxyWebrtcPaddedMessagesReceived,proto3,oneof" json:"inproxy_webrtc_padded_messages_received,omitempty"`
 	InproxyWebrtcPaddedMessagesSent                  *int64                 `protobuf:"varint,81,opt,name=inproxy_webrtc_padded_messages_sent,json=inproxyWebrtcPaddedMessagesSent,proto3,oneof" json:"inproxy_webrtc_padded_messages_sent,omitempty"`
 	InproxyWebrtcRandomizeDtls                       *bool                  `protobuf:"varint,82,opt,name=inproxy_webrtc_randomize_dtls,json=inproxyWebrtcRandomizeDtls,proto3,oneof" json:"inproxy_webrtc_randomize_dtls,omitempty"`
 	InproxyWebrtcRemoteIceCandidateIs_IPv6           *bool                  `protobuf:"varint,83,opt,name=inproxy_webrtc_remote_ice_candidate_is_IPv6,json=inproxyWebrtcRemoteIceCandidateIsIPv6,proto3,oneof" json:"inproxy_webrtc_remote_ice_candidate_is_IPv6,omitempty"`
 	InproxyWebrtcRemoteIceCandidatePort              *int64                 `protobuf:"varint,84,opt,name=inproxy_webrtc_remote_ice_candidate_port,json=inproxyWebrtcRemoteIceCandidatePort,proto3,oneof" json:"inproxy_webrtc_remote_ice_candidate_port,omitempty"`
-	InproxyWebrtcRemoteIceCandidateType              *string                `protobuf:"bytes,85,opt,name=inproxy_webrtc_remote_ice_candidate_type,json=inproxyWebrtcRemoteIceCandidateType,proto3,oneof" json:"inproxy_webrtc_remote_ice_candidate_type,omitempty"`                                         //LowCardinality
-	InproxyWebrtcStunServer                          *string                `protobuf:"bytes,86,opt,name=inproxy_webrtc_stun_server,json=inproxyWebrtcStunServer,proto3,oneof" json:"inproxy_webrtc_stun_server,omitempty"`                                                                                 //LowCardinality
-	InproxyWebrtcStunServer_RFC5780                  *string                `protobuf:"bytes,87,opt,name=inproxy_webrtc_stun_server_RFC5780,json=inproxyWebrtcStunServerRFC5780,proto3,oneof" json:"inproxy_webrtc_stun_server_RFC5780,omitempty"`                                                          //LowCardinality
-	InproxyWebrtcStunServer_RFC5780ResolvedIpAddress *string                `protobuf:"bytes,88,opt,name=inproxy_webrtc_stun_server_RFC5780_resolved_ip_address,json=inproxyWebrtcStunServerRFC5780ResolvedIpAddress,proto3,oneof" json:"inproxy_webrtc_stun_server_RFC5780_resolved_ip_address,omitempty"` //LowCardinality
-	InproxyWebrtcStunServerResolvedIpAddress         *string                `protobuf:"bytes,89,opt,name=inproxy_webrtc_stun_server_resolved_ip_address,json=inproxyWebrtcStunServerResolvedIpAddress,proto3,oneof" json:"inproxy_webrtc_stun_server_resolved_ip_address,omitempty"`                        //LowCardinality
+	InproxyWebrtcRemoteIceCandidateType              *string                `protobuf:"bytes,85,opt,name=inproxy_webrtc_remote_ice_candidate_type,json=inproxyWebrtcRemoteIceCandidateType,proto3,oneof" json:"inproxy_webrtc_remote_ice_candidate_type,omitempty"`
+	InproxyWebrtcStunServer                          *string                `protobuf:"bytes,86,opt,name=inproxy_webrtc_stun_server,json=inproxyWebrtcStunServer,proto3,oneof" json:"inproxy_webrtc_stun_server,omitempty"`
+	InproxyWebrtcStunServer_RFC5780                  *string                `protobuf:"bytes,87,opt,name=inproxy_webrtc_stun_server_RFC5780,json=inproxyWebrtcStunServerRFC5780,proto3,oneof" json:"inproxy_webrtc_stun_server_RFC5780,omitempty"`
+	InproxyWebrtcStunServer_RFC5780ResolvedIpAddress *string                `protobuf:"bytes,88,opt,name=inproxy_webrtc_stun_server_RFC5780_resolved_ip_address,json=inproxyWebrtcStunServerRFC5780ResolvedIpAddress,proto3,oneof" json:"inproxy_webrtc_stun_server_RFC5780_resolved_ip_address,omitempty"`
+	InproxyWebrtcStunServerResolvedIpAddress         *string                `protobuf:"bytes,89,opt,name=inproxy_webrtc_stun_server_resolved_ip_address,json=inproxyWebrtcStunServerResolvedIpAddress,proto3,oneof" json:"inproxy_webrtc_stun_server_resolved_ip_address,omitempty"`
 	InproxyWebrtcUseMediaStreams                     *bool                  `protobuf:"varint,90,opt,name=inproxy_webrtc_use_media_streams,json=inproxyWebrtcUseMediaStreams,proto3,oneof" json:"inproxy_webrtc_use_media_streams,omitempty"`
 	unknownFields                                    protoimpl.UnknownFields
 	sizeCache                                        protoimpl.SizeCache

+ 11 - 11
psiphon/server/pb/psiphond/irregular_tunnel.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/irregular_tunnel.proto
 
 package psiphond
@@ -24,19 +24,19 @@ const (
 type IrregularTunnel struct {
 	state                              protoimpl.MessageState `protogen:"open.v1"`
 	BaseParams                         *BaseParams            `protobuf:"bytes,1,opt,name=base_params,json=baseParams,proto3,oneof" json:"base_params,omitempty"`
-	DuplicateAuthorizationClientAsn    *string                `protobuf:"bytes,100,opt,name=duplicate_authorization_client_asn,json=duplicateAuthorizationClientAsn,proto3,oneof" json:"duplicate_authorization_client_asn,omitempty"`          //LowCardinality
-	DuplicateAuthorizationClientAso    *string                `protobuf:"bytes,101,opt,name=duplicate_authorization_client_aso,json=duplicateAuthorizationClientAso,proto3,oneof" json:"duplicate_authorization_client_aso,omitempty"`          //LowCardinality
-	DuplicateAuthorizationClientCity   *string                `protobuf:"bytes,102,opt,name=duplicate_authorization_client_city,json=duplicateAuthorizationClientCity,proto3,oneof" json:"duplicate_authorization_client_city,omitempty"`       //LowCardinality
-	DuplicateAuthorizationClientIsp    *string                `protobuf:"bytes,103,opt,name=duplicate_authorization_client_isp,json=duplicateAuthorizationClientIsp,proto3,oneof" json:"duplicate_authorization_client_isp,omitempty"`          //LowCardinality
-	DuplicateAuthorizationClientRegion *string                `protobuf:"bytes,104,opt,name=duplicate_authorization_client_region,json=duplicateAuthorizationClientRegion,proto3,oneof" json:"duplicate_authorization_client_region,omitempty"` //LowCardinality
+	DuplicateAuthorizationClientAsn    *string                `protobuf:"bytes,100,opt,name=duplicate_authorization_client_asn,json=duplicateAuthorizationClientAsn,proto3,oneof" json:"duplicate_authorization_client_asn,omitempty"`
+	DuplicateAuthorizationClientAso    *string                `protobuf:"bytes,101,opt,name=duplicate_authorization_client_aso,json=duplicateAuthorizationClientAso,proto3,oneof" json:"duplicate_authorization_client_aso,omitempty"`
+	DuplicateAuthorizationClientCity   *string                `protobuf:"bytes,102,opt,name=duplicate_authorization_client_city,json=duplicateAuthorizationClientCity,proto3,oneof" json:"duplicate_authorization_client_city,omitempty"`
+	DuplicateAuthorizationClientIsp    *string                `protobuf:"bytes,103,opt,name=duplicate_authorization_client_isp,json=duplicateAuthorizationClientIsp,proto3,oneof" json:"duplicate_authorization_client_isp,omitempty"`
+	DuplicateAuthorizationClientRegion *string                `protobuf:"bytes,104,opt,name=duplicate_authorization_client_region,json=duplicateAuthorizationClientRegion,proto3,oneof" json:"duplicate_authorization_client_region,omitempty"`
 	DuplicateAuthorizationId           *string                `protobuf:"bytes,105,opt,name=duplicate_authorization_id,json=duplicateAuthorizationId,proto3,oneof" json:"duplicate_authorization_id,omitempty"`
-	DuplicateClientIp                  *string                `protobuf:"bytes,106,opt,name=duplicate_client_ip,json=duplicateClientIp,proto3,oneof" json:"duplicate_client_ip,omitempty"` //LowCardinality
+	DuplicateClientIp                  *string                `protobuf:"bytes,106,opt,name=duplicate_client_ip,json=duplicateClientIp,proto3,oneof" json:"duplicate_client_ip,omitempty"`
 	DuplicateElapsedTimeMs             *int64                 `protobuf:"varint,107,opt,name=duplicate_elapsed_time_ms,json=duplicateElapsedTimeMs,proto3,oneof" json:"duplicate_elapsed_time_ms,omitempty"`
 	DuplicateSeed                      *string                `protobuf:"bytes,108,opt,name=duplicate_seed,json=duplicateSeed,proto3,oneof" json:"duplicate_seed,omitempty"`
-	DuplicateSeedType                  *string                `protobuf:"bytes,109,opt,name=duplicate_seed_type,json=duplicateSeedType,proto3,oneof" json:"duplicate_seed_type,omitempty"` //LowCardinality
+	DuplicateSeedType                  *string                `protobuf:"bytes,109,opt,name=duplicate_seed_type,json=duplicateSeedType,proto3,oneof" json:"duplicate_seed_type,omitempty"`
 	ListenerPortNumber                 *uint32                `protobuf:"varint,110,opt,name=listener_port_number,json=listenerPortNumber,proto3,oneof" json:"listener_port_number,omitempty"`
-	ListenerProtocol                   *string                `protobuf:"bytes,111,opt,name=listener_protocol,json=listenerProtocol,proto3,oneof" json:"listener_protocol,omitempty"` //LowCardinality
-	TunnelError                        *string                `protobuf:"bytes,112,opt,name=tunnel_error,json=tunnelError,proto3,oneof" json:"tunnel_error,omitempty"`                //LowCardinality
+	ListenerProtocol                   *string                `protobuf:"bytes,111,opt,name=listener_protocol,json=listenerProtocol,proto3,oneof" json:"listener_protocol,omitempty"`
+	TunnelError                        *string                `protobuf:"bytes,112,opt,name=tunnel_error,json=tunnelError,proto3,oneof" json:"tunnel_error,omitempty"`
 	unknownFields                      protoimpl.UnknownFields
 	sizeCache                          protoimpl.SizeCache
 }

+ 2 - 2
psiphon/server/pb/psiphond/orphan_packet.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/orphan_packet.proto
 
 package psiphond

+ 6 - 6
psiphon/server/pb/psiphond/psiphond.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/psiphond.proto
 
 package psiphond
@@ -25,10 +25,10 @@ const (
 type Psiphond struct {
 	state        protoimpl.MessageState `protogen:"open.v1"`
 	Timestamp    *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3,oneof" json:"timestamp,omitempty"`
-	HostId       *string                `protobuf:"bytes,2,opt,name=host_id,json=hostId,proto3,oneof" json:"host_id,omitempty"`                     //LowCardinality
-	HostType     *string                `protobuf:"bytes,3,opt,name=host_type,json=hostType,proto3,oneof" json:"host_type,omitempty"`               //LowCardinality
-	HostBuildRev *string                `protobuf:"bytes,4,opt,name=host_build_rev,json=hostBuildRev,proto3,oneof" json:"host_build_rev,omitempty"` //LowCardinality
-	Provider     *string                `protobuf:"bytes,5,opt,name=provider,proto3,oneof" json:"provider,omitempty"`                               //LowCardinality
+	HostId       *string                `protobuf:"bytes,2,opt,name=host_id,json=hostId,proto3,oneof" json:"host_id,omitempty"`
+	HostType     *string                `protobuf:"bytes,3,opt,name=host_type,json=hostType,proto3,oneof" json:"host_type,omitempty"`
+	HostBuildRev *string                `protobuf:"bytes,4,opt,name=host_build_rev,json=hostBuildRev,proto3,oneof" json:"host_build_rev,omitempty"`
+	Provider     *string                `protobuf:"bytes,5,opt,name=provider,proto3,oneof" json:"provider,omitempty"`
 	// Types that are valid to be assigned to Metric:
 	//
 	//	*Psiphond_DomainBytes

+ 4 - 4
psiphon/server/pb/psiphond/remote_server_list.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/remote_server_list.proto
 
 package psiphond
@@ -30,9 +30,9 @@ type RemoteServerList struct {
 	Bytes                   *int64                 `protobuf:"varint,101,opt,name=bytes,proto3,oneof" json:"bytes,omitempty"`
 	ClientDownloadTimestamp *timestamppb.Timestamp `protobuf:"bytes,102,opt,name=client_download_timestamp,json=clientDownloadTimestamp,proto3,oneof" json:"client_download_timestamp,omitempty"`
 	Duration                *int64                 `protobuf:"varint,103,opt,name=duration,proto3,oneof" json:"duration,omitempty"`
-	Etag                    *string                `protobuf:"bytes,104,opt,name=etag,proto3,oneof" json:"etag,omitempty"` //LowCardinality
+	Etag                    *string                `protobuf:"bytes,104,opt,name=etag,proto3,oneof" json:"etag,omitempty"`
 	Tunneled                *bool                  `protobuf:"varint,105,opt,name=tunneled,proto3,oneof" json:"tunneled,omitempty"`
-	Url                     *string                `protobuf:"bytes,106,opt,name=url,proto3,oneof" json:"url,omitempty"` //LowCardinality
+	Url                     *string                `protobuf:"bytes,106,opt,name=url,proto3,oneof" json:"url,omitempty"`
 	unknownFields           protoimpl.UnknownFields
 	sizeCache               protoimpl.SizeCache
 }

+ 5 - 5
psiphon/server/pb/psiphond/server_blocklist.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/server_blocklist.proto
 
 package psiphond
@@ -24,9 +24,9 @@ const (
 type ServerBlocklistHit struct {
 	state              protoimpl.MessageState `protogen:"open.v1"`
 	BaseParams         *BaseParams            `protobuf:"bytes,1,opt,name=base_params,json=baseParams,proto3,oneof" json:"base_params,omitempty"`
-	BlocklistIpAddress *string                `protobuf:"bytes,100,opt,name=blocklist_ip_address,json=blocklistIpAddress,proto3,oneof" json:"blocklist_ip_address,omitempty"` //LowCardinality
-	BlocklistSource    *string                `protobuf:"bytes,101,opt,name=blocklist_source,json=blocklistSource,proto3,oneof" json:"blocklist_source,omitempty"`            //LowCardinality
-	BlocklistSubject   *string                `protobuf:"bytes,102,opt,name=blocklist_subject,json=blocklistSubject,proto3,oneof" json:"blocklist_subject,omitempty"`         //LowCardinality
+	BlocklistIpAddress *string                `protobuf:"bytes,100,opt,name=blocklist_ip_address,json=blocklistIpAddress,proto3,oneof" json:"blocklist_ip_address,omitempty"`
+	BlocklistSource    *string                `protobuf:"bytes,101,opt,name=blocklist_source,json=blocklistSource,proto3,oneof" json:"blocklist_source,omitempty"`
+	BlocklistSubject   *string                `protobuf:"bytes,102,opt,name=blocklist_subject,json=blocklistSubject,proto3,oneof" json:"blocklist_subject,omitempty"`
 	unknownFields      protoimpl.UnknownFields
 	sizeCache          protoimpl.SizeCache
 }

+ 5 - 5
psiphon/server/pb/psiphond/server_load.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/server_load.proto
 
 package psiphond
@@ -24,8 +24,8 @@ const (
 
 type ServerLoadProtocol struct {
 	state              protoimpl.MessageState `protogen:"open.v1"`
-	Region             *string                `protobuf:"bytes,100,opt,name=region,proto3,oneof" json:"region,omitempty"`     //LowCardinality
-	Protocol           *string                `protobuf:"bytes,101,opt,name=protocol,proto3,oneof" json:"protocol,omitempty"` //LowCardinality
+	Region             *string                `protobuf:"bytes,100,opt,name=region,proto3,oneof" json:"region,omitempty"`
+	Protocol           *string                `protobuf:"bytes,101,opt,name=protocol,proto3,oneof" json:"protocol,omitempty"`
 	AcceptedClients    *int64                 `protobuf:"varint,102,opt,name=accepted_clients,json=acceptedClients,proto3,oneof" json:"accepted_clients,omitempty"`
 	EstablishedClients *int64                 `protobuf:"varint,103,opt,name=established_clients,json=establishedClients,proto3,oneof" json:"established_clients,omitempty"`
 	unknownFields      protoimpl.UnknownFields
@@ -92,7 +92,7 @@ func (x *ServerLoadProtocol) GetEstablishedClients() int64 {
 
 type ServerLoadDNS struct {
 	state             protoimpl.MessageState `protogen:"open.v1"`
-	DnsServer         *string                `protobuf:"bytes,100,opt,name=dns_server,json=dnsServer,proto3,oneof" json:"dns_server,omitempty"` //LowCardinality
+	DnsServer         *string                `protobuf:"bytes,100,opt,name=dns_server,json=dnsServer,proto3,oneof" json:"dns_server,omitempty"`
 	DnsCount          *int64                 `protobuf:"varint,101,opt,name=dns_count,json=dnsCount,proto3,oneof" json:"dns_count,omitempty"`
 	DnsDuration       *int64                 `protobuf:"varint,102,opt,name=dns_duration,json=dnsDuration,proto3,oneof" json:"dns_duration,omitempty"`
 	DnsFailedCount    *int64                 `protobuf:"varint,103,opt,name=dns_failed_count,json=dnsFailedCount,proto3,oneof" json:"dns_failed_count,omitempty"`

+ 2 - 2
psiphon/server/pb/psiphond/server_packet.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/server_packet.proto
 
 package psiphond

+ 5 - 25
psiphon/server/pb/psiphond/server_panic.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/server_panic.proto
 
 package psiphond
@@ -24,8 +24,6 @@ const (
 type ServerPanic struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
 	Panic         *string                `protobuf:"bytes,100,opt,name=panic,proto3,oneof" json:"panic,omitempty"`
-	RecoverValue  *string                `protobuf:"bytes,101,opt,name=recover_value,json=recoverValue,proto3,oneof" json:"recover_value,omitempty"`
-	Stack         *string                `protobuf:"bytes,102,opt,name=stack,proto3,oneof" json:"stack,omitempty"`
 	unknownFields protoimpl.UnknownFields
 	sizeCache     protoimpl.SizeCache
 }
@@ -67,32 +65,14 @@ func (x *ServerPanic) GetPanic() string {
 	return ""
 }
 
-func (x *ServerPanic) GetRecoverValue() string {
-	if x != nil && x.RecoverValue != nil {
-		return *x.RecoverValue
-	}
-	return ""
-}
-
-func (x *ServerPanic) GetStack() string {
-	if x != nil && x.Stack != nil {
-		return *x.Stack
-	}
-	return ""
-}
-
 var File_ca_psiphon_psiphond_server_panic_proto protoreflect.FileDescriptor
 
 const file_ca_psiphon_psiphond_server_panic_proto_rawDesc = "" +
 	"\n" +
-	"&ca.psiphon.psiphond/server_panic.proto\x12\x13ca.psiphon.psiphond\"\x93\x01\n" +
+	"&ca.psiphon.psiphond/server_panic.proto\x12\x13ca.psiphon.psiphond\"2\n" +
 	"\vServerPanic\x12\x19\n" +
-	"\x05panic\x18d \x01(\tH\x00R\x05panic\x88\x01\x01\x12(\n" +
-	"\rrecover_value\x18e \x01(\tH\x01R\frecoverValue\x88\x01\x01\x12\x19\n" +
-	"\x05stack\x18f \x01(\tH\x02R\x05stack\x88\x01\x01B\b\n" +
-	"\x06_panicB\x10\n" +
-	"\x0e_recover_valueB\b\n" +
-	"\x06_stackBHZFgithub.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/server/pb/psiphondb\x06proto3"
+	"\x05panic\x18d \x01(\tH\x00R\x05panic\x88\x01\x01B\b\n" +
+	"\x06_panicBHZFgithub.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/server/pb/psiphondb\x06proto3"
 
 var (
 	file_ca_psiphon_psiphond_server_panic_proto_rawDescOnce sync.Once

+ 5 - 5
psiphon/server/pb/psiphond/server_tunnel.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/server_tunnel.proto
 
 package psiphond
@@ -75,8 +75,8 @@ type ServerTunnel struct {
 	MeekPeakCachedResponseSize                    *int64                 `protobuf:"varint,145,opt,name=meek_peak_cached_response_size,json=meekPeakCachedResponseSize,proto3,oneof" json:"meek_peak_cached_response_size,omitempty"`
 	MeekPeakResponseSize                          *int64                 `protobuf:"varint,146,opt,name=meek_peak_response_size,json=meekPeakResponseSize,proto3,oneof" json:"meek_peak_response_size,omitempty"`
 	MeekUnderlyingConnectionCount                 *int64                 `protobuf:"varint,147,opt,name=meek_underlying_connection_count,json=meekUnderlyingConnectionCount,proto3,oneof" json:"meek_underlying_connection_count,omitempty"`
-	MeekServerHttpVersion                         *string                `protobuf:"bytes,148,opt,name=meek_server_http_version,json=meekServerHttpVersion,proto3,oneof" json:"meek_server_http_version,omitempty"` //LowCardinality
-	NewTacticsTag                                 *string                `protobuf:"bytes,149,opt,name=new_tactics_tag,json=newTacticsTag,proto3,oneof" json:"new_tactics_tag,omitempty"`                           //LowCardinality
+	MeekServerHttpVersion                         *string                `protobuf:"bytes,148,opt,name=meek_server_http_version,json=meekServerHttpVersion,proto3,oneof" json:"meek_server_http_version,omitempty"`
+	NewTacticsTag                                 *string                `protobuf:"bytes,149,opt,name=new_tactics_tag,json=newTacticsTag,proto3,oneof" json:"new_tactics_tag,omitempty"`
 	PeakConcurrentDialingPortForwardCountTcp      *int64                 `protobuf:"varint,150,opt,name=peak_concurrent_dialing_port_forward_count_tcp,json=peakConcurrentDialingPortForwardCountTcp,proto3,oneof" json:"peak_concurrent_dialing_port_forward_count_tcp,omitempty"`
 	PeakConcurrentPortForwardCountTcp             *int64                 `protobuf:"varint,151,opt,name=peak_concurrent_port_forward_count_tcp,json=peakConcurrentPortForwardCountTcp,proto3,oneof" json:"peak_concurrent_port_forward_count_tcp,omitempty"`
 	PeakConcurrentPortForwardCountUdp             *int64                 `protobuf:"varint,152,opt,name=peak_concurrent_port_forward_count_udp,json=peakConcurrentPortForwardCountUdp,proto3,oneof" json:"peak_concurrent_port_forward_count_udp,omitempty"`
@@ -93,7 +93,7 @@ type ServerTunnel struct {
 	PreHandshakeRandomStreamUpstreamBytes         *int64                 `protobuf:"varint,163,opt,name=pre_handshake_random_stream_upstream_bytes,json=preHandshakeRandomStreamUpstreamBytes,proto3,oneof" json:"pre_handshake_random_stream_upstream_bytes,omitempty"`
 	SplitTunnel                                   *bool                  `protobuf:"varint,164,opt,name=split_tunnel,json=splitTunnel,proto3,oneof" json:"split_tunnel,omitempty"`
 	StartTime                                     *timestamppb.Timestamp `protobuf:"bytes,165,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"`
-	StationIpAddress                              *string                `protobuf:"bytes,166,opt,name=station_ip_address,json=stationIpAddress,proto3,oneof" json:"station_ip_address,omitempty"` //LowCardinality
+	StationIpAddress                              *string                `protobuf:"bytes,166,opt,name=station_ip_address,json=stationIpAddress,proto3,oneof" json:"station_ip_address,omitempty"`
 	TotalPacketTunnelChannelCount                 *int64                 `protobuf:"varint,167,opt,name=total_packet_tunnel_channel_count,json=totalPacketTunnelChannelCount,proto3,oneof" json:"total_packet_tunnel_channel_count,omitempty"`
 	TotalPortForwardCountTcp                      *int64                 `protobuf:"varint,168,opt,name=total_port_forward_count_tcp,json=totalPortForwardCountTcp,proto3,oneof" json:"total_port_forward_count_tcp,omitempty"`
 	TotalPortForwardCountUdp                      *int64                 `protobuf:"varint,169,opt,name=total_port_forward_count_udp,json=totalPortForwardCountUdp,proto3,oneof" json:"total_port_forward_count_udp,omitempty"`

+ 6 - 6
psiphon/server/pb/psiphond/tactics.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/tactics.proto
 
 package psiphond
@@ -26,8 +26,8 @@ type Tactics struct {
 	BaseParams       *BaseParams            `protobuf:"bytes,1,opt,name=base_params,json=baseParams,proto3,oneof" json:"base_params,omitempty"`
 	DialParams       *DialParams            `protobuf:"bytes,2,opt,name=dial_params,json=dialParams,proto3,oneof" json:"dial_params,omitempty"`
 	IsTacticsRequest *bool                  `protobuf:"varint,100,opt,name=is_tactics_request,json=isTacticsRequest,proto3,oneof" json:"is_tactics_request,omitempty"`
-	NewTacticsTag    *string                `protobuf:"bytes,101,opt,name=new_tactics_tag,json=newTacticsTag,proto3,oneof" json:"new_tactics_tag,omitempty"`          //LowCardinality
-	StoredTacticsTag *string                `protobuf:"bytes,102,opt,name=stored_tactics_tag,json=storedTacticsTag,proto3,oneof" json:"stored_tactics_tag,omitempty"` //LowCardinality
+	NewTacticsTag    *string                `protobuf:"bytes,101,opt,name=new_tactics_tag,json=newTacticsTag,proto3,oneof" json:"new_tactics_tag,omitempty"`
+	StoredTacticsTag *string                `protobuf:"bytes,102,opt,name=stored_tactics_tag,json=storedTacticsTag,proto3,oneof" json:"stored_tactics_tag,omitempty"`
 	unknownFields    protoimpl.UnknownFields
 	sizeCache        protoimpl.SizeCache
 }
@@ -103,8 +103,8 @@ type TacticsSpeedTest struct {
 	RoundTripTimeMs *int64                 `protobuf:"varint,100,opt,name=round_trip_time_ms,json=roundTripTimeMs,proto3,oneof" json:"round_trip_time_ms,omitempty"`
 	BytesDown       *int64                 `protobuf:"varint,101,opt,name=bytes_down,json=bytesDown,proto3,oneof" json:"bytes_down,omitempty"`
 	BytesUp         *int64                 `protobuf:"varint,102,opt,name=bytes_up,json=bytesUp,proto3,oneof" json:"bytes_up,omitempty"`
-	RelayProtocol   *string                `protobuf:"bytes,103,opt,name=relay_protocol,json=relayProtocol,proto3,oneof" json:"relay_protocol,omitempty"` //LowCardinality
-	ServerRegion    *string                `protobuf:"bytes,104,opt,name=server_region,json=serverRegion,proto3,oneof" json:"server_region,omitempty"`    //LowCardinality
+	RelayProtocol   *string                `protobuf:"bytes,103,opt,name=relay_protocol,json=relayProtocol,proto3,oneof" json:"relay_protocol,omitempty"`
+	ServerRegion    *string                `protobuf:"bytes,104,opt,name=server_region,json=serverRegion,proto3,oneof" json:"server_region,omitempty"`
 	unknownFields   protoimpl.UnknownFields
 	sizeCache       protoimpl.SizeCache
 }

+ 2 - 2
psiphon/server/pb/psiphond/unique_user.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.psiphond/unique_user.proto
 
 package psiphond

+ 2 - 2
psiphon/server/pb/router/router.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.36.9
-// 	protoc        v6.32.0
+// 	protoc-gen-go v1.36.10
+// 	protoc        v6.33.0
 // source: ca.psiphon.router/router.proto
 
 package router

+ 14 - 14
psiphon/server/proto/ca.psiphon.psiphond/base_params.proto

@@ -7,25 +7,25 @@ import "google/protobuf/timestamp.proto";
 option go_package = "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/server/pb/psiphond";
 
 message BaseParams {
-    optional string client_asn = 1; //LowCardinality
-    optional string client_aso = 2; //LowCardinality
-    optional string client_build_rev = 3; //LowCardinality
-    optional string client_city = 4; //LowCardinality
-    repeated string client_features = 5; //LowCardinality
-    optional string client_isp = 6; //LowCardinality
-    optional string client_platform = 7; //LowCardinality
-    optional string client_region = 8; //LowCardinality
+    optional string client_asn = 1;
+    optional string client_aso = 2;
+    optional string client_build_rev = 3;
+    optional string client_city = 4;
+    repeated string client_features = 5;
+    optional string client_isp = 6;
+    optional string client_platform = 7;
+    optional string client_region = 8;
     optional int64 client_version = 9;
 
     optional string device_location = 10; //device_location uses geohash encoding
-    optional string device_region = 11; //LowCardinality
+    optional string device_region = 11;
 
     optional string session_id = 12;
-    optional string sponsor_id = 13; //LowCardinality
-    optional string propagation_channel_id = 14; //LowCardinality
+    optional string sponsor_id = 13;
+    optional string propagation_channel_id = 14;
 
-    optional string applied_tactics_tag = 15; //LowCardinality
-    optional string egress_region = 16; //LowCardinality
+    optional string applied_tactics_tag = 15;
+    optional string egress_region = 16;
     optional google.protobuf.Timestamp last_connected = 17;
-    repeated string authorized_access_types = 18; //LowCardinality
+    repeated string authorized_access_types = 18;
 }

+ 32 - 32
psiphon/server/proto/ca.psiphon.psiphond/dial_params.proto

@@ -10,21 +10,21 @@ message DialParams {
     optional bool conjure_cached = 1;
     optional int64 conjure_delay = 2;
     optional bool conjure_empty_packet = 3;
-    optional string conjure_network = 4; //LowCardinality
+    optional string conjure_network = 4;
     optional int64 conjure_port_number = 5;
-    optional string conjure_prefix = 6; //LowCardinality
-    optional string conjure_stun = 7; //LowCardinality
-    optional string conjure_transport = 8; //LowCardinality
+    optional string conjure_prefix = 6;
+    optional string conjure_stun = 7;
+    optional string conjure_transport = 8;
 
     optional int64 meek_cookie_size = 9;
     optional string meek_content_type = 10;
-    optional string meek_cookie_name = 11; //LowCardinality
-    optional string meek_dial_domain = 12;  //LowCardinality
-    optional string meek_dial_ip_address = 13;  //LowCardinality
+    optional string meek_cookie_name = 11;
+    optional string meek_dial_domain = 12;
+    optional string meek_dial_ip_address = 13;
     optional string meek_host_header = 14;
     optional int64 meek_limit_request = 15;
     optional int64 meek_redial_probability = 16;
-    optional string meek_resolved_ip_address = 17; //LowCardinality
+    optional string meek_resolved_ip_address = 17;
     optional string meek_sni_server_name = 18;
     optional int64 meek_tls_padding = 19;
     optional bool meek_transformed_host_name = 20;
@@ -35,46 +35,46 @@ message DialParams {
     optional bool quic_disable_client_path_mtu_discovery = 24;
     optional bool quic_obfuscated_psk = 25;
     optional bool quic_sent_ticket = 26;
-    optional string quic_version = 27; //LowCardinality
+    optional string quic_version = 27;
 
-    optional string shadowsocks_prefix = 28;  //LowCardinality
+    optional string shadowsocks_prefix = 28;
 
     optional bool tls_did_resume = 29;
     optional bool tls_fragmented = 30;
     optional string tls_ossh_sni_server_name = 31;
     optional bool tls_ossh_transformed_host_name = 32;
     optional int64 tls_padding = 33;
-    optional string tls_profile = 34; //LowCardinality
+    optional string tls_profile = 34;
     optional bool tls_sent_ticket = 35;
-    optional string tls_version = 36; //LowCardinality
+    optional string tls_version = 36;
 
-    optional string server_entry_region = 37; //LowCardinality
-    optional string server_entry_source = 38; //LowCardinality
+    optional string server_entry_region = 37;
+    optional string server_entry_source = 38;
     optional string server_entry_tag = 39;
     optional google.protobuf.Timestamp server_entry_timestamp = 40;
-    optional string server_packet_manipulation = 41; //LowCardinality
-    optional bool server_replay_fragmentation = 42; //LowCardinality
-    optional bool server_replay_packet_manipulation = 43; //LowCardinality
+    optional string server_packet_manipulation = 41;
+    optional bool server_replay_fragmentation = 42;
+    optional bool server_replay_packet_manipulation = 43;
     optional bool server_entry_valid = 44;
 
     optional int32 candidate_number = 45;
     optional bool is_replay = 46;
     optional int64 dial_port_number = 47;
     optional int64 dial_duration = 48;
-    optional string fronting_provider_id = 49; //LowCardinality
-    optional string network_type = 50; //LowCardinality
-    optional string relay_protocol = 51; //LowCardinality
-    optional string ssh_client_version = 52; //LowCardinality
-    optional string ossh_prefix = 53; //LowCardinality
+    optional string fronting_provider_id = 49;
+    optional string network_type = 50;
+    optional string relay_protocol = 51;
+    optional string ssh_client_version = 52;
+    optional string ossh_prefix = 53;
     optional string user_agent = 54;
-    optional string http_transform = 55; //LowCardinality
+    optional string http_transform = 55;
 
     optional int64 dns_attempt = 56;
-    optional string dns_preferred = 57;  //LowCardinality
-    optional string dns_preresolved = 58;  //LowCardinality
+    optional string dns_preferred = 57;
+    optional string dns_preresolved = 58;
     optional int64 dns_qname_mismatches = 59;
     optional bool dns_qname_random_casing = 60;
-    optional string dns_transform = 61; //LowCardinality
+    optional string dns_transform = 61;
 
     optional int64 downstream_bytes_fragmented = 62;
     optional int64 downstream_max_bytes_written = 63;
@@ -89,19 +89,19 @@ message DialParams {
     optional int64 upstream_min_bytes_written = 71;
     optional int64 upstream_min_delayed = 72;
     optional int64 upstream_ossh_padding = 73;
-    repeated string upstream_proxy_custom_header_names = 74; //LowCardinality
-    optional string upstream_proxy_type = 75; //LowCardinality
+    repeated string upstream_proxy_custom_header_names = 74;
+    optional string upstream_proxy_type = 75;
 
-    optional string passthrough_address = 76; //LowCardinality
+    optional string passthrough_address = 76;
 
     optional int64 pad_response = 77;
     optional int64 padding = 78;
 
-    optional string client_bpf = 79; //LowCardinality
-    optional string server_bpf = 80; //LowCardinality
+    optional string client_bpf = 79;
+    optional string server_bpf = 80;
 
     optional int64 established_tunnels_count = 81;
     optional double network_latency_multiplier = 82;
-    optional string seed_transform = 83; //LowCardinality
+    optional string seed_transform = 83;
 
 }

+ 1 - 1
psiphon/server/proto/ca.psiphon.psiphond/domain_bytes.proto

@@ -12,5 +12,5 @@ message DomainBytes {
     // Fields 1-99 are reserved for field groupings.
 
     optional int64 bytes = 100;
-    optional string domain = 101; //LowCardinality
+    optional string domain = 101;
 }

+ 1 - 1
psiphon/server/proto/ca.psiphon.psiphond/failed_tunnel.proto

@@ -24,5 +24,5 @@ message FailedTunnel {
     optional int64 liveness_test_sent_upstream_bytes = 105;
     optional int64 liveness_test_upstream_bytes = 106;
     optional double record_probability = 107;
-    optional string tunnel_error = 108; //LowCardinality
+    optional string tunnel_error = 108;
 }

+ 18 - 18
psiphon/server/proto/ca.psiphon.psiphond/inproxy_broker.proto

@@ -13,41 +13,41 @@ message InproxyBroker {
 
     optional int32 announcement_match_index = 100;
     optional int32 announcement_queue_size = 101;
-    optional string answer_error = 102; //LowCardinality
-    optional string broker_event = 103;//LowCardinality
-    optional string broker_id = 104;//LowCardinality
+    optional string answer_error = 102;
+    optional string broker_event = 103;
+    optional string broker_id = 104;
     optional int64 connected_clients = 105;
     optional int64 connecting_clients = 106;
     optional string connection_id = 107;
-    optional string destination_server_id = 108;//LowCardinality
+    optional string destination_server_id = 108;
     optional int64 elapsed_time = 109;
-    optional string error = 110; //LowCardinality
-    repeated string filtered_ice_candidates = 111; //LowCardinality
-    optional string fronting_provider_id = 112;//LowCardinality
+    optional string error = 110;
+    repeated string filtered_ice_candidates = 111;
+    optional string fronting_provider_id = 112;
     optional bool has_IPv6 = 113;
     optional bool has_common_compartment_ids = 114;
     optional bool has_personal_compartment_ids = 115;
     optional bool has_private_IP = 116;
-    repeated string ice_candidate_types = 117; //LowCardinality
+    repeated string ice_candidate_types = 117;
     optional bool is_priority = 118;
     optional int64 limit_downstream_bytes_per_second = 119;
     optional int64 limit_upstream_bytes_per_second = 120;
     optional int64 max_clients = 121;
-    optional string nat_type = 122; //LowCardinality
-    optional string network_type = 123; //LowCardinality
-    optional string new_tactics_tag = 124; //LowCardinality
+    optional string nat_type = 122;
+    optional string network_type = 123;
+    optional string new_tactics_tag = 124;
     optional int64 offer_match_index = 125;
     optional int64 offer_queue_size = 126;
     optional int64 peak_downstream_bytes_per_second = 127;
     optional int64 peak_upstream_bytes_per_second = 128;
-    repeated string port_mapping_types = 129; //LowCardinality
+    repeated string port_mapping_types = 129;
     optional bool preferred_nat_match = 130;
     optional int32 protocol_version = 131;
-    optional string proxy_id = 132; //LowCardinality
-    optional string proxy_nat_type = 133; //LowCardinality
-    repeated string proxy_port_mapping_types = 134; //LowCardinality
-    optional string server_id = 135; //LowCardinality
-    optional string stored_tactics_tag = 136; //LowCardinality
+    optional string proxy_id = 132;
+    optional string proxy_nat_type = 133;
+    repeated string proxy_port_mapping_types = 134;
+    optional string server_id = 135;
+    optional string stored_tactics_tag = 136;
     optional bool timed_out = 137;
-    optional string meek_server_http_version = 138; //LowCardinality
+    optional string meek_server_http_version = 138;
 }

+ 46 - 46
psiphon/server/proto/ca.psiphon.psiphond/inproxy_dial_params.proto

@@ -5,95 +5,95 @@ package ca.psiphon.psiphond;
 option go_package = "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/server/pb/psiphond";
 
 message InproxyDialParams {
-    optional string inproxy_broker_client_bpf = 1; //LowCardinality
-    optional string inproxy_broker_dial_address = 2; //LowCardinality
+    optional string inproxy_broker_client_bpf = 1;
+    optional string inproxy_broker_dial_address = 2;
     optional int64 inproxy_broker_dns_attempt = 3;
-    optional string inproxy_broker_dns_preferred = 4; //LowCardinality
-    optional string inproxy_broker_dns_preresolved = 5; //LowCardinality
+    optional string inproxy_broker_dns_preferred = 4;
+    optional string inproxy_broker_dns_preresolved = 5;
     optional int64 inproxy_broker_dns_qname_mismatches = 6;
     optional bool inproxy_broker_dns_qname_must_match = 7;
     optional bool inproxy_broker_dns_qname_random_casing = 8;
-    optional string inproxy_broker_dns_transform = 9; //LowCardinality
+    optional string inproxy_broker_dns_transform = 9;
     optional int64 inproxy_broker_downstream_bytes_fragmented = 10;
-    optional string inproxy_broker_fronting_provider_id = 11; //LowCardinality
-    optional string inproxy_broker_host_header = 12; //LowCardinality
-    optional string inproxy_broker_http_transform = 13; //LowCardinality
-    optional string inproxy_broker_id = 14; //LowCardinality
+    optional string inproxy_broker_fronting_provider_id = 11;
+    optional string inproxy_broker_host_header = 12;
+    optional string inproxy_broker_http_transform = 13;
+    optional string inproxy_broker_id = 14;
     optional bool inproxy_broker_is_replay = 15;
     optional bool inproxy_broker_is_reuse = 16;
-    optional string inproxy_broker_resolved_ip_address = 17; //LowCardinality
-    optional string inproxy_broker_sni_server_name = 18; //LowCardinality
+    optional string inproxy_broker_resolved_ip_address = 17;
+    optional string inproxy_broker_sni_server_name = 18;
     optional bool inproxy_broker_tls_fragmented = 19;
-    optional string inproxy_broker_tls_profile = 20; //LowCardinality
-    optional string inproxy_broker_tls_version = 21; //LowCardinality
+    optional string inproxy_broker_tls_profile = 20;
+    optional string inproxy_broker_tls_version = 21;
     optional bool inproxy_broker_transformed_host_name = 22;
-    optional string inproxy_broker_transport = 23; //LowCardinality
+    optional string inproxy_broker_transport = 23;
     optional int64 inproxy_broker_upstream_bytes_fragmented = 24;
-    optional string inproxy_broker_user_agent = 25; //LowCardinality
-    optional string inproxy_client_nat_type = 26; //LowCardinality
-    repeated string inproxy_client_port_mapping_types = 27; //LowCardinality
+    optional string inproxy_broker_user_agent = 25;
+    optional string inproxy_client_nat_type = 26;
+    repeated string inproxy_client_port_mapping_types = 27;
     optional string inproxy_connection_id = 28;
     optional int64 inproxy_dial_broker_offer_duration = 29;
     optional int64 inproxy_dial_failed_attempts_duration = 30;
     optional int64 inproxy_dial_nat_disovery_duration = 31;
     optional int64 inproxy_dial_webrtc_connection_duration = 32;
     optional int64 inproxy_dial_webrtc_ice_gathering_duration = 33;
-    optional bool inproxy_matched_common_compartments = 34; //LowCardinality
+    optional bool inproxy_matched_common_compartments = 34;
     optional bool inproxy_matched_personal_compartments = 35;
-    optional string inproxy_proxy_applied_tactics_tag = 36; //LowCardinality
-    optional string inproxy_proxy_asn = 37; //LowCardinality
-    optional string inproxy_proxy_aso = 38; //LowCardinality
-    optional string inproxy_proxy_city = 39; //LowCardinality
-    optional string inproxy_proxy_client_build_rev = 40; //LowCardinality
-    optional string inproxy_proxy_client_platform = 41; //LowCardinality
-    optional int64 inproxy_proxy_client_version = 42; //LowCardinality
+    optional string inproxy_proxy_applied_tactics_tag = 36;
+    optional string inproxy_proxy_asn = 37;
+    optional string inproxy_proxy_aso = 38;
+    optional string inproxy_proxy_city = 39;
+    optional string inproxy_proxy_client_build_rev = 40;
+    optional string inproxy_proxy_client_platform = 41;
+    optional int64 inproxy_proxy_client_version = 42;
     optional int64 inproxy_proxy_connected_clients = 43;
     optional int64 inproxy_proxy_connecting_clients = 44;
     optional string inproxy_proxy_device_location = 45;
-    optional string inproxy_proxy_device_region = 46; //LowCardinality
-    optional string inproxy_proxy_features = 47; //LowCardinality
-    optional string inproxy_proxy_fronting_provider_id = 48; //LowCardinality
+    optional string inproxy_proxy_device_region = 46;
+    optional string inproxy_proxy_features = 47;
+    optional string inproxy_proxy_fronting_provider_id = 48;
     optional string inproxy_proxy_id = 49;
     optional bool inproxy_proxy_is_priority = 50;
-    optional string inproxy_proxy_isp = 51; //LowCardinality
+    optional string inproxy_proxy_isp = 51;
     optional int64 inproxy_proxy_limit_downstream_bytes_per_second = 52;
     optional int64 inproxy_proxy_limit_upstream_bytes_per_second = 53;
     optional int64 inproxy_proxy_max_clients = 54;
-    optional string inproxy_proxy_nat_type = 55; //LowCardinality
-    optional string inproxy_proxy_network_type = 56; //LowCardinality
+    optional string inproxy_proxy_nat_type = 55;
+    optional string inproxy_proxy_network_type = 56;
     optional int64 inproxy_proxy_peak_downstream_bytes_per_second = 57;
     optional int64 inproxy_proxy_peak_upstream_bytes_per_second = 58;
-    repeated string inproxy_proxy_port_mapping_types = 59; //LowCardinality
-    optional string inproxy_proxy_propagation_channel_id = 60; //LowCardinality
+    repeated string inproxy_proxy_port_mapping_types = 59;
+    optional string inproxy_proxy_propagation_channel_id = 60;
     optional int64 inproxy_proxy_protocol_version = 61;
-    optional string inproxy_proxy_region = 62; //LowCardinality
+    optional string inproxy_proxy_region = 62;
     optional string inproxy_proxy_session_id = 63;
-    optional string inproxy_proxy_sponsor_id = 64; //LowCardinality
-    optional string inproxy_proxy_stored_tactics_tag = 65; //LowCardinality
-    repeated string inproxy_proxy_client_features = 66; //LowCardinality
+    optional string inproxy_proxy_sponsor_id = 64;
+    optional string inproxy_proxy_stored_tactics_tag = 65;
+    repeated string inproxy_proxy_client_features = 66;
     optional int64 inproxy_webrtc_decoy_messages_received = 67;
     optional int64 inproxy_webrtc_decoy_messages_sent = 68;
     optional int64 inproxy_webrtc_dns_attempt = 69;
-    optional string inproxy_webrtc_dns_preferred = 70; //LowCardinality
-    optional string inproxy_webrtc_dns_preresolved = 71; //LowCardinality
+    optional string inproxy_webrtc_dns_preferred = 70;
+    optional string inproxy_webrtc_dns_preresolved = 71;
     optional int64 inproxy_webrtc_dns_qname_mismatches = 72;
     optional bool inproxy_webrtc_dns_qname_must_match = 73;
     optional bool inproxy_webrtc_dns_qname_random_casing = 74;
-    optional string inproxy_webrtc_dns_transform = 75; //LowCardinality
+    optional string inproxy_webrtc_dns_transform = 75;
     optional bool inproxy_webrtc_local_ice_candidate_is_IPv6 = 76;
     optional bool inproxy_webrtc_local_ice_candidate_is_initiator = 77;
     optional int64 inproxy_webrtc_local_ice_candidate_port = 78;
-    optional string inproxy_webrtc_local_ice_candidate_type = 79; //LowCardinality
+    optional string inproxy_webrtc_local_ice_candidate_type = 79;
     optional int64 inproxy_webrtc_padded_messages_received = 80;
     optional int64 inproxy_webrtc_padded_messages_sent = 81;
     optional bool inproxy_webrtc_randomize_dtls = 82;
     optional bool inproxy_webrtc_remote_ice_candidate_is_IPv6 = 83;
     optional int64 inproxy_webrtc_remote_ice_candidate_port = 84;
-    optional string inproxy_webrtc_remote_ice_candidate_type = 85; //LowCardinality
-    optional string inproxy_webrtc_stun_server = 86; //LowCardinality
-    optional string inproxy_webrtc_stun_server_RFC5780 = 87; //LowCardinality
-    optional string inproxy_webrtc_stun_server_RFC5780_resolved_ip_address = 88; //LowCardinality
-    optional string inproxy_webrtc_stun_server_resolved_ip_address = 89; //LowCardinality
+    optional string inproxy_webrtc_remote_ice_candidate_type = 85;
+    optional string inproxy_webrtc_stun_server = 86;
+    optional string inproxy_webrtc_stun_server_RFC5780 = 87;
+    optional string inproxy_webrtc_stun_server_RFC5780_resolved_ip_address = 88;
+    optional string inproxy_webrtc_stun_server_resolved_ip_address = 89;
     optional bool inproxy_webrtc_use_media_streams = 90;
 }
 

+ 9 - 9
psiphon/server/proto/ca.psiphon.psiphond/irregular_tunnel.proto

@@ -11,17 +11,17 @@ message IrregularTunnel {
 
     // Fields 1-99 are reserved for field groupings.
 
-    optional string duplicate_authorization_client_asn = 100; //LowCardinality
-    optional string duplicate_authorization_client_aso = 101; //LowCardinality
-    optional string duplicate_authorization_client_city = 102; //LowCardinality
-    optional string duplicate_authorization_client_isp = 103; //LowCardinality
-    optional string duplicate_authorization_client_region = 104; //LowCardinality
+    optional string duplicate_authorization_client_asn = 100;
+    optional string duplicate_authorization_client_aso = 101;
+    optional string duplicate_authorization_client_city = 102;
+    optional string duplicate_authorization_client_isp = 103;
+    optional string duplicate_authorization_client_region = 104;
     optional string duplicate_authorization_id = 105;
-    optional string duplicate_client_ip = 106; //LowCardinality
+    optional string duplicate_client_ip = 106;
     optional int64 duplicate_elapsed_time_ms = 107;
     optional string duplicate_seed = 108;
-    optional string duplicate_seed_type = 109; //LowCardinality
+    optional string duplicate_seed_type = 109;
     optional uint32 listener_port_number = 110;
-    optional string listener_protocol = 111; //LowCardinality
-    optional string tunnel_error = 112; //LowCardinality
+    optional string listener_protocol = 111;
+    optional string tunnel_error = 112;
 }

+ 4 - 4
psiphon/server/proto/ca.psiphon.psiphond/psiphond.proto

@@ -22,10 +22,10 @@ option go_package = "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/server/
 message Psiphond {
   optional google.protobuf.Timestamp timestamp = 1;
 
-  optional string host_id = 2; //LowCardinality
-  optional string host_type = 3; //LowCardinality
-  optional string host_build_rev = 4; //LowCardinality
-  optional string provider = 5; //LowCardinality
+  optional string host_id = 2;
+  optional string host_type = 3;
+  optional string host_build_rev = 4;
+  optional string provider = 5;
  
   oneof metric {
     ca.psiphon.psiphond.DomainBytes domain_bytes = 101;

+ 2 - 2
psiphon/server/proto/ca.psiphon.psiphond/remote_server_list.proto

@@ -18,7 +18,7 @@ message RemoteServerList {
     optional int64 bytes = 101;
     optional google.protobuf.Timestamp client_download_timestamp = 102;
     optional int64 duration = 103;
-    optional string etag = 104; //LowCardinality
+    optional string etag = 104;
     optional bool tunneled = 105;
-    optional string url = 106; //LowCardinality
+    optional string url = 106;
 }

+ 3 - 3
psiphon/server/proto/ca.psiphon.psiphond/server_blocklist.proto

@@ -11,7 +11,7 @@ message ServerBlocklistHit {
 
     // Fields 1-99 are reserved for field groupings.
 
-    optional string blocklist_ip_address = 100; //LowCardinality
-    optional string blocklist_source = 101; //LowCardinality
-    optional string blocklist_subject = 102; //LowCardinality
+    optional string blocklist_ip_address = 100;
+    optional string blocklist_source = 101;
+    optional string blocklist_subject = 102;
 }

+ 3 - 3
psiphon/server/proto/ca.psiphon.psiphond/server_load.proto

@@ -9,8 +9,8 @@ option go_package = "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/server/
 message ServerLoadProtocol {
   // Fields 1-99 are reserved for field groupings.
 
-  optional string region = 100; //LowCardinality
-  optional string protocol = 101; //LowCardinality
+  optional string region = 100;
+  optional string protocol = 101;
 
   optional int64 accepted_clients = 102;
   optional int64 established_clients = 103;
@@ -19,7 +19,7 @@ message ServerLoadProtocol {
 message ServerLoadDNS {
   // Fields 1-99 are reserved for field groupings.
 
-  optional string dns_server = 100; //LowCardinality
+  optional string dns_server = 100;
   optional int64 dns_count = 101; 
   optional int64 dns_duration = 102;
   optional int64 dns_failed_count = 103;

+ 0 - 2
psiphon/server/proto/ca.psiphon.psiphond/server_panic.proto

@@ -8,6 +8,4 @@ message ServerPanic {
     // Fields 1-99 are reserved for field groupings.
 
     optional string panic = 100;
-    optional string recover_value = 101;
-    optional string stack = 102;
 }

+ 3 - 3
psiphon/server/proto/ca.psiphon.psiphond/server_tunnel.proto

@@ -68,9 +68,9 @@ message ServerTunnel {
     optional int64 meek_peak_cached_response_size = 145;
     optional int64 meek_peak_response_size = 146;
     optional int64 meek_underlying_connection_count = 147;
-    optional string meek_server_http_version = 148; //LowCardinality
+    optional string meek_server_http_version = 148;
 
-    optional string new_tactics_tag = 149; //LowCardinality
+    optional string new_tactics_tag = 149;
 
     optional int64 peak_concurrent_dialing_port_forward_count_tcp = 150;
     optional int64 peak_concurrent_port_forward_count_tcp = 151;
@@ -90,7 +90,7 @@ message ServerTunnel {
 
     optional bool split_tunnel = 164;
     optional google.protobuf.Timestamp start_time = 165;
-    optional string station_ip_address = 166; //LowCardinality
+    optional string station_ip_address = 166;
 
     optional int64 total_packet_tunnel_channel_count = 167;
     optional int64 total_port_forward_count_tcp = 168;

+ 4 - 4
psiphon/server/proto/ca.psiphon.psiphond/tactics.proto

@@ -14,8 +14,8 @@ message Tactics {
     // Fields 1-99 are reserved for field groupings.
 
     optional bool is_tactics_request = 100;
-    optional string new_tactics_tag = 101; //LowCardinality
-    optional string stored_tactics_tag = 102; //LowCardinality
+    optional string new_tactics_tag = 101;
+    optional string stored_tactics_tag = 102;
 }
 
 message TacticsSpeedTest {
@@ -26,6 +26,6 @@ message TacticsSpeedTest {
     optional int64 round_trip_time_ms = 100;
     optional int64 bytes_down = 101;
     optional int64 bytes_up = 102;
-    optional string relay_protocol = 103; //LowCardinality
-    optional string server_region = 104; //LowCardinality
+    optional string relay_protocol = 103;
+    optional string server_region = 104;
 }

+ 199 - 184
psiphon/server/protobufConverter.go

@@ -7,6 +7,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/errors"
 	"github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/inproxy"
 	"github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/protocol"
 	pb "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/server/pb/psiphond"
@@ -15,75 +16,73 @@ import (
 	"google.golang.org/protobuf/types/known/timestamppb"
 )
 
-// FieldGroupConfig defines which field groups each message needs
-type FieldGroupConfig struct {
-	BaseParams        bool
-	DialParams        bool
-	InproxyDialParams bool
+// protobufFieldGroupConfig defines which field groups each message needs
+type protobufFieldGroupConfig struct {
+	baseParams        bool
+	dialParams        bool
+	inproxyDialParams bool
 }
 
-// messageFieldGroups defines field group requirements for each message type
-var messageFieldGroups = map[string]FieldGroupConfig{
+// protobufMessageFieldGroups defines field group requirements for each message type
+var protobufMessageFieldGroups = map[string]protobufFieldGroupConfig{
 	"server_tunnel": {
-		BaseParams:        true,
-		DialParams:        true,
-		InproxyDialParams: true,
+		baseParams:        true,
+		dialParams:        true,
+		inproxyDialParams: true,
 	},
 	"unique_user": {
-		BaseParams: true,
+		baseParams: true,
 	},
 	"domain_bytes": {
-		BaseParams: true,
+		baseParams: true,
 	},
 	"server_blocklist_hit": {
-		BaseParams: true,
+		baseParams: true,
 	},
 	"server_load":          {},
 	"server_load_protocol": {},
 	"server_load_dns":      {},
 	"irregular_tunnel": {
-		BaseParams: true,
+		baseParams: true,
 	},
 	"failed_tunnel": {
-		BaseParams:        true,
-		DialParams:        true,
-		InproxyDialParams: true,
+		baseParams:        true,
+		dialParams:        true,
+		inproxyDialParams: true,
 	},
 	"remote_server_list": {
-		BaseParams: true,
-		DialParams: true,
+		baseParams: true,
+		dialParams: true,
 	},
-	"panic": {},
 	"tactics": {
-		BaseParams: true,
-		DialParams: true,
+		baseParams: true,
+		dialParams: true,
 	},
 	"inproxy_broker": {
-		BaseParams: true,
+		baseParams: true,
 	},
 }
 
-// routedMsg returns a new pointer to a populated Router protobuf message.
-// The error paths in this function should never be reached, but in rare
-// cases where they do, instead of returning an error, we panic, and allow
-// the existing recovery and logging message to capture the error.
-func routedMsg(msg proto.Message) *pbr.Router {
+// NewProtobufRoutedMessage returns a populated Router protobuf message.
+func NewProtobufRoutedMessage(
+	destinationPrefix string, msg proto.Message) (*pbr.Router, error) {
+
 	md := msg.ProtoReflect().Descriptor()
 	metric := md.Oneofs().ByName("metric")
 	if metric == nil {
-		panic("cannot find oneof field: metric")
+		return nil, errors.TraceNew("cannot find oneof field: metric")
 	}
 
 	messageType := string(md.FullName())
 
 	metricType := msg.ProtoReflect().WhichOneof(metric).TextName()
+
 	destination := strings.ToLower(strings.ReplaceAll(
-		fmt.Sprintf("%s-%s-%s", logDestinationPrefix, md.Name(), metricType), "_", "-",
-	))
+		fmt.Sprintf("%s-%s-%s", destinationPrefix, md.Name(), metricType), "_", "-"))
 
 	serialized, err := proto.Marshal(msg)
 	if err != nil {
-		panic(fmt.Errorf("failed to serialize inner protobuf message to bytes: %w", err))
+		return nil, errors.Trace(err)
 	}
 
 	return &pbr.Router{
@@ -91,11 +90,27 @@ func routedMsg(msg proto.Message) *pbr.Router {
 		MessageType: &messageType,
 		Key:         []byte(logHostID),
 		Value:       serialized,
+	}, nil
+}
+
+// newProtobufRoutedMessage returns a new pointer to a populated Router
+// protobuf message. The error paths in this function should never be
+// reached, but in rare cases where they do, instead of returning an error,
+// we panic, and allow the existing recovery and logging message to capture
+// the error.
+func newProtobufRoutedMessage(msg proto.Message) *pbr.Router {
+
+	routedMsg, err := NewProtobufRoutedMessage(logDestinationPrefix, msg)
+	if err != nil {
+		panic(err.Error())
 	}
+
+	return routedMsg
 }
 
-// newPsiphondWrapper returns a new pointer to a Psiphond protobuf message with the common fields populated.
-func newPsiphondWrapper(ts *timestamppb.Timestamp, hostType string) *pb.Psiphond {
+// newPsiphondProtobufMessageWrapper returns a new pointer to a Psiphond
+// protobuf message with the common fields populated.
+func newPsiphondProtobufMessageWrapper(ts *timestamppb.Timestamp, hostType string) *pb.Psiphond {
 	wrapper := &pb.Psiphond{}
 
 	// Set timestamp (current time if not provided)
@@ -116,8 +131,8 @@ func newPsiphondWrapper(ts *timestamppb.Timestamp, hostType string) *pb.Psiphond
 	return wrapper
 }
 
-// LogFieldsToProtobuf converts a LogFields map to a Psiphond wrapper message.
-func LogFieldsToProtobuf(logFields LogFields) []*pbr.Router {
+// logFieldsToProtobuf converts a LogFields map to a Psiphond wrapper message.
+func logFieldsToProtobuf(logFields LogFields) []*pbr.Router {
 	eventName, ok := logFields["event_name"].(string)
 	if !ok {
 		return nil
@@ -139,13 +154,13 @@ func LogFieldsToProtobuf(logFields LogFields) []*pbr.Router {
 		hostType = "psiphond"
 	}
 
-	psiphondWrapped := newPsiphondWrapper(pbTimestamp, hostType)
+	psiphondWrapped := newPsiphondProtobufMessageWrapper(pbTimestamp, hostType)
 
 	// Create and populate the specific metric message.
 	switch eventName {
 	case "server_tunnel":
 		msg := &pb.ServerTunnel{}
-		populateProtobufMessage(logFields, msg, eventName)
+		protobufPopulateMessage(logFields, msg, eventName)
 
 		// Capture the tunnel ID once here to avoid looking it up for every sub-message.
 		tunnelID := msg.TunnelId
@@ -153,7 +168,7 @@ func LogFieldsToProtobuf(logFields LogFields) []*pbr.Router {
 		// Populate and append the initial server tunnel protobuf message.
 		psiphondWrapped.Metric = &pb.Psiphond_ServerTunnel{ServerTunnel: msg}
 
-		out = append(out, routedMsg(psiphondWrapped))
+		out = append(out, newProtobufRoutedMessage(psiphondWrapped))
 
 		// If this message includes asn_dest_bytes_* maps, emit
 		// one protobuf ServerTunnelASNDestBytes per ASN.
@@ -181,10 +196,10 @@ func LogFieldsToProtobuf(logFields LogFields) []*pbr.Router {
 					msg.DestBytesDownUdp = &value
 				}
 
-				psiphondWrapped = newPsiphondWrapper(pbTimestamp, hostType)
+				psiphondWrapped = newPsiphondProtobufMessageWrapper(pbTimestamp, hostType)
 				psiphondWrapped.Metric = &pb.Psiphond_ServerTunnelAsnDestBytes{ServerTunnelAsnDestBytes: msg}
 
-				out = append(out, routedMsg(psiphondWrapped))
+				out = append(out, newProtobufRoutedMessage(psiphondWrapped))
 			}
 		}
 
@@ -194,11 +209,11 @@ func LogFieldsToProtobuf(logFields LogFields) []*pbr.Router {
 		return out
 	case "unique_user":
 		msg := &pb.UniqueUser{}
-		populateProtobufMessage(logFields, msg, eventName)
+		protobufPopulateMessage(logFields, msg, eventName)
 		psiphondWrapped.Metric = &pb.Psiphond_UniqueUser{UniqueUser: msg}
 	case "domain_bytes":
 		msg := &pb.DomainBytes{}
-		populateProtobufMessage(logFields, msg, eventName)
+		protobufPopulateMessage(logFields, msg, eventName)
 		psiphondWrapped.Metric = &pb.Psiphond_DomainBytes{DomainBytes: msg}
 	case "server_load":
 		if region, hasRegion := logFields["region"]; hasRegion {
@@ -221,25 +236,25 @@ func LogFieldsToProtobuf(logFields LogFields) []*pbr.Router {
 					}
 
 					if psiphondWrapped == nil {
-						psiphondWrapped = newPsiphondWrapper(pbTimestamp, hostType)
+						psiphondWrapped = newPsiphondProtobufMessageWrapper(pbTimestamp, hostType)
 					}
 
 					psiphondWrapped.Metric = &pb.Psiphond_ServerLoadProtocol{ServerLoadProtocol: msg}
 
-					out = append(out, routedMsg(psiphondWrapped))
+					out = append(out, newProtobufRoutedMessage(psiphondWrapped))
 					psiphondWrapped = nil
 				}
 			}
 		} else {
 			msg := &pb.ServerLoad{}
-			populateProtobufMessage(logFields, msg, eventName)
+			protobufPopulateMessage(logFields, msg, eventName)
 
 			if psiphondWrapped == nil {
-				psiphondWrapped = newPsiphondWrapper(pbTimestamp, hostType)
+				psiphondWrapped = newPsiphondProtobufMessageWrapper(pbTimestamp, hostType)
 			}
 
 			psiphondWrapped.Metric = &pb.Psiphond_ServerLoad{ServerLoad: msg}
-			out = append(out, routedMsg(psiphondWrapped))
+			out = append(out, newProtobufRoutedMessage(psiphondWrapped))
 			psiphondWrapped = nil
 		}
 
@@ -264,11 +279,11 @@ func LogFieldsToProtobuf(logFields LogFields) []*pbr.Router {
 				}
 
 				if psiphondWrapped == nil {
-					psiphondWrapped = newPsiphondWrapper(pbTimestamp, hostType)
+					psiphondWrapped = newPsiphondProtobufMessageWrapper(pbTimestamp, hostType)
 				}
 
 				psiphondWrapped.Metric = &pb.Psiphond_ServerLoadDns{ServerLoadDns: msg}
-				out = append(out, routedMsg(psiphondWrapped))
+				out = append(out, newProtobufRoutedMessage(psiphondWrapped))
 				psiphondWrapped = nil
 			}
 		}
@@ -279,84 +294,84 @@ func LogFieldsToProtobuf(logFields LogFields) []*pbr.Router {
 		return out
 	case "irregular_tunnel":
 		msg := &pb.IrregularTunnel{}
-		populateProtobufMessage(logFields, msg, eventName)
+		protobufPopulateMessage(logFields, msg, eventName)
 		psiphondWrapped.Metric = &pb.Psiphond_IrregularTunnel{IrregularTunnel: msg}
 	case "failed_tunnel":
 		msg := &pb.FailedTunnel{}
-		populateProtobufMessage(logFields, msg, eventName)
+		protobufPopulateMessage(logFields, msg, eventName)
 		psiphondWrapped.Metric = &pb.Psiphond_FailedTunnel{FailedTunnel: msg}
 	case "remote_server_list":
 		msg := &pb.RemoteServerList{}
-		populateProtobufMessage(logFields, msg, eventName)
+		protobufPopulateMessage(logFields, msg, eventName)
 		psiphondWrapped.Metric = &pb.Psiphond_RemoteServerList{RemoteServerList: msg}
 	case "panic":
 		msg := &pb.ServerPanic{}
-		populateProtobufMessage(logFields, msg, eventName)
+		protobufPopulateMessage(logFields, msg, eventName)
 		psiphondWrapped.Metric = &pb.Psiphond_ServerPanic{ServerPanic: msg}
 	case "tactics":
 		msg := &pb.Tactics{}
-		populateProtobufMessage(logFields, msg, eventName)
+		protobufPopulateMessage(logFields, msg, eventName)
 		psiphondWrapped.Metric = &pb.Psiphond_Tactics{Tactics: msg}
 	case "inproxy_broker":
 		msg := &pb.InproxyBroker{}
-		populateProtobufMessage(logFields, msg, eventName)
+		protobufPopulateMessage(logFields, msg, eventName)
 		psiphondWrapped.Metric = &pb.Psiphond_InproxyBroker{InproxyBroker: msg}
 	case "server_blocklist_hit":
 		msg := &pb.ServerBlocklistHit{}
-		populateProtobufMessage(logFields, msg, eventName)
+		protobufPopulateMessage(logFields, msg, eventName)
 		psiphondWrapped.Metric = &pb.Psiphond_ServerBlocklist{ServerBlocklist: msg}
 	}
 
 	// Single append for all non-special cases.
 	if psiphondWrapped != nil {
-		out = append(out, routedMsg(psiphondWrapped))
+		out = append(out, newProtobufRoutedMessage(psiphondWrapped))
 	}
 
 	return out
 }
 
-// populateBaseParams populates BaseParams from LogFields.
-func populateBaseParams(logFields LogFields) *pb.BaseParams {
+// protobufPopulateBaseParams populates BaseParams from LogFields.
+func protobufPopulateBaseParams(logFields LogFields) *pb.BaseParams {
 	msg := &pb.BaseParams{}
-	populateMessageFromFields(logFields, msg)
+	protobufPopulateMessageFromFields(logFields, msg)
 
 	return msg
 }
 
-// populateDialParams populates DialParams from LogFields.
-func populateDialParams(logFields LogFields) *pb.DialParams {
+// protobufPopulateDialParams populates DialParams from LogFields.
+func protobufPopulateDialParams(logFields LogFields) *pb.DialParams {
 	msg := &pb.DialParams{}
-	populateMessageFromFields(logFields, msg)
+	protobufPopulateMessageFromFields(logFields, msg)
 
 	return msg
 }
 
-// populateInproxyDialParams populates InproxyDialParams from LogFields.
-func populateInproxyDialParams(logFields LogFields) *pb.InproxyDialParams {
+// protobufPopulateInproxyDialParams populates InproxyDialParams from LogFields.
+func protobufPopulateInproxyDialParams(logFields LogFields) *pb.InproxyDialParams {
 	msg := &pb.InproxyDialParams{}
-	populateMessageFromFields(logFields, msg)
+	protobufPopulateMessageFromFields(logFields, msg)
 
 	return msg
 }
 
-// populateProtobufMessage is the single function that handles all protobuf message types.
-func populateProtobufMessage(logFields LogFields, msg proto.Message, eventName string) {
-	config, exists := messageFieldGroups[eventName]
+// protobufPopulateMessage is the single function that handles all protobuf message types.
+func protobufPopulateMessage(logFields LogFields, msg proto.Message, eventName string) {
+	config, exists := protobufMessageFieldGroups[eventName]
 	if !exists {
 		// Fallback to reflection-only population.
-		populateMessageFromFields(logFields, msg)
+		protobufPopulateMessageFromFields(logFields, msg)
 		return
 	}
 
 	// Populate field groups based on configuration.
-	populateFieldGroups(logFields, msg, config)
+	protobufPopulateFieldGroups(logFields, msg, config)
 
 	// Populate remaining fields using reflection.
-	populateMessageFromFields(logFields, msg)
+	protobufPopulateMessageFromFields(logFields, msg)
 }
 
-// populateFieldGroups uses reflection to set field group sub-messages based on configuration.
-func populateFieldGroups(logFields LogFields, msg proto.Message, config FieldGroupConfig) {
+// protobufPopulateFieldGroups uses reflection to set field group sub-messages based on configuration.
+func protobufPopulateFieldGroups(logFields LogFields, msg proto.Message, config protobufFieldGroupConfig) {
 	msgReflectValue := reflect.ValueOf(msg)
 	if msgReflectValue.Kind() != reflect.Pointer || msgReflectValue.IsNil() {
 		return
@@ -375,23 +390,23 @@ func populateFieldGroups(logFields LogFields, msg proto.Message, config FieldGro
 
 		switch fieldType.Name {
 		case "BaseParams":
-			if config.BaseParams {
-				field.Set(reflect.ValueOf(populateBaseParams(logFields)))
+			if config.baseParams {
+				field.Set(reflect.ValueOf(protobufPopulateBaseParams(logFields)))
 			}
 		case "DialParams":
-			if config.DialParams {
-				field.Set(reflect.ValueOf(populateDialParams(logFields)))
+			if config.dialParams {
+				field.Set(reflect.ValueOf(protobufPopulateDialParams(logFields)))
 			}
 		case "InproxyDialParams":
-			if config.InproxyDialParams {
-				field.Set(reflect.ValueOf(populateInproxyDialParams(logFields)))
+			if config.inproxyDialParams {
+				field.Set(reflect.ValueOf(protobufPopulateInproxyDialParams(logFields)))
 			}
 		}
 	}
 }
 
-// populateMessageFromFields uses reflection to populate protobuf message fields from LogFields.
-func populateMessageFromFields(logFields LogFields, msg proto.Message) {
+// protobufPopulateMessageFromFields uses reflection to populate protobuf message fields from LogFields.
+func protobufPopulateMessageFromFields(logFields LogFields, msg proto.Message) {
 	msgReflectValue := reflect.ValueOf(msg)
 	if msgReflectValue.Kind() != reflect.Pointer || msgReflectValue.IsNil() {
 		return
@@ -424,7 +439,7 @@ func populateMessageFromFields(logFields LogFields, msg proto.Message) {
 		}
 
 		// Handle special field names that might be mapped differently.
-		if err := setFieldValue(field, fieldType, logValue); err != nil {
+		if err := setProtobufFieldValue(field, fieldType, logValue); err != nil {
 			panic(fmt.Errorf("failed to set field value: %w", err))
 		}
 	}
@@ -443,41 +458,41 @@ func getProtobufFieldName(protoTag string) string {
 	return ""
 }
 
-// ConversionError represents an error during type conversion
-type ConversionError struct {
-	FieldName string
-	FromType  string
-	ToType    string
-	Value     any
-	Err       error
+// protobufConversionError represents an error during type conversion
+type protobufConversionError struct {
+	fieldName string
+	fromType  string
+	toType    string
+	value     any
+	err       error
 }
 
-func (e *ConversionError) Error() string {
+func (e *protobufConversionError) Error() string {
 	return fmt.Sprintf("failed to convert field %s from %s to %s (value: %v): %v",
-		e.FieldName, e.FromType, e.ToType, e.Value, e.Err)
+		e.fieldName, e.fromType, e.toType, e.value, e.err)
 }
 
-// setFieldValue sets a protobuf field value from a LogFields value.
-func setFieldValue(field reflect.Value, fieldType reflect.StructField, logValue any) error {
+// setProtobufFieldValue sets a protobuf field value from a LogFields value.
+func setProtobufFieldValue(field reflect.Value, fieldType reflect.StructField, logValue any) error {
 	if logValue == nil {
 		return nil // Don't set anything for nil values
 	}
 
 	// Handle pointers by creating a new instance and setting recursively
 	if field.Kind() == reflect.Ptr {
-		return setPointerField(field, fieldType, logValue)
+		return setProtobufPointerField(field, fieldType, logValue)
 	}
 
-	return setPrimitiveField(field, fieldType, logValue)
+	return setProtobufPrimitiveField(field, fieldType, logValue)
 }
 
-// setPointerField handles pointer fields by creating new instances
-func setPointerField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
+// setProtobufPointerField handles pointer fields by creating new instances
+func setProtobufPointerField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
 	elemType := field.Type().Elem()
 
 	// Special handling for timestamppb.Timestamp
 	if elemType == reflect.TypeOf(timestamppb.Timestamp{}) {
-		ts, err := convertToTimestamp(logValue)
+		ts, err := protobufConvertToTimestamp(logValue)
 		if err != nil {
 			return err
 		}
@@ -491,7 +506,7 @@ func setPointerField(field reflect.Value, fieldType reflect.StructField, logValu
 
 	// For primitive pointer types, create a new instance and set it
 	newVal := reflect.New(elemType)
-	err := setPrimitiveField(newVal.Elem(), fieldType, logValue)
+	err := setProtobufPrimitiveField(newVal.Elem(), fieldType, logValue)
 	if err != nil {
 		return err
 	}
@@ -501,43 +516,43 @@ func setPointerField(field reflect.Value, fieldType reflect.StructField, logValu
 	return nil
 }
 
-// setPrimitiveField handles non-pointer fields
-func setPrimitiveField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
+// setProtobufPrimitiveField handles non-pointer fields
+func setProtobufPrimitiveField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
 	switch field.Kind() {
 	case reflect.String:
-		return setStringField(field, fieldType, logValue)
+		return setProtobufStringField(field, fieldType, logValue)
 	case reflect.Int, reflect.Int32, reflect.Int64:
-		return setIntField(field, fieldType, logValue)
+		return setProtobufIntField(field, fieldType, logValue)
 	case reflect.Uint, reflect.Uint32, reflect.Uint64:
-		return setUintField(field, fieldType, logValue)
+		return setProtobufUintField(field, fieldType, logValue)
 	case reflect.Float64:
-		return setFloat64Field(field, fieldType, logValue)
+		return setProtobufFloat64Field(field, fieldType, logValue)
 	case reflect.Bool:
-		return setBoolField(field, fieldType, logValue)
+		return setProtobufBoolField(field, fieldType, logValue)
 	case reflect.Map:
-		return setMapField(field, fieldType, logValue)
+		return setProtobufMapField(field, fieldType, logValue)
 	case reflect.Slice:
-		return setSliceField(field, fieldType, logValue)
+		return setProtobufSliceField(field, fieldType, logValue)
 	default:
-		return &ConversionError{
-			FieldName: fieldType.Name,
-			FromType:  fmt.Sprintf("%T", logValue),
-			ToType:    field.Kind().String(),
-			Value:     logValue,
-			Err:       fmt.Errorf("unsupported field kind"),
+		return &protobufConversionError{
+			fieldName: fieldType.Name,
+			fromType:  fmt.Sprintf("%T", logValue),
+			toType:    field.Kind().String(),
+			value:     logValue,
+			err:       fmt.Errorf("unsupported field kind"),
 		}
 	}
 }
 
-func setStringField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
-	str, err := convertToString(logValue)
+func setProtobufStringField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
+	str, err := protobufConvertToString(logValue)
 	if err != nil {
-		return &ConversionError{
-			FieldName: fieldType.Name,
-			FromType:  fmt.Sprintf("%T", logValue),
-			ToType:    "string",
-			Value:     logValue,
-			Err:       err,
+		return &protobufConversionError{
+			fieldName: fieldType.Name,
+			fromType:  fmt.Sprintf("%T", logValue),
+			toType:    "string",
+			value:     logValue,
+			err:       err,
 		}
 	}
 
@@ -552,11 +567,11 @@ func setStringField(field reflect.Value, fieldType reflect.StructField, logValue
 	return nil
 }
 
-func setIntField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
-	convErr := &ConversionError{
-		FieldName: fieldType.Name,
-		FromType:  fmt.Sprintf("%T", logValue),
-		Value:     logValue,
+func setProtobufIntField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
+	convErr := &protobufConversionError{
+		fieldName: fieldType.Name,
+		fromType:  fmt.Sprintf("%T", logValue),
+		value:     logValue,
 	}
 
 	switch field.Kind() {
@@ -564,14 +579,14 @@ func setIntField(field reflect.Value, fieldType reflect.StructField, logValue an
 		// Because we extensively run on 64-bit architectures and protobuf
 		// doesn't have the architecture switching int type, for consistency,
 		// we always use int64 in our protos to represent int in go.
-		convErr.ToType = "int64"
+		convErr.toType = "int64"
 	case reflect.Int32:
-		convErr.ToType = "int32"
+		convErr.toType = "int32"
 	}
 
-	val, err := convertToInt64(logValue)
+	val, err := protobufConvertToInt64(logValue)
 	if err != nil {
-		convErr.Err = err
+		convErr.err = err
 		return convErr
 	}
 
@@ -579,11 +594,11 @@ func setIntField(field reflect.Value, fieldType reflect.StructField, logValue an
 	return nil
 }
 
-func setUintField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
-	convErr := &ConversionError{
-		FieldName: fieldType.Name,
-		FromType:  fmt.Sprintf("%T", logValue),
-		Value:     logValue,
+func setProtobufUintField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
+	convErr := &protobufConversionError{
+		fieldName: fieldType.Name,
+		fromType:  fmt.Sprintf("%T", logValue),
+		value:     logValue,
 	}
 
 	switch field.Kind() {
@@ -591,14 +606,14 @@ func setUintField(field reflect.Value, fieldType reflect.StructField, logValue a
 		// Because we extensively run on 64-bit architectures and protobuf
 		// doesn't have the architecture switching int type, for consistency,
 		// we always use uint64 in our protos to represent uint in go.
-		convErr.ToType = "uint64"
+		convErr.toType = "uint64"
 	case reflect.Uint32:
-		convErr.ToType = "uint32"
+		convErr.toType = "uint32"
 	}
 
-	val, err := convertToUint64(logValue)
+	val, err := protobufConvertToUint64(logValue)
 	if err != nil {
-		convErr.Err = err
+		convErr.err = err
 		return convErr
 	}
 
@@ -606,15 +621,15 @@ func setUintField(field reflect.Value, fieldType reflect.StructField, logValue a
 	return nil
 }
 
-func setFloat64Field(field reflect.Value, fieldType reflect.StructField, logValue any) error {
-	val, err := convertToFloat64(logValue)
+func setProtobufFloat64Field(field reflect.Value, fieldType reflect.StructField, logValue any) error {
+	val, err := protobufConvertToFloat64(logValue)
 	if err != nil {
-		return &ConversionError{
-			FieldName: fieldType.Name,
-			FromType:  fmt.Sprintf("%T", logValue),
-			ToType:    "float64",
-			Value:     logValue,
-			Err:       err,
+		return &protobufConversionError{
+			fieldName: fieldType.Name,
+			fromType:  fmt.Sprintf("%T", logValue),
+			toType:    "float64",
+			value:     logValue,
+			err:       err,
 		}
 	}
 
@@ -622,15 +637,15 @@ func setFloat64Field(field reflect.Value, fieldType reflect.StructField, logValu
 	return nil
 }
 
-func setBoolField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
-	val, err := convertToBool(logValue)
+func setProtobufBoolField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
+	val, err := protobufConvertToBool(logValue)
 	if err != nil {
-		return &ConversionError{
-			FieldName: fieldType.Name,
-			FromType:  fmt.Sprintf("%T", logValue),
-			ToType:    "bool",
-			Value:     logValue,
-			Err:       err,
+		return &protobufConversionError{
+			fieldName: fieldType.Name,
+			fromType:  fmt.Sprintf("%T", logValue),
+			toType:    "bool",
+			value:     logValue,
+			err:       err,
 		}
 	}
 
@@ -638,15 +653,15 @@ func setBoolField(field reflect.Value, fieldType reflect.StructField, logValue a
 	return nil
 }
 
-func setMapField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
+func setProtobufMapField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
 	mapValue, ok := logValue.(map[string]int64)
 	if !ok {
-		return &ConversionError{
-			FieldName: fieldType.Name,
-			FromType:  fmt.Sprintf("%T", logValue),
-			ToType:    "map[string]int64",
-			Value:     logValue,
-			Err:       fmt.Errorf("expected map[string]int64"),
+		return &protobufConversionError{
+			fieldName: fieldType.Name,
+			fromType:  fmt.Sprintf("%T", logValue),
+			toType:    "map[string]int64",
+			value:     logValue,
+			err:       fmt.Errorf("expected map[string]int64"),
 		}
 	}
 
@@ -660,19 +675,19 @@ func setMapField(field reflect.Value, fieldType reflect.StructField, logValue an
 	return nil
 }
 
-func setSliceField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
+func setProtobufSliceField(field reflect.Value, fieldType reflect.StructField, logValue any) error {
 	switch sliceValue := logValue.(type) {
 	case []any:
 		newSlice := make([]string, 0, len(sliceValue))
 		for i, elem := range sliceValue {
 			str, ok := elem.(string)
 			if !ok {
-				return &ConversionError{
-					FieldName: fieldType.Name,
-					FromType:  fmt.Sprintf("%T", elem),
-					ToType:    "string",
-					Value:     elem,
-					Err:       fmt.Errorf("slice element at index %d is not a string", i),
+				return &protobufConversionError{
+					fieldName: fieldType.Name,
+					fromType:  fmt.Sprintf("%T", elem),
+					toType:    "string",
+					value:     elem,
+					err:       fmt.Errorf("slice element at index %d is not a string", i),
 				}
 			}
 			newSlice = append(newSlice, str)
@@ -700,19 +715,19 @@ func setSliceField(field reflect.Value, fieldType reflect.StructField, logValue
 		field.Set(reflect.ValueOf(newSlice))
 
 	default:
-		return &ConversionError{
-			FieldName: fieldType.Name,
-			FromType:  fmt.Sprintf("%T", logValue),
-			ToType:    "[]string",
-			Value:     logValue,
-			Err:       fmt.Errorf("expected []any or []string"),
+		return &protobufConversionError{
+			fieldName: fieldType.Name,
+			fromType:  fmt.Sprintf("%T", logValue),
+			toType:    "[]string",
+			value:     logValue,
+			err:       fmt.Errorf("expected []any or []string"),
 		}
 	}
 
 	return nil
 }
 
-func convertToString(value any) (string, error) {
+func protobufConvertToString(value any) (string, error) {
 	switch v := value.(type) {
 	case string:
 		return v, nil
@@ -725,7 +740,7 @@ func convertToString(value any) (string, error) {
 	}
 }
 
-func convertToInt64(value any) (int64, error) {
+func protobufConvertToInt64(value any) (int64, error) {
 	switch v := value.(type) {
 	case int64:
 		return v, nil
@@ -759,7 +774,7 @@ func convertToInt64(value any) (int64, error) {
 	}
 }
 
-func convertToUint64(value any) (uint64, error) {
+func protobufConvertToUint64(value any) (uint64, error) {
 	switch v := value.(type) {
 	case uint64:
 		return v, nil
@@ -796,7 +811,7 @@ func convertToUint64(value any) (uint64, error) {
 	}
 }
 
-func convertToFloat64(value any) (float64, error) {
+func protobufConvertToFloat64(value any) (float64, error) {
 	switch v := value.(type) {
 	case float64:
 		return v, nil
@@ -822,7 +837,7 @@ func convertToFloat64(value any) (float64, error) {
 	}
 }
 
-func convertToBool(value any) (bool, error) {
+func protobufConvertToBool(value any) (bool, error) {
 	switch v := value.(type) {
 	case bool:
 		return v, nil
@@ -849,7 +864,7 @@ func convertToBool(value any) (bool, error) {
 	}
 }
 
-func convertToTimestamp(value any) (*timestamppb.Timestamp, error) {
+func protobufConvertToTimestamp(value any) (*timestamppb.Timestamp, error) {
 	switch v := value.(type) {
 	case string:
 		if v == "" || v == "None" {