[libvirt] [PATCH] v2:Support for adding a static route to a bridge

Laine Stump laine at laine.org
Thu Apr 4 16:18:19 UTC 2013


On 03/15/2013 02:10 PM, Gene Czarcinski wrote:
> diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
> index 296871c..c90b3d2 100644
> --- a/src/util/virnetdev.c
> +++ b/src/util/virnetdev.c
> @@ -729,6 +729,7 @@ int virNetDevGetVLanID(const char *ifname ATTRIBUTE_UNUSED,
>   * Add an IP address to an interface. This function *does not* remove
>   * any previously added IP addresses - that must be done separately with
>   * brDelInetAddress.
> + * TODO: what is "brDelInetAddress"?

That is a left-over comment from long ago. The function has been renamed
to virNetDevClearIPv4Address.

(A very useful separate patch would be one to rename
virNetDev(Set|Clear)IPv4Address to virNetDev(Set|Clear)IPAddress (since
they really *can* be (and are being) used to set both IPv4 and IPv6
addresses), then reimplement them using netlink/libnl calls.

Likewise, it would be much nicer if virNetDevSetGateway() was
implemented using netlink/libnl.


>   *
>   * Returns 0 in case of success or -1 in case of error.
>   */
> @@ -769,6 +770,52 @@ cleanup:
>  }
>  
>  /**
> + * virNetDevSetGateway:

I'm thinking maybe this would be better named "virNetDevAddRoute", since
the thing it's adding is a route (of which the gateway is one attribute).

> + * @ifname: the interface name
> + * @addr: the IP network address (IPv4 or IPv6)
> + * @prefix: number of 1 bits in the netmask
> + * @gateway: via address for route (same as @addr)
> + *
> + * Add a route for a network IP address to an interface. This function
> + * *does not* remove any previously added IP static routes.
> + *
> + * Returns 0 in case of success or -1 in case of error.
> + */
> +
> +int virNetDevSetGateway(const char *ifname,
> +                        virSocketAddr *addr,
> +                        unsigned int prefix,
> +                        virSocketAddr *gateway)
> +{
> +    virCommandPtr cmd = NULL;
> +    char *addrstr = NULL, *gatewaystr = NULL;
> +    int ret = -1;
> +
> +    if (!(addrstr = virSocketAddrFormat(addr)))
> +        goto cleanup;
> +    if (!(gatewaystr = virSocketAddrFormat(gateway)))
> +        goto cleanup;
> +    cmd = virCommandNew(IP_PATH);
> +    virCommandAddArgList(cmd, "route", "add", NULL);
> +    virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix);
> +    virCommandAddArgList(cmd, "via", NULL);
That one could have been a simple virCommandAddArg().

> +    virCommandAddArgFormat(cmd, "%s", gatewaystr);
> +    virCommandAddArgList(cmd, "dev", ifname, NULL);
> +    virCommandAddArgList(cmd, "proto", "static", "metric", NULL);
> +    virCommandAddArgFormat(cmd, "%u", 1);
Are all of those necessary?

Partial answer to myself: "proto static" is needed because otherwise
"proto boot" is assumed, and if a routing daemon is started on the host,
any route added with "proto boot" will be purged, which *isn't* what we
want.

I'm not sure about metric...

> +
> +    if (virCommandRun(cmd, NULL) < 0)
> +        goto cleanup;
> +
> +    ret = 0;
> +cleanup:
> +    VIR_FREE(addrstr);
> +    VIR_FREE(gatewaystr);
> +    virCommandFree(cmd);
> +    return ret;
> +}
> +
> +/**
>   * virNetDevClearIPv4Address:
>   * @ifname: the interface name
>   * @addr: the IP address (IPv4 or IPv6)
> diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h
> index 06d0650..8b94ea8 100644
> --- a/src/util/virnetdev.h
> +++ b/src/util/virnetdev.h
> @@ -42,6 +42,11 @@ int virNetDevSetIPv4Address(const char *ifname,
>                              virSocketAddr *addr,
>                              unsigned int prefix)
>      ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
> +int virNetDevSetGateway(const char *ifname,
> +                        virSocketAddr *addr,
> +                        unsigned int prefix,
> +                        virSocketAddr *gateway)
> +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
>  int virNetDevClearIPv4Address(const char *ifname,
>                                virSocketAddr *addr,
>                                unsigned int prefix)
> diff --git a/tests/networkxml2xmlin/dhcp6host-routed-network.xml b/tests/networkxml2xmlin/dhcp6host-routed-network.xml
> index 2693d87..dcad62d 100644
> --- a/tests/networkxml2xmlin/dhcp6host-routed-network.xml
> +++ b/tests/networkxml2xmlin/dhcp6host-routed-network.xml
> @@ -19,4 +19,8 @@
>        <host id='0:1:0:1:18:aa:62:fe:0:16:3e:44:55:66' name='badbob' ip='2001:db8:ac10:fd01::1:24' />
>      </dhcp>
>    </ip>
> +  <ip address="192.168.222.0" netmask="255.255.255.0" via="192.168.122.10">
> +  </ip>
> +  <ip family="ipv6" address="2001:db8:ac10:fc00::" prefix="64" via="2001:db8:ac10:fd01::1:24">
> +  </ip>
>  </network>
> diff --git a/tests/networkxml2xmlout/dhcp6host-routed-network.xml b/tests/networkxml2xmlout/dhcp6host-routed-network.xml
> index 7305043..880c2dd 100644
> --- a/tests/networkxml2xmlout/dhcp6host-routed-network.xml
> +++ b/tests/networkxml2xmlout/dhcp6host-routed-network.xml
> @@ -21,4 +21,8 @@
>        <host id='0:1:0:1:18:aa:62:fe:0:16:3e:44:55:66' name='badbob' ip='2001:db8:ac10:fd01::1:24' />
>      </dhcp>
>    </ip>
> +  <ip address='192.168.222.0' netmask='255.255.255.0' via='192.168.122.10'>
> +  </ip>
> +  <ip family='ipv6' address='2001:db8:ac10:fc00::' prefix='64' via='2001:db8:ac10:fd01::1:24'>
> +  </ip>
>  </network>




More information about the libvir-list mailing list