[Libvirt-cim] [PATCH 11/15] vlan extension - CIM model - add help functions

Wayne Xia xiawenc at linux.vnet.ibm.com
Wed Dec 7 09:25:44 UTC 2011


this patch modified some existing files to let some function could be used
by the new codes, and added new help functions in network_model.c.

Signed-off-by: Wayne Xia <xiawenc at linux.vnet.ibm.com>
---
 libxkutil/network_model.c                 |  466 +++++++++++++++++++++++++++++
 libxkutil/network_model.h                 |  105 +++++++
 src/Virt_HostSystem.c                     |    2 +-
 src/Virt_HostSystem.h                     |    2 +
 src/Virt_VirtualSystemManagementService.c |   17 +-
 src/Virt_VirtualSystemManagementService.h |   10 +
 6 files changed, 592 insertions(+), 10 deletions(-)
 create mode 100644 libxkutil/network_model.c
 create mode 100644 libxkutil/network_model.h

diff --git a/libxkutil/network_model.c b/libxkutil/network_model.c
new file mode 100644
index 0000000..eeee1aa
--- /dev/null
+++ b/libxkutil/network_model.c
@@ -0,0 +1,466 @@
+/*
+ * Copyright IBM Corp. 2011
+ *
+ * Authors:
+ *  Wenchao Xia <xiawenc at cn.ibm.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ */
+
+#include <string.h>
+
+#include "network_model.h"
+#include "device_parsing.h"
+
+#include "cmpidt.h"
+#include "cmpift.h"
+#include "cmpimacs.h"
+
+/* this function would return a new allocated string or NULL */
+char *compare_and_switch_prefix(const char *orig_str,
+                                const char *orig_prefix,
+                                const char *dest_prefix)
+{
+        int orig_prefix_len, dest_prefix_len, asret;
+        char *retstr = NULL;
+        const char *suffix;
+        if (orig_str == NULL) {
+                goto out;
+        }
+        orig_prefix_len = strlen(orig_prefix);
+        dest_prefix_len = strlen(dest_prefix);
+        if (0 != strncmp(orig_str, orig_prefix, orig_prefix_len)) {
+                goto out;
+        }
+        suffix = orig_str + orig_prefix_len;
+        asret = asprintf(&retstr, "%s%s", dest_prefix, suffix);
+        if (asret == -1) {
+                free(retstr);
+                retstr = NULL;
+        }
+ out:
+        return retstr;
+}
+
+char *switch_device_id_prefix(const char *whole_id,
+                              const char *orig_prefix,
+                              const char *dest_prefix)
+{
+        char *system = NULL;
+        char *device = NULL;
+        char *new_id = NULL;
+        char *retstr = NULL;
+        int asret;
+
+
+        if (0 == parse_fq_devid(whole_id, &system, &device)) {
+                goto out;
+        }
+
+        new_id = compare_and_switch_prefix(device,
+                           orig_prefix, dest_prefix);
+
+        if (new_id == NULL) {
+                goto out;
+        }
+        asret = asprintf(&retstr, "%s/%s", system, new_id);
+        if (asret == -1) {
+                free(retstr);
+                retstr = NULL;
+        }
+
+ out:
+        free(system);
+        free(device);
+        free(new_id);
+        return retstr;
+}
+
+char *ep_id_to_easdea_id(const char *epid)
+{
+        return switch_device_id_prefix(epid,
+                      ETHPORT_PREFIX, ETHPORT_ALLOCATION_SD_PREFIX);
+}
+
+char *easdea_id_to_ep_id(const char *epid)
+{
+        return switch_device_id_prefix(epid,
+                      ETHPORT_ALLOCATION_SD_PREFIX, ETHPORT_PREFIX);
+}
+
+char *ep_id_to_easdec_id(const char *epid)
+{
+        return switch_device_id_prefix(epid,
+                      ETHPORT_PREFIX, ETHPORT_CONNECTION_SD_PREFIX);
+}
+
+char *easdec_id_to_ep_id(const char *epid)
+{
+        return switch_device_id_prefix(epid,
+                      ETHPORT_CONNECTION_SD_PREFIX, ETHPORT_PREFIX);
+}
+
+char *vlanid_to_connection_name(const int id)
+{
+        int asret;
+        char *str = NULL;
+        char *prefix = CONNECTION_VLAN_PREFIX;
+        asret = asprintf(&str, "%s%d", prefix, id);
+        if (asret == -1) {
+                return NULL;
+        }
+        return str;
+}
+
+int vlanid_from_connection_name(const char *name)
+{
+        int id = -1;
+        int temp = -1;
+        char *prefix = CONNECTION_VLAN_PREFIX;
+        char *dig_start, *dig_end;
+        if (name == NULL) {
+                goto out;
+        }
+        dig_start = strstr(name, prefix);
+        if (dig_start == NULL) {
+                goto out;
+        }
+        dig_start += strlen(prefix);
+        temp = strtol(dig_start, &dig_end, 10);
+        if ((dig_start == dig_end) || (temp < 0) || (temp > 4095)) {
+                goto out;
+        }
+        id = temp;
+ out:
+        return id;
+}
+
+int eth_iface_filter_cim_ethport(const EthIface *piface,
+                                             void *nouse)
+{
+        if (piface->eth_type == ETH_TYPE_BRIDGE) {
+            return 0;
+        }
+        if (piface->eth_type == ETH_TYPE_LOOPBACK) {
+            return 0;
+        }
+        return 1;
+}
+
+int eth_iface_filter_cim_ethport_for_name(const EthIface *piface,
+                                             void *name)
+{
+        int cim_ethport_flag;
+        cim_ethport_flag = eth_iface_filter_cim_ethport(piface, NULL);
+        if (cim_ethport_flag == 1) {
+                if (0 == strcmp(piface->name, name)) {
+                        return 1;
+                }
+        }
+        return 0;
+}
+
+/* returned value need to be freed */
+char *get_ethportsd_name_from_iface(const char *iface_name, const int type)
+{
+        char *prefix;
+        char *name;
+        int size;
+
+        if (iface_name == NULL) {
+                return NULL;
+        }
+
+        if (type == EASD_TYPE_EA) {
+                prefix = ETHPORT_ALLOCATION_SD_PREFIX;
+        } else {
+                prefix = ETHPORT_CONNECTION_SD_PREFIX;
+        }
+
+        size = strlen(iface_name)+strlen(prefix)+1;
+        SAFE_MALLOC(name, size);
+        snprintf(name, size, "%s%s", prefix, iface_name);
+        return name;
+}
+
+/* returned value need to be freed */
+char *get_iface_name_from_ethportsd(const char *ethport_name, int *ptype)
+{
+        char *prefix;
+        char *name = NULL;
+        int size;
+        int prefix_len;
+        int t = -1;
+
+        if (ethport_name == NULL) {
+                goto out;
+        }
+
+        prefix = ETHPORT_ALLOCATION_SD_PREFIX;
+        prefix_len = strlen(prefix);
+        if (0 != strncmp(ethport_name, prefix, prefix_len)) {
+                prefix = ETHPORT_CONNECTION_SD_PREFIX;
+                prefix_len = strlen(prefix);
+                if (0 != strncmp(ethport_name, prefix, prefix_len)) {
+                        goto out;
+                } else {
+                        t = EASD_TYPE_EC;
+                }
+        } else {
+                t = EASD_TYPE_EA;
+        }
+        size = strlen(ethport_name)-strlen(prefix)+1;
+        SAFE_MALLOC(name, size);
+        snprintf(name, size, "%s", ethport_name+prefix_len);
+
+ out:
+        if (ptype != NULL) {
+                *ptype = t;
+        }
+        return name;
+}
+
+int eth_iface_filter_cim_switch(const EthIface *piface,
+                                             void *nouse)
+{
+        if (piface->eth_type == ETH_TYPE_BRIDGE) {
+            return 1;
+        }
+        return eth_iface_filter_peths(piface, nouse);
+}
+
+int eth_iface_filter_cim_switch_for_name(const EthIface *piface,
+                                             void *name)
+{
+        int cim_switch_flag;
+        cim_switch_flag = eth_iface_filter_cim_switch(piface, NULL);
+        if (cim_switch_flag == 1) {
+                if (0 == strcmp(piface->name, name)) {
+                        return 1;
+                }
+        }
+        return 0;
+}
+
+/* returned value need to be freed */
+char *get_switch_name_from_iface(const char *iface_name)
+{
+    char *prefix = SWITCH_PREFIX;
+    char *name;
+    int size;
+
+    size = strlen(iface_name)+strlen(prefix)+1;
+    SAFE_MALLOC(name, size);
+    snprintf(name, size, "%s%s", prefix, iface_name);
+    return name;
+}
+
+/* returned value need to be freed */
+char *get_iface_name_from_switch(const char *switch_name)
+{
+    char *prefix = SWITCH_PREFIX;
+    char *name;
+    int size;
+    int prefix_len;
+
+    prefix_len = strlen(prefix);
+    if (0 != strncmp(switch_name, prefix, prefix_len)) {
+        return NULL;
+    }
+    size = strlen(switch_name)-strlen(prefix)+1;
+    SAFE_MALLOC(name, size);
+    snprintf(name, size, "%s", switch_name+prefix_len);
+    return name;
+}
+
+/* returned value need to be freed */
+char *get_ethport_name_from_iface(const char *iface_name)
+{
+        char *prefix;
+        char *name;
+        int size;
+
+        if (iface_name == NULL) {
+                return NULL;
+        }
+
+        prefix = ETHPORT_PREFIX;
+        size = strlen(iface_name)+strlen(prefix)+1;
+        SAFE_MALLOC(name, size);
+        snprintf(name, size, "%s%s", prefix, iface_name);
+        return name;
+}
+
+/* returned value need to be freed */
+char *get_iface_name_from_ethport(const char *ethport_name)
+{
+        char *prefix = ETHPORT_PREFIX;
+        char *name = NULL;
+        int size;
+        int prefix_len;
+
+        if (ethport_name == NULL) {
+                goto out;
+        }
+
+        prefix = ETHPORT_PREFIX;
+        prefix_len = strlen(prefix);
+        if (0 != strncmp(ethport_name, prefix, prefix_len)) {
+                goto out;
+        }
+        size = strlen(ethport_name)-prefix_len+1;
+        SAFE_MALLOC(name, size);
+        snprintf(name, size, "%s", ethport_name+prefix_len);
+
+ out:
+        return name;
+}
+
+int get_possible_bridge_name_for_cim_model(EthIface *piface,
+                                    char **pbr1name, char **pbr2name)
+{
+        char *br1_name;
+        char *br2_name;
+        if (piface->attach_bridge != NULL) {
+                br1_name = get_switch_name_from_iface(piface->attach_bridge);
+        } else if (piface->dep_ifname != NULL) {
+                br1_name = get_switch_name_from_iface(piface->dep_ifname);
+        } else if (piface->eth_type == ETH_TYPE_PHYSICAL) {
+                br1_name = get_switch_name_from_iface(piface->name);
+        } else {
+                br1_name = NULL;
+        }
+
+        if ((piface->attach_bridge != NULL) && (piface->dep_ifname != NULL)) {
+                br2_name = get_switch_name_from_iface(piface->dep_ifname);
+        } else {
+                br2_name = NULL;
+        }
+
+        *pbr1name = br1_name;
+        *pbr2name = br2_name;
+        return 1;
+}
+
+CMPIStatus get_array_uint16_from_instance(const CMPIBroker *broker,
+                                                 CMPIInstance *inst,
+                                                 char *array_name,
+                                                 int *ret_result,
+                                                 int *ret_size,
+                                                 int max_size)
+{
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+        CMPIArray *array;
+        CMPICount array_size;
+        CMPIData elem;
+        int i, ret, count = 0;
+
+        ret = cu_get_array_prop(inst, array_name, &array);
+        if (ret != CMPI_RC_OK) {
+                cu_statusf(broker, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "array property not found.");
+                CU_DEBUG("Failed to get array property %s.", array_name);
+                goto out;
+        }
+        array_size = CMGetArrayCount(array, &s);
+        if ((s.rc != CMPI_RC_OK) || (array_size > max_size) ||
+                                  (array_size <= 0)) {
+                cu_statusf(broker, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "failed to get size of array property,"
+                           " or its size is 0 or too big.");
+                CU_DEBUG("failed in getting size of %s property.", array_name);
+                goto out;
+        }
+        for (i = 0; i < array_size; i++) {
+                elem = CMGetArrayElementAt(array, i, NULL);
+                if (CMIsNullValue(elem)) {
+                        cu_statusf(broker, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "NULL content of array property.");
+                        CU_DEBUG("NULL content of %s property.", array_name);
+                        goto out;
+                }
+                if (!(elem.type & CMPI_INTEGER)) {
+                        cu_statusf(broker, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "wrong type of array property.");
+                        CU_DEBUG("wrong type of %s property.", array_name);
+                        goto out;
+                }
+                ret_result[count] = elem.value.uint16;
+                count++;
+        }
+ out:
+        *ret_size = count;
+        return s;
+}
+
+CMPIStatus get_array_string_from_instance(const CMPIBroker *broker,
+                                                 CMPIInstance *inst,
+                                                 char *array_name,
+                                                 char **ret_result,
+                                                 int *ret_size,
+                                                 int max_size)
+{
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+        CMPIArray *array;
+        CMPICount array_size;
+        CMPIData elem;
+        const char *str;
+        int i, ret, count = 0;
+
+        ret = cu_get_array_prop(inst, array_name, &array);
+        if (ret != CMPI_RC_OK) {
+                cu_statusf(broker, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "array property not found.");
+                CU_DEBUG("Failed to get array property %s.", array_name);
+                goto out;
+        }
+        array_size = CMGetArrayCount(array, &s);
+        if ((s.rc != CMPI_RC_OK) || (array_size > max_size) ||
+                                  (array_size <= 0)) {
+                cu_statusf(broker, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "failed to get size of array property,"
+                           " or its size is 0 or too big.");
+                CU_DEBUG("failed in getting size of %s property.", array_name);
+                goto out;
+        }
+        for (i = 0; i < array_size; i++) {
+                elem = CMGetArrayElementAt(array, i, NULL);
+                if (CMIsNullValue(elem)) {
+                        cu_statusf(broker, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "NULL content of array property.");
+                        CU_DEBUG("NULL content of %s property.", array_name);
+                        goto out;
+                }
+                str = NULL;
+                str = CMGetCharPtr(elem.value.string);
+                if (str == NULL) {
+                        CU_DEBUG("Could not extract char pointer from "
+                                 "CMPIArray %s.", array_name);
+                        goto out;
+                }
+                ret_result[count] = SAFE_STRDUP(str);
+                count++;
+        }
+ out:
+        *ret_size = count;
+        return s;
+}
diff --git a/libxkutil/network_model.h b/libxkutil/network_model.h
new file mode 100644
index 0000000..3452836
--- /dev/null
+++ b/libxkutil/network_model.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright IBM Corp. 2011
+ *
+ * Authors:
+ *  Wenchao Xia <xiawenc at cn.ibm.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ */
+
+#ifndef NETWORK_MODEL_H
+#define NETWORK_MODEL_H
+
+#include "host_network_API.h"
+
+#define EASD_TYPE_EA 1
+#define EASD_TYPE_EC 2
+
+#define NETWORK_CLASS_PREFIX "Net"
+
+#define SWITCH_PREFIX "VS_"
+#define VESSD_SYSTEM_PREFIX "Virt"
+#define ETHPORT_PREFIX "EP_"
+#define ETHPORT_ALLOCATION_SD_PREFIX "EA_"
+#define ETHPORT_CONNECTION_SD_PREFIX "EC_"
+
+#define CONNECTION_VLAN_PREFIX "VLAN"
+
+#define CIM_NUM_NET_ETHERNET 2
+#define CIM_NUM_SWITCH_DEDICATED 38
+#define CIM_NUM_SWITCHPORT 30
+#define CIM_NUM_VLAN_MODE_TRUNK 5
+#define CIM_NUM_CONSUMERVISIBILITY_PASSEDTHROUGH 2
+#define CIM_NUM_CONSUMERVISIBILITY_VIRTUALIZED 3
+
+char *get_switch_name_from_iface(const char *iface_name);
+char *get_iface_name_from_switch(const char *switch_name);
+
+char *get_ethport_name_from_iface(const char *iface_name);
+char *get_iface_name_from_ethport(const char *ethport_name);
+
+char *get_ethportsd_name_from_iface(const char *iface_name, const int type);
+char *get_iface_name_from_ethportsd(const char *ethport_name, int *ptype);
+
+char *ep_id_to_easdea_id(const char *epid);
+char *easdea_id_to_ep_id(const char *epid);
+char *ep_id_to_easdec_id(const char *epid);
+char *easdec_id_to_ep_id(const char *epid);
+
+char *vlanid_to_connection_name(const int id);
+int vlanid_from_connection_name(const char *name);
+
+
+
+
+
+int eth_iface_filter_cim_switch(const EthIface *piface,
+                                             void *nouse);
+int eth_iface_filter_cim_switch_for_name(const EthIface *piface,
+                                             void *name);
+int eth_iface_filter_cim_ethport(const EthIface *piface,
+                                             void *nouse);
+int eth_iface_filter_cim_ethport_for_name(const EthIface *piface,
+                                             void *name);
+
+int get_possible_bridge_name_for_cim_model(EthIface *piface,
+                                    char **pbr1name, char **pbr2name);
+
+
+char *compare_and_switch_prefix(const char *orig_str,
+                                const char *orig_prefix,
+                                const char *dest_prefix);
+
+char *switch_device_id_prefix(const char *whole_id,
+                              const char *orig_prefix,
+                              const char *dest_prefix);
+
+/* other help function related to CIM */
+CMPIStatus get_array_uint16_from_instance(const CMPIBroker *broker,
+                                                 CMPIInstance *inst,
+                                                 char *array_name,
+                                                 int *ret_result,
+                                                 int *ret_size,
+                                                 int max_size);
+
+CMPIStatus get_array_string_from_instance(const CMPIBroker *broker,
+                                                 CMPIInstance *inst,
+                                                 char *array_name,
+                                                 char **ret_result,
+                                                 int *ret_size,
+                                                 int max_size);
+
+
+#endif
diff --git a/src/Virt_HostSystem.c b/src/Virt_HostSystem.c
index 724a5ea..de8ec13 100644
--- a/src/Virt_HostSystem.c
+++ b/src/Virt_HostSystem.c
@@ -76,7 +76,7 @@ static int resolve_host(char *host, char *buf, int size)
         return 0;
 }
 
-static int get_fqdn(char *buf, int size)
+int get_fqdn(char *buf, int size)
 {
         char host[256];
         int ret = 0;
diff --git a/src/Virt_HostSystem.h b/src/Virt_HostSystem.h
index 53ebf1c..3b988c1 100644
--- a/src/Virt_HostSystem.h
+++ b/src/Virt_HostSystem.h
@@ -21,6 +21,8 @@
 #ifndef __VIRT_HOSTSYSTEM_H
 #define __VIRT_HOSTSYSTEM_H
 
+int get_fqdn(char *buf, int size);
+
 CMPIStatus get_host(const CMPIBroker *broker,
                     const CMPIContext *context,
                     const CMPIObjectPath *reference,
diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 21979c3..cd1672f 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -1,9 +1,8 @@
 /*
- * Copyright IBM Corp. 2007
+ * Copyright IBM Corp. 2011
  *
  * Authors:
- *  Dan Smith <danms at us.ibm.com>
- *  Jay Gagnon <grendel at linux.vnet.ibm.com>
+ *  Wayne Xia <xiawenc at cn.ibm.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -234,11 +233,11 @@ static CMPIStatus check_uuid_in_use(const CMPIObjectPath *ref,
         return s;
 }
 
-static CMPIStatus define_system_parse_args(const CMPIArgs *argsin,
-                                           CMPIInstance **sys,
-                                           const char *ns,
-                                           CMPIArray **res,
-                                           CMPIObjectPath **refconf)
+CMPIStatus define_system_parse_args(const CMPIArgs *argsin,
+                                    CMPIInstance **sys,
+                                    const char *ns,
+                                    CMPIArray **res,
+                                    CMPIObjectPath **refconf)
 {
         CMPIStatus s = {CMPI_RC_OK, NULL};
 
@@ -2877,7 +2876,7 @@ static CMPIStatus _update_resources_for(const CMPIContext *context,
         return s;
 }
 
-static CMPIStatus get_instanceid(CMPIInstance *rasd,
+CMPIStatus get_instanceid(CMPIInstance *rasd,
                                  char **domain,
                                  char **devid)
 {
diff --git a/src/Virt_VirtualSystemManagementService.h b/src/Virt_VirtualSystemManagementService.h
index dbf17cb..eba7124 100644
--- a/src/Virt_VirtualSystemManagementService.h
+++ b/src/Virt_VirtualSystemManagementService.h
@@ -29,6 +29,16 @@
 #define INC_KVM_WEIGHT 1
 #define DEFAULT_KVM_WEIGHT 1024
 
+CMPIStatus get_instanceid(CMPIInstance *rasd,
+                          char **domain,
+                          char **devid);
+
+CMPIStatus define_system_parse_args(const CMPIArgs *argsin,
+                                    CMPIInstance **sys,
+                                    const char *ns,
+                                    CMPIArray **res,
+                                    CMPIObjectPath **refconf);
+
 CMPIStatus get_vsms(const CMPIObjectPath *reference,
                     CMPIInstance **_inst,
                     const CMPIBroker *broker,
-- 
1.7.6





More information about the Libvirt-cim mailing list