[Libvir] Support non-bridged network configs

Daniel P. Berrange berrange at redhat.com
Fri Nov 10 22:54:41 UTC 2006


The current code for parsing/serializing VIFs only really deals with the
default bridged networking config for Xen. So if one uses network-route
or network-nat it completely breaks. There is also no support for dealing
with IP address in the XML / SEXPR. The attached patch fixes both of these
issues, so we should be able to deal with any of the standard Xen networking
configs.

Regards,
Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
-------------- next part --------------
diff -c -r1.72 xend_internal.c
*** src/xend_internal.c	10 Nov 2006 11:13:01 -0000	1.72
--- src/xend_internal.c	10 Nov 2006 22:24:39 -0000
***************
*** 1698,1735 ****
              if (drvType)
                  free(drvType);
          } else if (sexpr_lookup(node, "device/vif")) {
!             const char *tmp2;
! 
!             tmp = sexpr_node(node, "device/vif/bridge");
!             tmp2 = sexpr_node(node, "device/vif/script");
!             if ((tmp != NULL) || (strstr(tmp2, "bridge"))) {
                  virBufferVSprintf(&buf, "    <interface type='bridge'>\n");
!                 if (tmp != NULL)
!                     virBufferVSprintf(&buf, "      <source bridge='%s'/>\n",
!                                       tmp);
!                 tmp = sexpr_node(node, "device/vif/vifname");
!                 if (tmp != NULL)
!                     virBufferVSprintf(&buf, "      <target dev='%s'/>\n",
!                                       tmp);
!                 tmp = sexpr_node(node, "device/vif/mac");
!                 if (tmp != NULL)
!                     virBufferVSprintf(&buf, "      <mac address='%s'/>\n",
!                                       tmp);
!                 tmp = sexpr_node(node, "device/vif/ip");
!                 if (tmp != NULL)
!                     virBufferVSprintf(&buf, "      <ip address='%s'/>\n",
!                                       tmp);
                  if (tmp2 != NULL)
!                     virBufferVSprintf(&buf, "      <script path='%s'/>\n",
                                        tmp2);
-                 virBufferAdd(&buf, "    </interface>\n", 17);
              } else {
!                 char serial[1000];
! 
!                 TODO sexpr2string(node, serial, 1000);
!                 virBufferVSprintf(&buf, "<!-- Failed to parse vif: %s -->\n",
!                                   serial);
              }
          }
      }
  
--- 1698,1732 ----
              if (drvType)
                  free(drvType);
          } else if (sexpr_lookup(node, "device/vif")) {
!             tmp = sexpr_node(node, "device/vif/script");
!             if (tmp && strstr(tmp, "bridge")) {
!                 const char *tmp2;
                  virBufferVSprintf(&buf, "    <interface type='bridge'>\n");
! 
!                 tmp2 = sexpr_node(node, "device/vif/bridge");
                  if (tmp2 != NULL)
!                     virBufferVSprintf(&buf, "      <source bridge='%s'/>\n",
                                        tmp2);
              } else {
!                 virBufferVSprintf(&buf, "    <interface type='default'>\n");
              }
+             if (tmp)
+                 virBufferVSprintf(&buf, "      <script path='%s'/>\n",
+                                   tmp);
+ 
+             tmp = sexpr_node(node, "device/vif/vifname");
+             if (tmp)
+                 virBufferVSprintf(&buf, "      <target dev='%s'/>\n",
+                                   tmp);
+             tmp = sexpr_node(node, "device/vif/mac");
+             if (tmp)
+                 virBufferVSprintf(&buf, "      <mac address='%s'/>\n",
+                                   tmp);
+             tmp = sexpr_node(node, "device/vif/ip");
+             if (tmp)
+                 virBufferVSprintf(&buf, "      <ip address='%s'/>\n",
+                                   tmp);
+             virBufferAdd(&buf, "    </interface>\n", 17);
          }
      }
  
diff -c -r1.45 xml.c
*** src/xml.c	10 Nov 2006 11:13:01 -0000	1.45
--- src/xml.c	10 Nov 2006 22:24:41 -0000
***************
*** 1113,1118 ****
--- 1116,1122 ----
      xmlChar *source = NULL;
      xmlChar *mac = NULL;
      xmlChar *script = NULL;
+     xmlChar *ip = NULL;
      int typ = 0;
  
      type = xmlGetProp(node, BAD_CAST "type");
***************
*** 1139,1144 ****
--- 1143,1155 ----
              } else if ((script == NULL) &&
                         (xmlStrEqual(cur->name, BAD_CAST "script"))) {
                  script = xmlGetProp(cur, BAD_CAST "path");
+             } else if ((ip == NULL) &&
+                        (xmlStrEqual(cur->name, BAD_CAST "ip"))) {
+                 /* XXX in future expect to need to have > 1 ip
+                    address element - eg ipv4 & ipv6. For now
+                    xen only supports a single address though
+                    so lets ignore that complication */
+                 ip = xmlGetProp(cur, BAD_CAST "address");
              }
          }
          cur = cur->next;
***************
*** 1155,1160 ****
--- 1166,1173 ----
      }
      if (script != NULL)
          virBufferVSprintf(buf, "(script '%s')", script);
+     if (ip != NULL)
+         virBufferVSprintf(buf, "(ip '%s')", ip);
      if (hvm)
          virBufferAdd(buf, "(type ioemu)", 12);
  
***************
*** 1165,1170 ****
--- 1178,1185 ----
          xmlFree(source);
      if (script != NULL)
          xmlFree(script);
+     if (ip != NULL)
+         xmlFree(ip);
      return (0);
  }
  
diff -c -r1.2 sexpr2xml-fv-v2.xml
*** tests/sexpr2xmldata/sexpr2xml-fv-v2.xml	9 Oct 2006 14:32:07 -0000	1.2
--- tests/sexpr2xmldata/sexpr2xml-fv-v2.xml	10 Nov 2006 22:24:41 -0000
***************
*** 29,36 ****
      </disk>
      <interface type='bridge'>
        <source bridge='xenbr0'/>
-       <mac address='00:16:3e:1b:b1:47'/>
        <script path='vif-bridge'/>
      </interface>
      <graphics type='vnc' port='5903'/>
    </devices>
--- 29,36 ----
      </disk>
      <interface type='bridge'>
        <source bridge='xenbr0'/>
        <script path='vif-bridge'/>
+       <mac address='00:16:3e:1b:b1:47'/>
      </interface>
      <graphics type='vnc' port='5903'/>
    </devices>
diff -c -r1.2 sexpr2xml-fv.xml
*** tests/sexpr2xmldata/sexpr2xml-fv.xml	9 Oct 2006 14:32:07 -0000	1.2
--- tests/sexpr2xmldata/sexpr2xml-fv.xml	10 Nov 2006 22:24:41 -0000
***************
*** 23,30 ****
      </disk>
      <interface type='bridge'>
        <source bridge='xenbr0'/>
-       <mac address='00:16:3e:1b:b1:47'/>
        <script path='vif-bridge'/>
      </interface>
      <disk type='file' device='cdrom'>
        <driver name='file'/>
--- 23,30 ----
      </disk>
      <interface type='bridge'>
        <source bridge='xenbr0'/>
        <script path='vif-bridge'/>
+       <mac address='00:16:3e:1b:b1:47'/>
      </interface>
      <disk type='file' device='cdrom'>
        <driver name='file'/>


More information about the libvir-list mailing list