[libvirt] [PATCH] nwfilter: fix IP address learning
John Ferlan
jferlan at redhat.com
Sat May 26 12:07:22 UTC 2018
On 05/18/2018 07:59 AM, Daniel P. Berrangé wrote:
> In a previous commit:
>
> commit d4bf8f415074759baf051644559e04fe78888f8b
> Author: Daniel P. Berrangé <berrange at redhat.com>
> Date: Wed Feb 14 09:43:59 2018 +0000
>
> nwfilter: handle missing switch enum cases
>
> Ensure all enum cases are listed in switch statements, or cast away
> enum type in places where we don't wish to cover all cases.
>
> Reviewed-by: John Ferlan <jferlan at redhat.com>
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
>
> we changed a switch in the nwfilter learning thread so that it had
> explict cases for all enum entries. Unfortunately the parameters in the
> method had been declared with incorrect type. The "howDetect" parameter
> does *not* accept "enum howDetect" values, rather it accepts a bitmask
> of "enum howDetect" values, so it should have been an "int" type.
>
> The caller always passes DETECT_STATIC|DETECT_DHCP, so essentially the
> IP addressing learning was completely broken by the above change, as it
> never matched any switch case, hitting the default leading to EINVAL.
>
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
> src/nwfilter/nwfilter_learnipaddr.c | 13 ++++++-------
> src/nwfilter/nwfilter_learnipaddr.h | 2 +-
> 2 files changed, 7 insertions(+), 8 deletions(-)
>
This is a companion patch to:
https://www.redhat.com/archives/libvir-list/2018-May/msg01484.html
Still, perhaps to avoid future issues the howDetect related code should
adopt a bitmask model...
Since Daniel is away and it'd be good to get this into this release
(before he returns) I'll propose an alternative...
John
> diff --git a/src/nwfilter/nwfilter_learnipaddr.c b/src/nwfilter/nwfilter_learnipaddr.c
> index cc3bfd971c..061b39d72b 100644
> --- a/src/nwfilter/nwfilter_learnipaddr.c
> +++ b/src/nwfilter/nwfilter_learnipaddr.c
> @@ -144,7 +144,7 @@ struct _virNWFilterIPAddrLearnReq {
> char *filtername;
> virHashTablePtr filterparams;
> virNWFilterDriverStatePtr driver;
> - enum howDetect howDetect;
> + int howDetect; /* bitmask of enum howDetect */
>
> int status;
> volatile bool terminate;
> @@ -442,23 +442,22 @@ learnIPAddressThread(void *arg)
> if (techdriver->applyDHCPOnlyRules(req->ifname,
> &req->macaddr,
> NULL, false) < 0) {
> + VIR_DEBUG("Unable to apply DHCP only rules");
> req->status = EINVAL;
> goto done;
> }
> virBufferAddLit(&buf, "src port 67 and dst port 68");
> break;
> - case DETECT_STATIC:
> + default:
> if (techdriver->applyBasicRules(req->ifname,
> &req->macaddr) < 0) {
> + VIR_DEBUG("Unable to apply basic rules");
> req->status = EINVAL;
> goto done;
> }
> virBufferAsprintf(&buf, "ether host %s or ether dst ff:ff:ff:ff:ff:ff",
> macaddr);
> break;
> - default:
> - req->status = EINVAL;
> - goto done;
> }
>
> if (virBufferError(&buf)) {
> @@ -693,7 +692,7 @@ learnIPAddressThread(void *arg)
> * once its IP address has been detected
> * @driver : the network filter driver
> * @howDetect : the method on how the thread is supposed to detect the
> - * IP address; must choose any of the available flags
> + * IP address; bitmask of "enum howDetect" flags.
> *
> * Instruct to learn the IP address being used on a given interface (ifname).
> * Unless there already is a thread attempting to learn the IP address
> @@ -711,7 +710,7 @@ virNWFilterLearnIPAddress(virNWFilterTechDriverPtr techdriver,
> const char *filtername,
> virHashTablePtr filterparams,
> virNWFilterDriverStatePtr driver,
> - enum howDetect howDetect)
> + int howDetect)
> {
> int rc;
> virThread thread;
> diff --git a/src/nwfilter/nwfilter_learnipaddr.h b/src/nwfilter/nwfilter_learnipaddr.h
> index 06fea5bff8..753aabc594 100644
> --- a/src/nwfilter/nwfilter_learnipaddr.h
> +++ b/src/nwfilter/nwfilter_learnipaddr.h
> @@ -43,7 +43,7 @@ int virNWFilterLearnIPAddress(virNWFilterTechDriverPtr techdriver,
> const char *filtername,
> virHashTablePtr filterparams,
> virNWFilterDriverStatePtr driver,
> - enum howDetect howDetect);
> + int howDetect);
>
> bool virNWFilterHasLearnReq(int ifindex);
> int virNWFilterTerminateLearnReq(const char *ifname);
>
More information about the libvir-list
mailing list