1
//go:build !remote && linux
12
"github.com/containers/common/libnetwork/slirp4netns"
13
"github.com/containers/common/libnetwork/types"
14
"github.com/containers/podman/v5/pkg/errorhandling"
15
"github.com/sirupsen/logrus"
18
// setupSlirp4netns can be called in rootful as well as in rootless
19
func (r *Runtime) setupSlirp4netns(ctr *Container, netns string) error {
20
ports := ctr.convertPortMappings()
22
if !ctr.config.PostConfigureNetNS {
24
ctr.rootlessSlirpSyncR, ctr.rootlessSlirpSyncW, err = os.Pipe()
26
return fmt.Errorf("failed to create rootless network sync pipe: %w", err)
29
ctr.rootlessPortSyncR, ctr.rootlessPortSyncW, err = os.Pipe()
31
return fmt.Errorf("failed to create rootless port sync pipe: %w", err)
35
defer errorhandling.CloseQuiet(ctr.rootlessSlirpSyncR)
36
if ctr.rootlessPortSyncR != nil {
37
defer errorhandling.CloseQuiet(ctr.rootlessPortSyncR)
40
res, err := slirp4netns.Setup(&slirp4netns.SetupOptions{
42
ContainerID: ctr.ID(),
45
ExtraOptions: ctr.config.NetworkOptions[slirp4netns.BinaryName],
46
Slirp4netnsExitPipeR: ctr.rootlessSlirpSyncR,
47
RootlessPortExitPipeR: ctr.rootlessPortSyncR,
52
ctr.slirp4netnsSubnet = res.Subnet
56
func (r *Runtime) setupRootlessPortMappingViaRLK(ctr *Container, netnsPath string, netStatus map[string]types.StatusBlock) error {
58
if !ctr.config.PostConfigureNetNS {
59
ctr.rootlessPortSyncR, ctr.rootlessPortSyncW, err = os.Pipe()
61
return fmt.Errorf("failed to create rootless port sync pipe: %w", err)
64
defer errorhandling.CloseQuiet(ctr.rootlessPortSyncR)
65
return slirp4netns.SetupRootlessPortMappingViaRLK(&slirp4netns.SetupOptions{
67
ContainerID: ctr.ID(),
69
Ports: ctr.convertPortMappings(),
70
RootlessPortExitPipeR: ctr.rootlessPortSyncR,
74
// reloadRootlessRLKPortMapping will trigger a reload for the port mappings in the rootlessport process.
75
// This should only be called by network connect/disconnect and only as rootless.
76
func (c *Container) reloadRootlessRLKPortMapping() error {
77
if len(c.config.PortMappings) == 0 {
80
childIP := slirp4netns.GetRootlessPortChildIP(nil, c.state.NetworkStatus)
81
logrus.Debugf("reloading rootless ports for container %s, childIP is %s", c.config.ID, childIP)
83
conn, err := openUnixSocket(filepath.Join(c.runtime.config.Engine.TmpDir, "rp", c.config.ID))
85
return fmt.Errorf("could not reload rootless port mappings, port forwarding may no longer work correctly: %w", err)
88
enc := json.NewEncoder(conn)
89
err = enc.Encode(childIP)
91
return fmt.Errorf("port reloading failed: %w", err)
93
b, err := io.ReadAll(conn)
95
return fmt.Errorf("port reloading failed: %w", err)
99
return fmt.Errorf("port reloading failed: %s", data)
104
func getSlirp4netnsIP(subnet *net.IPNet) (*net.IP, error) {
105
return slirp4netns.GetIP(subnet)