Re: [RFC] Refactoring bridge driver for portability

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/23/2012 07:54 AM, Roman Bogorodskiy wrote:
> Hi,
>
> Few weeks ago when I have submitted my all-in-one huge FreeBSD,
> Eric made some comments on the networking part:
>
> http://www.redhat.com/archives/libvir-list/2012-December/msg00432.html
>
> Now when we're done with most of the other things, I'd like
> to discuss networking in more detail.
>
> Basically, the main question that bothers me is what would be the
> best way to refactor network/bridge_driver.c?
>
> Currently it contains a number of things:
>
>  - dnsmasq routines, static, but cross-platform, doesn't need
>    any changes (at least major ones)
>  - the same for radvd
>  - minor firewalld bits, that are linux specifc
>  - iptables routines. There are quite a lot of that code
>    and it's also gets called from many places in the file

Note that there is already viriptables.c in src/util. Of course those
are lower level primitives, but they were really created with the needs
of bridge_driver.c in mind.


>
> I'm thinking about an approach that Eric mentioned for virthread.c:
>
> - keep dnsmasq and radvd in bridge_driver.c
> - move out all linux specific code to bridge_driver_linux.c and
>   #include it in a way similar to virthread.c

I must have missed that message. I dislike #including .c files, if
that's what you're talking about.


> - in a similar way create bridge_driver_freebsd.c
>
> Does it sound reasonable?

I don't mind the idea of bridge_driver_xxx.c and bridge_driver.c, but I
think that the appropriate bridge_driver_xxx.c should be added to the
Makefile rather than #included in bridge_driver.c.

I would do it by having a common .h file bridge_driver_platform.h which
had a set of functions that must be defined for any supported platform,
then rewrite bridge_driver.c so that everything that isn't
platform-independent is turned into a call to a function or functions
declared in bridge_driver_platform.h and defined in
bridge_driver_(linux|freebsd).c

For example, the firewalld/dbus specific stuff can be considered as "an
opaque chunk of Linux specific code that must be executed during
networkStartup()". I think that can be taken care of by declaring a
function networkStartupPlatform() in bridge_driver_platform.h, then
defining it in both bridge_driver_linux.c and bridge_driver_freebsd.c
(where it may simply return success.)

All of the seemingly iptables-specific functions bridge_driver.c should
be renamed to use a more generic term in place of "iptables":


  networkAddIpSpecificIptablesRules
  networkAddMasqueradingFilterRules
  networkAddRoutingFilterRules
  networkReloadFilterRules
  networkRemoveFilterRules
  networkRemoveIpSPecificFilterRules
  networkRemoveGeneralFilterRules
  [etc]

Almost all of those functions should be able to remain in
bridge_driver.c; only the bottom-level functions that are directly
calling iptables(Add|Remove)*() functions should need to be moved to
bridge_driver_xxx.c (and re-written appropriately for FreeBSD). (Or
maybe the concepts behind the functions declared in
src/util/viriptables.h are generic enough that those functions should
also be renamed, and a new src/util/virpf.c (or whatever filtering
package is used on FreeeBSD these days - I haven't kept up with BSD for
a long time) defined that implements these filter*() functions for that
platform.


--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]