Merge pull request #250 from zhgwenming/master
Make AddRoute() works with a provided source ip address.
This commit is contained in:
commit
e4563c9bd3
|
@ -1003,28 +1003,23 @@ func AddRoute(destination, source, gateway, device string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if source != "" {
|
if source != "" {
|
||||||
srcIP, srcNet, err := net.ParseCIDR(source)
|
srcIP := net.ParseIP(source)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("source CIDR %s couldn't be parsed", source)
|
return fmt.Errorf("source IP %s couldn't be parsed", source)
|
||||||
}
|
}
|
||||||
srcFamily := getIpFamily(srcIP)
|
srcFamily := getIpFamily(srcIP)
|
||||||
if currentFamily != -1 && currentFamily != srcFamily {
|
if currentFamily != -1 && currentFamily != srcFamily {
|
||||||
return fmt.Errorf("source and destination ip were not the same IP family")
|
return fmt.Errorf("source and destination ip were not the same IP family")
|
||||||
}
|
}
|
||||||
currentFamily = srcFamily
|
currentFamily = srcFamily
|
||||||
srcLen, bits := srcNet.Mask.Size()
|
|
||||||
if srcLen == 0 && bits == 0 {
|
|
||||||
return fmt.Errorf("source CIDR %s generated a non-canonical Mask", source)
|
|
||||||
}
|
|
||||||
msg.Family = uint8(srcFamily)
|
msg.Family = uint8(srcFamily)
|
||||||
msg.Src_len = uint8(srcLen)
|
|
||||||
var srcData []byte
|
var srcData []byte
|
||||||
if srcFamily == syscall.AF_INET {
|
if srcFamily == syscall.AF_INET {
|
||||||
srcData = srcIP.To4()
|
srcData = srcIP.To4()
|
||||||
} else {
|
} else {
|
||||||
srcData = srcIP.To16()
|
srcData = srcIP.To16()
|
||||||
}
|
}
|
||||||
rtAttrs = append(rtAttrs, newRtAttr(syscall.RTA_SRC, srcData))
|
rtAttrs = append(rtAttrs, newRtAttr(syscall.RTA_PREFSRC, srcData))
|
||||||
}
|
}
|
||||||
|
|
||||||
if gateway != "" {
|
if gateway != "" {
|
||||||
|
|
|
@ -280,6 +280,34 @@ func TestAddDelNetworkIp(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAddRouteSourceSelection(t *testing.T) {
|
||||||
|
tstIp := "127.1.1.1"
|
||||||
|
tl := testLink{name: "tstEth", linkType: "dummy"}
|
||||||
|
|
||||||
|
addLink(t, tl.name, tl.linkType)
|
||||||
|
defer deleteLink(t, tl.name)
|
||||||
|
|
||||||
|
ip := net.ParseIP(tstIp)
|
||||||
|
mask := net.IPv4Mask(255, 255, 255, 255)
|
||||||
|
ipNet := &net.IPNet{IP: ip, Mask: mask}
|
||||||
|
|
||||||
|
iface, err := net.InterfaceByName(tl.name)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Lost created link %#v", tl)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := NetworkLinkAddIp(iface, ip, ipNet); err != nil {
|
||||||
|
t.Fatalf("Could not add IP address %s to interface %#v: %s", ip.String(), iface, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
upLink(t, tl.name)
|
||||||
|
defer downLink(t, tl.name)
|
||||||
|
|
||||||
|
if err := AddRoute("127.0.0.0/8", tstIp, "", tl.name); err != nil {
|
||||||
|
t.Fatalf("Failed to add route with source address")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestCreateVethPair(t *testing.T) {
|
func TestCreateVethPair(t *testing.T) {
|
||||||
if testing.Short() {
|
if testing.Short() {
|
||||||
return
|
return
|
||||||
|
|
|
@ -0,0 +1,209 @@
|
||||||
|
{
|
||||||
|
"capabilities": [
|
||||||
|
"CHOWN",
|
||||||
|
"DAC_OVERRIDE",
|
||||||
|
"FOWNER",
|
||||||
|
"MKNOD",
|
||||||
|
"NET_RAW",
|
||||||
|
"SETGID",
|
||||||
|
"SETUID",
|
||||||
|
"SETFCAP",
|
||||||
|
"SETPCAP",
|
||||||
|
"NET_BIND_SERVICE",
|
||||||
|
"SYS_CHROOT",
|
||||||
|
"KILL"
|
||||||
|
],
|
||||||
|
"cgroups": {
|
||||||
|
"allowed_devices": [
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "m",
|
||||||
|
"major_number": -1,
|
||||||
|
"minor_number": -1,
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "m",
|
||||||
|
"major_number": -1,
|
||||||
|
"minor_number": -1,
|
||||||
|
"type": 98
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"major_number": 5,
|
||||||
|
"minor_number": 1,
|
||||||
|
"path": "/dev/console",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"major_number": 4,
|
||||||
|
"path": "/dev/tty0",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"major_number": 4,
|
||||||
|
"minor_number": 1,
|
||||||
|
"path": "/dev/tty1",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"major_number": 136,
|
||||||
|
"minor_number": -1,
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"major_number": 5,
|
||||||
|
"minor_number": 2,
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"major_number": 10,
|
||||||
|
"minor_number": 200,
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 1,
|
||||||
|
"minor_number": 3,
|
||||||
|
"path": "/dev/null",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 1,
|
||||||
|
"minor_number": 5,
|
||||||
|
"path": "/dev/zero",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 1,
|
||||||
|
"minor_number": 7,
|
||||||
|
"path": "/dev/full",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 5,
|
||||||
|
"path": "/dev/tty",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 1,
|
||||||
|
"minor_number": 9,
|
||||||
|
"path": "/dev/urandom",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 1,
|
||||||
|
"minor_number": 8,
|
||||||
|
"path": "/dev/random",
|
||||||
|
"type": 99
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "docker-koye",
|
||||||
|
"parent": "docker"
|
||||||
|
},
|
||||||
|
"restrict_sys": true,
|
||||||
|
"mount_config": {
|
||||||
|
"device_nodes": [
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 1,
|
||||||
|
"minor_number": 3,
|
||||||
|
"path": "/dev/null",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 1,
|
||||||
|
"minor_number": 5,
|
||||||
|
"path": "/dev/zero",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 1,
|
||||||
|
"minor_number": 7,
|
||||||
|
"path": "/dev/full",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 5,
|
||||||
|
"path": "/dev/tty",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 1,
|
||||||
|
"minor_number": 9,
|
||||||
|
"path": "/dev/urandom",
|
||||||
|
"type": 99
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cgroup_permissions": "rwm",
|
||||||
|
"file_mode": 438,
|
||||||
|
"major_number": 1,
|
||||||
|
"minor_number": 8,
|
||||||
|
"path": "/dev/random",
|
||||||
|
"type": 99
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"environment": [
|
||||||
|
"HOME=/",
|
||||||
|
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
|
||||||
|
"HOSTNAME=koye",
|
||||||
|
"TERM=xterm"
|
||||||
|
],
|
||||||
|
"hostname": "koye",
|
||||||
|
"namespaces": {
|
||||||
|
"NEWIPC": true,
|
||||||
|
"NEWNET": true,
|
||||||
|
"NEWNS": true,
|
||||||
|
"NEWPID": true,
|
||||||
|
"NEWUTS": true
|
||||||
|
},
|
||||||
|
"networks": [
|
||||||
|
{
|
||||||
|
"address": "127.0.0.1/0",
|
||||||
|
"gateway": "localhost",
|
||||||
|
"mtu": 1500,
|
||||||
|
"type": "loopback"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"address": "172.17.0.101/16",
|
||||||
|
"bridge": "docker0",
|
||||||
|
"veth_prefix": "veth",
|
||||||
|
"mtu": 1500,
|
||||||
|
"type": "veth"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"routes": [
|
||||||
|
{
|
||||||
|
"destination": "0.0.0.0/0",
|
||||||
|
"source": "172.17.0.101",
|
||||||
|
"gateway": "172.17.42.1",
|
||||||
|
"interface_name": "eth0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tty": true
|
||||||
|
}
|
Loading…
Reference in New Issue