Browse Source

add udp port for relay

afeiszli 3 years ago
parent
commit
3fca11c1df
1 changed files with 30 additions and 8 deletions
  1. 30 8
      logic/peers.go

+ 30 - 8
logic/peers.go

@@ -24,13 +24,6 @@ func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) {
 	var peerUpdate models.PeerUpdate
 	var peerUpdate models.PeerUpdate
 	var peers []wgtypes.PeerConfig
 	var peers []wgtypes.PeerConfig
 	var serverNodeAddresses = []models.ServerAddr{}
 	var serverNodeAddresses = []models.ServerAddr{}
-	currentPeers, err := GetNetworkNodes(node.Network)
-	if err != nil {
-		return models.PeerUpdate{}, err
-	}
-	if node.IsRelayed == "yes" {
-		return GetPeerUpdateForRelayedNode(node)
-	}
 
 
 	// udppeers = the peers parsed from the local interface
 	// udppeers = the peers parsed from the local interface
 	// gives us correct port to reach
 	// gives us correct port to reach
@@ -39,6 +32,15 @@ func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) {
 		logger.Log(2, errN.Error())
 		logger.Log(2, errN.Error())
 	}
 	}
 
 
+	currentPeers, err := GetNetworkNodes(node.Network)
+	if err != nil {
+		return models.PeerUpdate{}, err
+	}
+
+	if node.IsRelayed == "yes" {
+		return GetPeerUpdateForRelayedNode(node, udppeers)
+	}
+
 	// #1 Set Keepalive values: set_keepalive
 	// #1 Set Keepalive values: set_keepalive
 	// #2 Set local address: set_local - could be a LOT BETTER and fix some bugs with additional logic
 	// #2 Set local address: set_local - could be a LOT BETTER and fix some bugs with additional logic
 	// #3 Set allowedips: set_allowedips
 	// #3 Set allowedips: set_allowedips
@@ -342,7 +344,7 @@ func getPeerDNS(network string) string {
 
 
 // GetPeerUpdateForRelayedNode - calculates peer update for a relayed node by getting the relay
 // GetPeerUpdateForRelayedNode - calculates peer update for a relayed node by getting the relay
 // copying the relay node's allowed ips and making appropriate substitutions
 // copying the relay node's allowed ips and making appropriate substitutions
-func GetPeerUpdateForRelayedNode(node *models.Node) (models.PeerUpdate, error) {
+func GetPeerUpdateForRelayedNode(node *models.Node, udppeers map[string]string) (models.PeerUpdate, error) {
 	var peerUpdate models.PeerUpdate
 	var peerUpdate models.PeerUpdate
 	var peers []wgtypes.PeerConfig
 	var peers []wgtypes.PeerConfig
 	var serverNodeAddresses = []models.ServerAddr{}
 	var serverNodeAddresses = []models.ServerAddr{}
@@ -352,6 +354,7 @@ func GetPeerUpdateForRelayedNode(node *models.Node) (models.PeerUpdate, error) {
 	if relay == nil {
 	if relay == nil {
 		return models.PeerUpdate{}, errors.New("not found")
 		return models.PeerUpdate{}, errors.New("not found")
 	}
 	}
+
 	//add relay to lists of allowed ip
 	//add relay to lists of allowed ip
 	if relay.Address != "" {
 	if relay.Address != "" {
 		relayIP := net.IPNet{
 		relayIP := net.IPNet{
@@ -403,6 +406,25 @@ func GetPeerUpdateForRelayedNode(node *models.Node) (models.PeerUpdate, error) {
 	if err != nil {
 	if err != nil {
 		return models.PeerUpdate{}, err
 		return models.PeerUpdate{}, err
 	}
 	}
+	var setUDPPort = false
+	if relay.UDPHolePunch == "yes" && CheckEndpoint(udppeers[relay.PublicKey]) {
+		endpointstring := udppeers[relay.PublicKey]
+		endpointarr := strings.Split(endpointstring, ":")
+		if len(endpointarr) == 2 {
+			port, err := strconv.Atoi(endpointarr[1])
+			if err == nil {
+				setUDPPort = true
+				relay.ListenPort = int32(port)
+			}
+		}
+	}
+	// if udp hole punching is on, but udp hole punching did not set it, use the LocalListenPort instead
+	// or, if port is for some reason zero use the LocalListenPort
+	// but only do this if LocalListenPort is not zero
+	if ((relay.UDPHolePunch == "yes" && !setUDPPort) || relay.ListenPort == 0) && relay.LocalListenPort != 0 {
+		relay.ListenPort = relay.LocalListenPort
+	}
+
 	endpoint := relay.Endpoint + ":" + strconv.FormatInt(int64(relay.ListenPort), 10)
 	endpoint := relay.Endpoint + ":" + strconv.FormatInt(int64(relay.ListenPort), 10)
 	address, err := net.ResolveUDPAddr("udp", endpoint)
 	address, err := net.ResolveUDPAddr("udp", endpoint)
 	if err != nil {
 	if err != nil {