[libvirt] [PATCH 06/10] network: Bridge - Add support for a DHCP Relay Agent
Eric Blake
eblake at redhat.com
Thu Feb 28 03:38:13 UTC 2013
On 02/27/2013 07:57 PM, TJ wrote:
> From: TJ <linux at iam.tj>
>
> A DHCP relay daemon will be started that will forward all DHCP/BOOTP
> requests on the bridge network via the first declared forward
> interface. The relay is broadcast rather than routed so no IP address
> is needed on the bridge.
>
> The XML <relay> element's "relay" property of the active DHCP stanza
> defaults to 'no'. Set it to 'yes' to enable the relay:
>
> <ip ...>
> <dhcp relay='yes'/>
> </ip>
>
> The relay will not be started if the "enable" property is 'no':
>
> <ip ...>
> <dhcp enable='no' relay='yes'/>
> </ip>
At this point in the series, I'll defer to Laine for technical review.
But I still have some style review:
> +
> + /* Use the first forwarding device to broadcast to the upstream DHCP server */
> + if (network->def->forward.nifs > 0) {
> + virCommandAddArgList(cmd, "-b", network->def->forward.ifs[0].device.dev, NULL);
> + ret = 0;
No TABs in .c, ever. Run 'make syntax-check'.
> + } else
HACKING says that if you use {} on one side of 'else', you must use it
on both sides.
> + virReportSystemError(VIR_ERR_INVALID_INTERFACE,
> + _("DHCP relay requires at least one network %s\n"),
> + "<forward ... dev='eth?'/> or <interface dev='eth?'/>");
Indentation is off, even when you get rid of that TAB. You have a
mixed-language sentence - translators will get the first half, but can't
translate the 'or' in the second string, and that looks gross. I would
have written:
virReportSystemError(VIR_ERR_INVALID_INTERFACE, "%s",
_("DHCP relay requires at least one network "
"<forward dev='eth?'/> or "
"<interface dev='eth?'/>");
> +static int
> +networkBuildDhcpRelayCommandLine(virNetworkObjPtr network, virCommandPtr *cmdout,
> + char *pidfile)
> +{
> + virCommandPtr cmd = NULL;
> + int ret = -1;
> +
> + cmd = virCommandNew(DHCPRELAY);
> + if (networkBuildDhcpRelayArgv(network, pidfile, cmd) < 0) {
> + goto cleanup;
> + }
> +
> + if (cmdout)
> + *cmdout = cmd;
> + ret = 0;
> +cleanup:
> + if (ret < 0)
> + virCommandFree(cmd);
> + return ret;
Memory leak if ret == 0 but !*cmdout.
> +}
> +
> +static int
> +networkStartDhcpRelayDaemon(struct network_driver *driver ATTRIBUTE_UNUSED,
> + virNetworkObjPtr network)
Indentation is off.
> +{
> + virCommandPtr cmd = NULL;
> + virNetworkIpDefPtr ipdef = NULL;
> + char *pidfile = NULL;
> + char *tmp = NULL;
> + int pid_len;
> + int ret = 0;
> + const char *dhcprelay = "dhcprelay_";
> +
> + ipdef = networkGetActiveDhcp(network);
> + /* Prepare for DHCP relay agent */
> + if (ipdef && ipdef->dhcp_enabled && ipdef->dhcp_relay) {
> + ret = -1;
Indentation is off.
> +
> + if (virFileMakePath(NETWORK_PID_DIR) < 0) {
> + virReportSystemError(errno,
> + _("cannot create directory %s"),
> + NETWORK_PID_DIR);
> + goto cleanup;
> + }
> +
> + pid_len = strlen(dhcprelay) + strlen(network->def->name);
> + if ( VIR_ALLOC_N(tmp, pid_len+1) >= 0) {
Spacing is off. Correct would be:
if (VIR_ALLOC_N(tmp, pid_len + 1) >= 0) {
But you shouldn't need to do VIR_ALLOC_N in the first place, since...
> + tmp = strcpy(tmp, dhcprelay);
> + tmp = strncat(tmp, network->def->name, pid_len);
...strncat() is generally the wrong interface. Use virAsprintf or
virBuffer* instead.
> + if (!(pidfile = virPidFileBuildPath(NETWORK_PID_DIR, tmp))) {
> + virReportOOMError();
> + goto cleanup;
> + }
> + } else {
> + virReportOOMError();
> + goto cleanup;
> + }
This indentation mess with TAB is making this hard to review.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130227/d1fe0107/attachment-0001.sig>
More information about the libvir-list
mailing list