Remove configuration items on switches for:
* adding static interfaces

Adding static interfaces are to be set in hostname.if.

Changed rule on rdomain:
* vm->interface->rdomain takes precedence over sw->rdomain

Update examples/vm.conf and vm.conf manpage to reflect changes.

Comments? Ok?

diff --git etc/examples/vm.conf etc/examples/vm.conf
index f35235e3fba..d61ce8c4977 100644
--- etc/examples/vm.conf
+++ etc/examples/vm.conf
@@ -10,15 +10,14 @@ sets="/var/www/htdocs/pub/OpenBSD/snapshots/amd64/"
 #
 
 switch "uplink" {
-       # This interface will default to bridge0, but switch(4) is supported
+       # This switch will use bridge0, defined by /etc/hostname.bridge0, as
+       # the underlying interface.  switch(4) is also supported
        #interface switch0
-
-       # Add additional members
-       add em0
+       interface bridge0
 }
 
 switch "local" {
-       add vether0
+       interface bridge1
        down
 }
 
diff --git usr.sbin/vmd/parse.y usr.sbin/vmd/parse.y
index a0e96545923..18543a74911 100644
--- usr.sbin/vmd/parse.y
+++ usr.sbin/vmd/parse.y
@@ -88,7 +88,6 @@ int            parse_disk(char *);
 static struct vmop_create_params vmc;
 static struct vm_create_params *vcp;
 static struct vmd_switch       *vsw;
-static struct vmd_if           *vif;
 static struct vmd_vm           *vm;
 static char                     vsw_type[IF_NAMESIZE];
 static int                      vcp_disable;
@@ -193,7 +192,6 @@ switch              : SWITCH string                 {
                        vsw->sw_id = env->vmd_nswitches + 1;
                        vsw->sw_name = $2;
                        vsw->sw_flags = VMIFF_UP;
-                       TAILQ_INIT(&vsw->sw_ifs);
 
                        vcp_disable = 0;
                } '{' optnl switch_opts_l '}'   {
@@ -224,21 +222,6 @@ switch_opts_l      : switch_opts_l switch_opts nl
 switch_opts    : disable                       {
                        vcp_disable = $1;
                }
-               | ADD string                    {
-                       char            type[IF_NAMESIZE];
-
-                       if ((vif = calloc(1, sizeof(*vif))) == NULL)
-                               fatal("could not allocate interface");
-
-                       if (priv_getiftype($2, type, NULL) == -1) {
-                               yyerror("invalid interface: %s", $2);
-                               free($2);
-                               YYERROR;
-                       }
-                       vif->vif_name = $2;
-
-                       TAILQ_INSERT_TAIL(&vsw->sw_ifs, vif, vif_entry);
-               }
                | GROUP string                  {
                        if (priv_validgroup($2) == -1) {
                                yyerror("invalid group name: %s", $2);
diff --git usr.sbin/vmd/priv.c usr.sbin/vmd/priv.c
index d585bf75a99..c099bdf4ba5 100644
--- usr.sbin/vmd/priv.c
+++ usr.sbin/vmd/priv.c
@@ -255,7 +255,17 @@ priv_validgroup(const char *name)
 }
 
 /*
- * Called from the process peer
+ * Called from the Parent process to setup vm interface(s)
+ * - ensure the interface has the description set (tracking purposes)
+ * - if interface is to be attached to a switch, attach it
+ * - check if rdomain is set on interface and switch
+ *   - if interface only or both, use interface rdomain
+ *   - if switch only, use switch rdomain
+ * - check if group is set on interface and switch
+ *   - if interface, add it
+ *   - if switch, add it
+ * - ensure the interface is up/down
+ * - if local interface, set address
  */
 
 int
@@ -279,18 +289,6 @@ vm_priv_ifconfig(struct privsep *ps, struct vmd_vm *vm)
                    sizeof(vfr.vfr_name)) >= sizeof(vfr.vfr_name))
                        return (-1);
 
-               /* Use the configured rdomain or get it from the process */
-               if (vif->vif_flags & VMIFF_RDOMAIN)
-                       vfr.vfr_id = vif->vif_rdomain;
-               else
-                       vfr.vfr_id = getrtable();
-               if (vfr.vfr_id != 0)
-                       log_debug("%s: interface %s rdomain %u", __func__,
-                           vfr.vfr_name, vfr.vfr_id);
-
-               proc_compose(ps, PROC_PRIV, IMSG_VMDOP_PRIV_IFRDOMAIN,
-                   &vfr, sizeof(vfr));
-
                /* Description can be truncated */
                (void)snprintf(vfr.vfr_value, sizeof(vfr.vfr_value),
                    "vm%u-if%u-%s", vm->vm_vmid, i, vcp->vcp_name);
@@ -301,8 +299,16 @@ vm_priv_ifconfig(struct privsep *ps, struct vmd_vm *vm)
                proc_compose(ps, PROC_PRIV, IMSG_VMDOP_PRIV_IFDESCR,
                    &vfr, sizeof(vfr));
 
-               /* Add interface to bridge/switch */
-               if ((vsw = switch_getbyname(vif->vif_switch)) != NULL) {
+               vsw = switch_getbyname(vif->vif_switch);
+               /* set default rdomain */
+               vfr.vfr_id = getrtable();
+
+               /* Check if switch should exist */
+               if (vsw == NULL && vif->vif_switch != NULL)
+                       log_warnx("switch \"%s\" not found", vif->vif_switch);
+
+               /* Add interface to switch and set proper rdomain */
+               if (vsw != NULL) {
                        memset(&vfbr, 0, sizeof(vfbr));
 
                        if (strlcpy(vfbr.vfr_name, vsw->sw_ifname,
@@ -311,18 +317,33 @@ vm_priv_ifconfig(struct privsep *ps, struct vmd_vm *vm)
                        if (strlcpy(vfbr.vfr_value, vif->vif_name,
                            sizeof(vfbr.vfr_value)) >= sizeof(vfbr.vfr_value))
                                return (-1);
-                       if (vsw->sw_flags & VMIFF_RDOMAIN)
-                               vfbr.vfr_id = vsw->sw_rdomain;
-                       else
-                               vfbr.vfr_id = getrtable();
 
-                       log_debug("%s: interface %s add %s", __func__,
-                           vfbr.vfr_name, vfbr.vfr_value);
+                       log_debug("%s: switch \"%s\" interface %s add %s",
+                           __func__, vsw->sw_name, vfbr.vfr_name,
+                           vfbr.vfr_value);
 
                        proc_compose(ps, PROC_PRIV, IMSG_VMDOP_PRIV_IFADD,
                            &vfbr, sizeof(vfbr));
-               } else if (vif->vif_switch != NULL)
-                       log_warnx("switch %s not found", vif->vif_switch);
+
+                       /* Check rdomain properties */
+                       if (vif->vif_flags & VMIFF_RDOMAIN)
+                               vfr.vfr_id = vif->vif_rdomain;
+                       else if (vsw->sw_flags & VMIFF_RDOMAIN)
+                               vfr.vfr_id = vsw->sw_rdomain;
+               } else {
+                       /* No switch to attach case*/
+                       /* Use the configured rdomain process */
+                       if (vif->vif_flags & VMIFF_RDOMAIN)
+                               vfr.vfr_id = vif->vif_rdomain;
+               }
+
+               /* Set rdomain on interface */
+               if (vfr.vfr_id != 0)
+                       log_debug("%s: interface %s rdomain %u", __func__,
+                           vfr.vfr_name, vfr.vfr_id);
+
+               proc_compose(ps, PROC_PRIV, IMSG_VMDOP_PRIV_IFRDOMAIN,
+                   &vfr, sizeof(vfr));
 
                /* First group is defined per-interface */
                if (vif->vif_group) {
@@ -343,7 +364,7 @@ vm_priv_ifconfig(struct privsep *ps, struct vmd_vm *vm)
                            sizeof(vfr.vfr_value)) >= sizeof(vfr.vfr_value))
                                return (-1);
 
-                       log_debug("%s: interface %s group %s switch %s",
+                       log_debug("%s: interface %s group %s switch \"%s\"",
                            __func__, vfr.vfr_name, vfr.vfr_value,
                            vsw->sw_name);
 
@@ -356,6 +377,7 @@ vm_priv_ifconfig(struct privsep *ps, struct vmd_vm *vm)
                    IMSG_VMDOP_PRIV_IFUP : IMSG_VMDOP_PRIV_IFDOWN,
                    &vfr, sizeof(vfr));
 
+               /* Set interface address if it is a local interface */
                if (vm->vm_params.vmc_ifflags[i] & VMIFF_LOCAL) {
                        sin4 = (struct sockaddr_in *)&vfr.vfr_ifra.ifra_mask;
                        sin4->sin_family = AF_INET;
@@ -382,10 +404,17 @@ vm_priv_ifconfig(struct privsep *ps, struct vmd_vm *vm)
        return (0);
 }
 
+/*
+ * Called from the Parent process to setup underlying switch interface
+ * - ensure the interface exists
+ * - ensure the interface has the correct rdomain set
+ * - ensure the interface has the description set (tracking purposes)
+ * - ensure the interface is up/down
+ */
+
 int
 vm_priv_brconfig(struct privsep *ps, struct vmd_switch *vsw)
 {
-       struct vmd_if           *vif;
        struct vmop_ifreq        vfr;
 
        memset(&vfr, 0, sizeof(vfr));
@@ -407,6 +436,7 @@ vm_priv_brconfig(struct privsep *ps, struct vmd_switch *vsw)
                log_debug("%s: interface %s rdomain %u", __func__,
                    vfr.vfr_name, vfr.vfr_id);
 
+       /* ensure switch has the correct rodmain */
        proc_compose(ps, PROC_PRIV, IMSG_VMDOP_PRIV_IFRDOMAIN,
            &vfr, sizeof(vfr));
 
@@ -420,18 +450,6 @@ vm_priv_brconfig(struct privsep *ps, struct vmd_switch 
*vsw)
        proc_compose(ps, PROC_PRIV, IMSG_VMDOP_PRIV_IFDESCR,
            &vfr, sizeof(vfr));
 
-       TAILQ_FOREACH(vif, &vsw->sw_ifs, vif_entry) {
-               if (strlcpy(vfr.vfr_value, vif->vif_name,
-                   sizeof(vfr.vfr_value)) >= sizeof(vfr.vfr_value))
-                       return (-1);
-
-               log_debug("%s: interface %s add %s", __func__,
-                   vfr.vfr_name, vfr.vfr_value);
-
-               proc_compose(ps, PROC_PRIV, IMSG_VMDOP_PRIV_IFADD,
-                   &vfr, sizeof(vfr));
-       }
-
        /* Set the new interface status to up or down */
        proc_compose(ps, PROC_PRIV, (vsw->sw_flags & VMIFF_UP) ?
            IMSG_VMDOP_PRIV_IFUP : IMSG_VMDOP_PRIV_IFDOWN,
diff --git usr.sbin/vmd/vm.conf.5 usr.sbin/vmd/vm.conf.5
index 6ce21896657..fd87f999d9f 100644
--- usr.sbin/vmd/vm.conf.5
+++ usr.sbin/vmd/vm.conf.5
@@ -166,6 +166,11 @@ will drop packets from the VM with altered source 
addresses.
 .It Cm rdomain Ar rdomainid
 Attach the interface to the routing domain with the specified
 .Ar rdomainid .
+If attaching to a switch that also has a
+.Ar rdomainid
+set, the
+.Ar rdomainid
+configured for the interface takes precedence.
 .It Cm switch Ar name
 Set the virtual switch
 by
@@ -211,9 +216,7 @@ or
 .Xr switch 4 .
 The network interface for each virtual switch defined in
 .Nm
-is automatically created by
-.Xr vmd 8 ,
-but it is also possible to pre-configure switch interfaces using
+is pre-configured using
 .Xr hostname.if 5
 or
 .Xr ifconfig 8
@@ -244,12 +247,6 @@ This name can be any string, and is typically a network 
name.
 .Pp
 Followed by a block of parameters that is enclosed in curly brackets:
 .Bl -tag -width Ds
-.It Cm add Ar interface
-Add
-.Ar interface
-as a member of the switch.
-Any network interface can be added, typically as an uplink interface,
-but it can be a member of at most one switch.
 .It Cm enable
 Automatically configure the switch.
 This is the default if neither
@@ -285,9 +282,6 @@ it will be used for each following switch.
 .It Cm rdomain Ar rdomainid
 Set the routing domain of the switch and all of its VM interfaces to
 .Ar rdomainid .
-This overwrites the
-.Cm rdomain
-option of VM interfaces.
 .It Cm up
 Start the switch forwarding packets.
 This is the default.
@@ -314,7 +308,6 @@ Create the switch "uplink" with an additional physical 
network interface:
 .Bd -literal -offset indent
 switch "uplink" {
        interface bridge0
-       add em0
 }
 .Ed
 .Sh SEE ALSO
diff --git usr.sbin/vmd/vmd.c usr.sbin/vmd/vmd.c
index 9e90c63cc99..9dbea8479f7 100644
--- usr.sbin/vmd/vmd.c
+++ usr.sbin/vmd/vmd.c
@@ -1172,10 +1172,6 @@ vm_register(struct privsep *ps, struct 
vmop_create_params *vmc,
                vm->vm_ifs[i].vif_fd = -1;
 
                if ((sw = switch_getbyname(vmc->vmc_ifswitch[i])) != NULL) {
-                       /* overwrite the rdomain, if configured on the switch */
-                       if (sw->sw_flags & VMIFF_RDOMAIN)
-                               vmc->vmc_ifrdomain[i] = sw->sw_rdomain;
-
                        /* inherit per-interface flags from the switch */
                        vmc->vmc_ifflags[i] |= (sw->sw_flags & VMIFF_OPTMASK);
                }
@@ -1342,20 +1338,11 @@ vm_closetty(struct vmd_vm *vm)
 void
 switch_remove(struct vmd_switch *vsw)
 {
-       struct vmd_if   *vif;
-
        if (vsw == NULL)
                return;
 
        TAILQ_REMOVE(env->vmd_switches, vsw, sw_entry);
 
-       while ((vif = TAILQ_FIRST(&vsw->sw_ifs)) != NULL) {
-               free(vif->vif_name);
-               free(vif->vif_switch);
-               TAILQ_REMOVE(&vsw->sw_ifs, vif, vif_entry);
-               free(vif);
-       }
-
        free(vsw->sw_group);
        free(vsw->sw_name);
        free(vsw);
diff --git usr.sbin/vmd/vmd.h usr.sbin/vmd/vmd.h
index a82aa8e8107..1b0789be756 100644
--- usr.sbin/vmd/vmd.h
+++ usr.sbin/vmd/vmd.h
@@ -191,7 +191,6 @@ struct vmd_if {
        unsigned int             vif_flags;
        TAILQ_ENTRY(vmd_if)      vif_entry;
 };
-TAILQ_HEAD(viflist, vmd_if);
 
 struct vmd_switch {
        uint32_t                 sw_id;
@@ -200,7 +199,6 @@ struct vmd_switch {
        char                    *sw_group;
        unsigned int             sw_rdomain;
        unsigned int             sw_flags;
-       struct viflist           sw_ifs;
        int                      sw_running;
        TAILQ_ENTRY(vmd_switch)  sw_entry;
 };
-- 
2.14.3

Reply via email to