Browse code

Merge pull request #3435 from roylee17/3149-fix_port_mapping_of_tcp_plus_udp

Fix #3149: port mapping of TCP + UDP

Michael Crosby authored on 2014/01/08 03:08:13
Showing 1 changed files
... ...
@@ -248,12 +248,12 @@ type PortMapper struct {
248 248
 }
249 249
 
250 250
 func (mapper *PortMapper) Map(ip net.IP, port int, backendAddr net.Addr) error {
251
-	mapKey := (&net.TCPAddr{Port: port, IP: ip}).String()
252
-	if _, exists := mapper.tcpProxies[mapKey]; exists {
253
-		return fmt.Errorf("Port %s is already in use", mapKey)
254
-	}
255 251
 
256 252
 	if _, isTCP := backendAddr.(*net.TCPAddr); isTCP {
253
+		mapKey := (&net.TCPAddr{Port: port, IP: ip}).String()
254
+		if _, exists := mapper.tcpProxies[mapKey]; exists {
255
+			return fmt.Errorf("TCP Port %s is already in use", mapKey)
256
+		}
257 257
 		backendPort := backendAddr.(*net.TCPAddr).Port
258 258
 		backendIP := backendAddr.(*net.TCPAddr).IP
259 259
 		if mapper.iptables != nil {
... ...
@@ -270,6 +270,10 @@ func (mapper *PortMapper) Map(ip net.IP, port int, backendAddr net.Addr) error {
270 270
 		mapper.tcpProxies[mapKey] = proxy
271 271
 		go proxy.Run()
272 272
 	} else {
273
+		mapKey := (&net.UDPAddr{Port: port, IP: ip}).String()
274
+		if _, exists := mapper.udpProxies[mapKey]; exists {
275
+			return fmt.Errorf("UDP: Port %s is already in use", mapKey)
276
+		}
273 277
 		backendPort := backendAddr.(*net.UDPAddr).Port
274 278
 		backendIP := backendAddr.(*net.UDPAddr).IP
275 279
 		if mapper.iptables != nil {
... ...
@@ -290,8 +294,8 @@ func (mapper *PortMapper) Map(ip net.IP, port int, backendAddr net.Addr) error {
290 290
 }
291 291
 
292 292
 func (mapper *PortMapper) Unmap(ip net.IP, port int, proto string) error {
293
-	mapKey := (&net.TCPAddr{Port: port, IP: ip}).String()
294 293
 	if proto == "tcp" {
294
+		mapKey := (&net.TCPAddr{Port: port, IP: ip}).String()
295 295
 		backendAddr, ok := mapper.tcpMapping[mapKey]
296 296
 		if !ok {
297 297
 			return fmt.Errorf("Port tcp/%s is not mapped", mapKey)
... ...
@@ -307,6 +311,7 @@ func (mapper *PortMapper) Unmap(ip net.IP, port int, proto string) error {
307 307
 		}
308 308
 		delete(mapper.tcpMapping, mapKey)
309 309
 	} else {
310
+		mapKey := (&net.UDPAddr{Port: port, IP: ip}).String()
310 311
 		backendAddr, ok := mapper.udpMapping[mapKey]
311 312
 		if !ok {
312 313
 			return fmt.Errorf("Port udp/%s is not mapped", mapKey)