github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/libnetwork/drivers/bridge/setup_ipv4.go (about) 1 package bridge 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "path/filepath" 7 8 log "github.com/Sirupsen/logrus" 9 "github.com/docker/libnetwork/types" 10 "github.com/vishvananda/netlink" 11 ) 12 13 func setupBridgeIPv4(config *networkConfiguration, i *bridgeInterface) error { 14 addrv4, _, err := i.addresses() 15 if err != nil { 16 return fmt.Errorf("failed to retrieve bridge interface addresses: %v", err) 17 } 18 19 if !types.CompareIPNet(addrv4.IPNet, config.AddressIPv4) { 20 if addrv4.IPNet != nil { 21 if err := i.nlh.AddrDel(i.Link, &addrv4); err != nil { 22 return fmt.Errorf("failed to remove current ip address from bridge: %v", err) 23 } 24 } 25 log.Debugf("Assigning address to bridge interface %s: %s", config.BridgeName, config.AddressIPv4) 26 if err := i.nlh.AddrAdd(i.Link, &netlink.Addr{IPNet: config.AddressIPv4}); err != nil { 27 return &IPv4AddrAddError{IP: config.AddressIPv4, Err: err} 28 } 29 } 30 31 // Store bridge network and default gateway 32 i.bridgeIPv4 = config.AddressIPv4 33 i.gatewayIPv4 = config.AddressIPv4.IP 34 35 return nil 36 } 37 38 func setupGatewayIPv4(config *networkConfiguration, i *bridgeInterface) error { 39 if !i.bridgeIPv4.Contains(config.DefaultGatewayIPv4) { 40 return &ErrInvalidGateway{} 41 } 42 43 // Store requested default gateway 44 i.gatewayIPv4 = config.DefaultGatewayIPv4 45 46 return nil 47 } 48 49 func setupLoopbackAdressesRouting(config *networkConfiguration, i *bridgeInterface) error { 50 sysPath := filepath.Join("/proc/sys/net/ipv4/conf", config.BridgeName, "route_localnet") 51 ipv4LoRoutingData, err := ioutil.ReadFile(sysPath) 52 if err != nil { 53 return fmt.Errorf("Cannot read IPv4 local routing setup: %v", err) 54 } 55 // Enable loopback adresses routing only if it isn't already enabled 56 if ipv4LoRoutingData[0] != '1' { 57 if err := ioutil.WriteFile(sysPath, []byte{'1', '\n'}, 0644); err != nil { 58 return fmt.Errorf("Unable to enable local routing for hairpin mode: %v", err) 59 } 60 } 61 return nil 62 }