[libvirt] [PATCH v11] add 802.1Qbh and 802.1Qbg handling
Stefan Berger
stefanb at linux.vnet.ibm.com
Fri May 28 21:47:50 UTC 2010
On Fri, 2010-05-28 at 23:17 +0200, Jim Meyering wrote:
> Stefan Berger wrote:
> > This is now hopefully the final version of this patch that adds support
> > for configuring 802.1Qbg and 802.1Qbh switches. The 802.1Qbh part has
> > been successfully tested with real hardware. The 802.1Qbg part has only
> > been tested with a (dummy) server that 'behaves' similarly to how we
> > expect lldpad to 'behave'.
> >
> > V11:
> > - determining pid of lldpad daemon by reading it from /var/run/libvirt.pid
> > (hardcode as is hardcode alson in lldpad sources)
> > - merging netlink send code for kernel target and user space target
> > (lldpad) using one function nlComm() to send the messages
> > - adding a select() after the sending and before the reading of the
> > netlink response in case lldpad doesn't respond and so we don't hang
> > - when reading the port status, in case of 802.1Qbg, no status may be
> > received while things are 'in progress' and only at the end a status
> > will be there.
> > - when reading the port status, use the given instanceId and vf to pick
> > the right IFLA_VF_PORT among those nested under IFLA_VF_PORTS.
>
> Hi Stefan,
>
> There are a few nits, but nothing serious.
>
> If this will be pushed in your name, you should add
> your name/email to the AUTHORS file.
Already there...
>
> There are two cpp-indentation nits:
> cppi: src/storage/storage_backend.h: line 96: not properly indented
> cppi: src/util/macvtap.c: line 75: not properly indented
>
> And one unmarked diagnostic:
> src/util/macvtap.c-766- "error parsing pid of lldpad");
>
> Those three things were exposed by running "make syntax-check".
Fixed the two related to this patch. The storage one didn't appear.
>
> Further, in this code,
>
> +static uint32_t
> +getLldpadPid(void) {
> + int fd;
> + uint32_t pid = 0;
> +
> + fd = open(LLDPAD_PID_FILE, O_RDONLY);
> + if (fd >= 0) {
> + char buffer[10];
> + char *endptr;
> +
> + if (saferead(fd, buffer, sizeof(buffer)) <= sizeof(buffer)) {
> + unsigned int res;
> +
> + if (virStrToLong_ui(buffer, &endptr, 10, &res))
> + macvtapError(VIR_ERR_INTERNAL_ERROR, "%s",
> + "error parsing pid of lldpad");
> + else
> + pid = res;
>
> by passing a non-NULL &endptr (and not checking it after the call),
> you're declaring that any non-numeric suffix on that PID is valid.
> It would be better not to do that: it'd be better to ensure that
> anything following it is acceptable, e.g. via
>
> endptr == NULL || c_isspace(endptr)
>
I'll go for this one.
> Or, if you can guarantee how it's written, simply require that it
> be followed by a newline:
>
> endptr && *endptr == '\n'
>
>
> Stylistic:
> In this function,
>
> +static int
> +doPortProfileOpCommon(bool nltarget_kernel,
>
> you add this loop:
>
> + while (--repeats >= 0) {
> + rc = link_dump(nltarget_kernel, NULL, ifindex, tb, &recvbuf);
> + if (rc)
> + goto err_exit;
> + rc = getPortProfileStatus(tb, vf, instanceId, nltarget_kernel,
> + is8021Qbg, &status);
> + if (rc == 0) {
> + if (status == PORT_PROFILE_RESPONSE_SUCCESS ||
> + status == PORT_VDP_RESPONSE_SUCCESS) {
> + break;
> + } else if (status == PORT_PROFILE_RESPONSE_INPROGRESS) {
> + // keep trying...
> + } else {
> + virReportSystemError(EINVAL,
> + _("error %d during port-profile setlink on "
> + "interface %s (%d)"),
> + status, ifname, ifindex);
> + rc = 1;
> + break;
> + }
> + } else
> + goto err_exit;
> +
> + usleep(STATUS_POLL_INTERVL_USEC);
> +
> + VIR_FREE(recvbuf);
> + }
>
> However, I find it simpler to read if you put the
> single-stmt-goto-in-else-clause first,
> and then un-indent what is currently the body of that if block:
>
> + if (rc != 0)
> + goto err_exit;
> +
> + if (status == PORT_PROFILE_RESPONSE_SUCCESS ||
> + status == PORT_VDP_RESPONSE_SUCCESS) {
> + break;
> + } else if (status == PORT_PROFILE_RESPONSE_INPROGRESS) {
> + // keep trying...
> + } else {
> + virReportSystemError(EINVAL,
> + _("error %d during port-profile setlink on "
> + "interface %s (%d)"),
> + status, ifname, ifindex);
> + rc = 1;
> + break;
> + }
Ok. Did that. v12 with an addition of my own coming shortly. Phew.
Thanks.
Stefan
More information about the libvir-list
mailing list