76 lines
2.0 KiB
Go
76 lines
2.0 KiB
Go
package features
|
|
|
|
import "slices"
|
|
|
|
const (
|
|
FeatureSerializedHeaders = "serialized_headers"
|
|
FeatureQuickReconnects = "quick_reconnects"
|
|
FeatureAllowRemoteConfig = "allow_remote_config"
|
|
FeatureDatagramV2 = "support_datagram_v2"
|
|
FeaturePostQuantum = "postquantum"
|
|
FeatureQUICSupportEOF = "support_quic_eof"
|
|
FeatureManagementLogs = "management_logs"
|
|
FeatureDatagramV3_1 = "support_datagram_v3_1"
|
|
|
|
DeprecatedFeatureDatagramV3 = "support_datagram_v3" // Deprecated: TUN-9291
|
|
)
|
|
|
|
var defaultFeatures = []string{
|
|
FeatureAllowRemoteConfig,
|
|
FeatureSerializedHeaders,
|
|
FeatureDatagramV2,
|
|
FeatureQUICSupportEOF,
|
|
FeatureManagementLogs,
|
|
}
|
|
|
|
// List of features that are no longer in-use.
|
|
var deprecatedFeatures = []string{
|
|
DeprecatedFeatureDatagramV3,
|
|
}
|
|
|
|
// Features set by user provided flags
|
|
type staticFeatures struct {
|
|
PostQuantumMode *PostQuantumMode
|
|
}
|
|
|
|
type PostQuantumMode uint8
|
|
|
|
const (
|
|
// Prefer post quantum, but fallback if connection cannot be established
|
|
PostQuantumPrefer PostQuantumMode = iota
|
|
// If the user passes the --post-quantum flag, we override
|
|
// CurvePreferences to only support hybrid post-quantum key agreements.
|
|
PostQuantumStrict
|
|
)
|
|
|
|
type DatagramVersion string
|
|
|
|
const (
|
|
// DatagramV2 is the currently supported datagram protocol for UDP and ICMP packets
|
|
DatagramV2 DatagramVersion = FeatureDatagramV2
|
|
// DatagramV3 is a new datagram protocol for UDP and ICMP packets. It is not backwards compatible with datagram v2.
|
|
DatagramV3 DatagramVersion = FeatureDatagramV3_1
|
|
)
|
|
|
|
// Remove any duplicate features from the list and remove deprecated features
|
|
func dedupAndRemoveFeatures(features []string) []string {
|
|
// Convert the slice into a set
|
|
set := map[string]bool{}
|
|
for _, feature := range features {
|
|
// Remove deprecated features from the provided list
|
|
if slices.Contains(deprecatedFeatures, feature) {
|
|
continue
|
|
}
|
|
set[feature] = true
|
|
}
|
|
|
|
// Convert the set back into a slice
|
|
keys := make([]string, len(set))
|
|
i := 0
|
|
for str := range set {
|
|
keys[i] = str
|
|
i++
|
|
}
|
|
return keys
|
|
}
|