package portmapper import ( "net" "sync" "github.com/docker/docker/libnetwork/iptables" "github.com/docker/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) }