Fix #3149: port mapping of TCP + UDP
| ... | ... |
@@ -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)
|