mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
47 lines
1.5 KiB
Go
47 lines
1.5 KiB
Go
|
package portmapper
|
||
|
|
||
|
import (
|
||
|
"net"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/docker/libnetwork/iptables"
|
||
|
"github.com/docker/libnetwork/portallocator"
|
||
|
)
|
||
|
|
||
|
// PortMapper manages the network address translation
|
||
|
type PortMapper struct {
|
||
|
bridgeName string
|
||
|
|
||
|
// udp:ip:port
|
||
|
currentMappings map[string]*mapping
|
||
|
lock sync.Mutex
|
||
|
|
||
|
proxyPath string
|
||
|
|
||
|
Allocator *portallocator.PortAllocator
|
||
|
chain *iptables.ChainInfo
|
||
|
}
|
||
|
|
||
|
// SetIptablesChain sets the specified chain into portmapper
|
||
|
func (pm *PortMapper) SetIptablesChain(c *iptables.ChainInfo, bridgeName string) {
|
||
|
pm.chain = c
|
||
|
pm.bridgeName = bridgeName
|
||
|
}
|
||
|
|
||
|
// AppendForwardingTableEntry adds a port mapping to the forwarding table
|
||
|
func (pm *PortMapper) AppendForwardingTableEntry(proto string, sourceIP net.IP, sourcePort int, containerIP string, containerPort int) error {
|
||
|
return pm.forward(iptables.Append, proto, sourceIP, sourcePort, containerIP, containerPort)
|
||
|
}
|
||
|
|
||
|
// DeleteForwardingTableEntry removes a port mapping from the forwarding table
|
||
|
func (pm *PortMapper) DeleteForwardingTableEntry(proto string, sourceIP net.IP, sourcePort int, containerIP string, containerPort int) error {
|
||
|
return pm.forward(iptables.Delete, proto, sourceIP, sourcePort, containerIP, containerPort)
|
||
|
}
|
||
|
|
||
|
func (pm *PortMapper) forward(action iptables.Action, proto string, sourceIP net.IP, sourcePort int, containerIP string, containerPort int) error {
|
||
|
if pm.chain == nil {
|
||
|
return nil
|
||
|
}
|
||
|
return pm.chain.Forward(action, sourceIP, sourcePort, proto, containerIP, containerPort, pm.bridgeName)
|
||
|
}
|