FreeBSD fills the int return value with ifr_flagshigh in the high 16 bits and ifr_flags in the low 16 bits rather than blindly promoting ifr_flags to an int, which will preserve the sign. This commit makes sure the flags returned isn't negative and apply mask 0xffff to flags.
Signed-off-by: Kevin Lo <ke...@freebsd.org> --- PATCH -> V2: - refine the commit message. --- diff --git a/lib/netdev-bsd.c b/lib/netdev-bsd.c index f97a5c3..9ed2823 100644 --- a/lib/netdev-bsd.c +++ b/lib/netdev-bsd.c @@ -1785,7 +1785,7 @@ static int ifr_get_flags(const struct ifreq *ifr) { #ifdef HAVE_STRUCT_IFREQ_IFR_FLAGSHIGH - return (ifr->ifr_flagshigh << 16) | ifr->ifr_flags; + return (ifr->ifr_flagshigh << 16) | (ifr->ifr_flags & 0xffff); #else return ifr->ifr_flags; #endif @@ -1794,9 +1794,11 @@ ifr_get_flags(const struct ifreq *ifr) static void ifr_set_flags(struct ifreq *ifr, int flags) { - ifr->ifr_flags = flags; #ifdef HAVE_STRUCT_IFREQ_IFR_FLAGSHIGH + ifr->ifr_flags = flags & 0xffff; ifr->ifr_flagshigh = flags >> 16; +#else + ifr->ifr_flags = flags; #endif } _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev