Skip to content

Commit a72fc78

Browse files
committed
Add option "-o subnet-advertise"
when network create like docker network create -d ipvlan --subnet=192.168.1.0/24 -o subnet-advertise -o ipvlan_mode=l3 -o bgp-neighbor=10.0.1.1 -o vrf=100 -o parent=eth0 -o asnum=65001 -o rasnum=65002 vrf100 BGP Advertise network subnet (now 192.168.1.0/24) instead of /32. Signed-off-by: YujiOshima <[email protected]>
1 parent 449b415 commit a72fc78

File tree

4 files changed

+57
-17
lines changed

4 files changed

+57
-17
lines changed

Diff for: drivers/ipvlan/ipvlan.go

+10-9
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,16 @@ const (
1414
vethLen = 7
1515
containerVethPrefix = "eth"
1616
vethPrefix = "veth"
17-
ipvlanType = "ipvlan" // driver type name
18-
modeL2 = "l2" // ipvlan mode l2 is the default
19-
modeL3 = "l3" // ipvlan L3 mode
20-
parentOpt = "parent" // parent interface -o parent
21-
modeOpt = "_mode" // ipvlan mode ux opt suffix
22-
bgpNeighborOpt = "bgp-neighbor" // BGP neighbor address
23-
vrfOpt = "vrf" // BGP vrf ID
24-
asOpt = "asnum" // BGP AS number default 65000
25-
remoteAsOpt = "rasnum" // BGP remote AS number dafault 65000
17+
ipvlanType = "ipvlan" // driver type name
18+
modeL2 = "l2" // ipvlan mode l2 is the default
19+
modeL3 = "l3" // ipvlan L3 mode
20+
parentOpt = "parent" // parent interface -o parent
21+
modeOpt = "_mode" // ipvlan mode ux opt suffix
22+
bgpNeighborOpt = "bgp-neighbor" // BGP neighbor address
23+
vrfOpt = "vrf" // BGP vrf ID
24+
asOpt = "asnum" // BGP AS number default 65000
25+
remoteAsOpt = "rasnum" // BGP remote AS number dafault 65000
26+
subnetAdvertise = "subnet-advertise" // Advertise IP Subnet with BGP
2627
)
2728

2829
var driverModeOpt = ipvlanType + modeOpt // mode -o ipvlan_mode

Diff for: drivers/ipvlan/ipvlan_joinleave.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,13 @@ func (d *driver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo,
5959
if err := jinfo.AddStaticRoute(defaultRoute.Destination, defaultRoute.RouteType, defaultRoute.NextHop); err != nil {
6060
return fmt.Errorf("failed to set an ipvlan l3 mode ipv4 default gateway: %v", err)
6161
}
62-
//Advertise container route as /32 route
63-
advIP := &net.IPNet{IP: ep.addr.IP, Mask: net.IPv4Mask(255, 255, 255, 255)}
64-
err = routemanager.AdvertiseNewRoute(advIP.String(), n.config.VrfID)
65-
if err != nil {
66-
return err
62+
if n.config.SubnetAdvertise == "" {
63+
//Advertise container route as /32 route
64+
advIP := &net.IPNet{IP: ep.addr.IP, Mask: net.IPv4Mask(255, 255, 255, 255)}
65+
err = routemanager.AdvertiseNewRoute(advIP.String(), n.config.VrfID)
66+
if err != nil {
67+
return err
68+
}
6769
}
6870

6971
logrus.Debugf("Ipvlan Endpoint Joined with IPv4_Addr: %s, Ipvlan_Mode: %s, Parent: %s",
@@ -137,7 +139,7 @@ func (d *driver) Leave(nid, eid string) error {
137139
if err != nil {
138140
return err
139141
}
140-
if network.config.IpvlanMode == modeL3 {
142+
if network.config.IpvlanMode == modeL3 && network.config.SubnetAdvertise == "" {
141143
//Withdraw container route as /32 route
142144
witdIP := &net.IPNet{IP: endpoint.addr.IP, Mask: net.IPv4Mask(255, 255, 255, 255)}
143145
err = routemanager.WithdrawRoute(witdIP.String(), network.config.VrfID)

Diff for: drivers/ipvlan/ipvlan_network.go

+38-2
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,27 @@ func (d *driver) createNetwork(config *configuration) error {
120120

121121
}
122122
err := routemanager.CreateVrfNetwork(config.Parent, config.VrfID)
123+
if err != nil {
124+
return err
125+
}
123126
if config.BgpNeighbor != "" {
124127
routemanager.DiscoverNew(false, config.BgpNeighbor)
125128
}
126-
if err != nil {
127-
return err
129+
if config.SubnetAdvertise != "" {
130+
if config.Ipv4Subnets != nil {
131+
for _, subnet := range config.Ipv4Subnets {
132+
err := routemanager.AdvertiseNewRoute(subnet.SubnetIP, config.VrfID)
133+
if err != nil {
134+
return err
135+
}
136+
}
137+
for _, subnet := range config.Ipv6Subnets {
138+
err := routemanager.AdvertiseNewRoute(subnet.SubnetIP, config.VrfID)
139+
if err != nil {
140+
return err
141+
}
142+
}
143+
}
128144
}
129145
}
130146
// add the *network
@@ -161,6 +177,23 @@ func (d *driver) DeleteNetwork(nid string) error {
161177
}
162178
}
163179
}
180+
if n.config.SubnetAdvertise != "" {
181+
//Advertise container network subnet
182+
if n.config.Ipv4Subnets != nil {
183+
for _, subnet := range n.config.Ipv4Subnets {
184+
err := routemanager.WithdrawRoute(subnet.SubnetIP, n.config.VrfID)
185+
if err != nil {
186+
return err
187+
}
188+
}
189+
for _, subnet := range n.config.Ipv6Subnets {
190+
err := routemanager.WithdrawRoute(subnet.SubnetIP, n.config.VrfID)
191+
if err != nil {
192+
return err
193+
}
194+
}
195+
}
196+
}
164197
// delete the *network
165198
d.deleteNetwork(nid)
166199
// delete the network record from persistent cache
@@ -242,6 +275,9 @@ func (config *configuration) fromOptions(labels map[string]string) error {
242275
case remoteAsOpt:
243276
// parse driver options '-o rasnum'
244277
config.RemoteASnum = value
278+
case subnetAdvertise:
279+
// set driver options '-o subnet-advertise'
280+
config.SubnetAdvertise = "True"
245281
}
246282
}
247283
return nil

Diff for: drivers/ipvlan/ipvlan_store.go

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ type configuration struct {
3030
VrfID string
3131
ASnum string
3232
RemoteASnum string
33+
SubnetAdvertise string
3334
}
3435

3536
type ipv4Subnet struct {

0 commit comments

Comments
 (0)