Print this page
Commit IPMP changes

*** 18,27 **** --- 18,28 ---- * * CDDL HEADER END */ /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright 2014 Nexenta Systems, Inc. All rights reserved. */ /* * This file contains routines to read/write formatted entries from/to * libipadm data store /etc/ipadm/ipadm.conf. Each entry in the DB is a
*** 49,58 **** --- 50,65 ---- * IPADM_NVP_DHCP - value holds wait time and primary info and when converted * to nvlist, will contain following nvpairs * wait: DATA_TYPE_INT32 * primary: DATA_TYPE_BOOLEAN * + * IPADM_NVP_FAMILIES - value holds interface families and when converted + * to nvlist, will be a DATA_TYPE_UINT16_ARRAY + * + * IPADM_NVP_MIFNAMES - value holds IPMP group members and when converted + * to nvlist, will be a DATA_TYPE_STRING_ARRAY + * * default - value is a single entity and when converted to nvlist, will * contain nvpair of type DATA_TYPE_STRING. nvpairs private to * ipadm are of this type. Further the property name and property * values are stored as nvpairs of this type. *
*** 96,110 **** */ typedef void ipadm_rfunc_t(nvlist_t *, char *name, char *value); static ipadm_rfunc_t i_ipadm_str_dbline2nvl, i_ipadm_ip4_dbline2nvl, i_ipadm_ip6_dbline2nvl, i_ipadm_intfid_dbline2nvl, ! i_ipadm_dhcp_dbline2nvl; static ipadm_wfunc_t i_ipadm_str_nvp2dbline, i_ipadm_ip4_nvp2dbline, i_ipadm_ip6_nvp2dbline, i_ipadm_intfid_nvp2dbline, ! i_ipadm_dhcp_nvp2dbline; /* * table of function pointers to read/write formatted entries from/to * ipadm.conf. */ --- 103,119 ---- */ typedef void ipadm_rfunc_t(nvlist_t *, char *name, char *value); static ipadm_rfunc_t i_ipadm_str_dbline2nvl, i_ipadm_ip4_dbline2nvl, i_ipadm_ip6_dbline2nvl, i_ipadm_intfid_dbline2nvl, ! i_ipadm_dhcp_dbline2nvl, i_ipadm_families_dbline2nvl, ! i_ipadm_groupmembers_dbline2nvl; static ipadm_wfunc_t i_ipadm_str_nvp2dbline, i_ipadm_ip4_nvp2dbline, i_ipadm_ip6_nvp2dbline, i_ipadm_intfid_nvp2dbline, ! i_ipadm_dhcp_nvp2dbline, i_ipadm_families_nvp2dbline, ! i_ipadm_groupmembers_nvp2dbline; /* * table of function pointers to read/write formatted entries from/to * ipadm.conf. */
*** 118,127 **** --- 127,140 ---- { IPADM_NVP_IPV6ADDR, i_ipadm_ip6_nvp2dbline, i_ipadm_ip6_dbline2nvl }, { IPADM_NVP_IPV4ADDR, i_ipadm_ip4_nvp2dbline, i_ipadm_ip4_dbline2nvl }, { IPADM_NVP_INTFID, i_ipadm_intfid_nvp2dbline, i_ipadm_intfid_dbline2nvl }, { IPADM_NVP_DHCP, i_ipadm_dhcp_nvp2dbline, i_ipadm_dhcp_dbline2nvl }, + { IPADM_NVP_FAMILIES, i_ipadm_families_nvp2dbline, + i_ipadm_families_dbline2nvl }, + { IPADM_NVP_MIFNAMES, i_ipadm_groupmembers_nvp2dbline, + i_ipadm_groupmembers_dbline2nvl}, { NULL, i_ipadm_str_nvp2dbline, i_ipadm_str_dbline2nvl } }; static ipadm_conf_ent_t * i_ipadm_find_conf_type(const char *type)
*** 613,622 **** --- 626,770 ---- return; primary = (strcmp(cp, "yes") == 0); (void) i_ipadm_add_dhcp2nvl(nvl, primary, (int32_t)wait_time); } + /* + * Input 'nvp': name = IPADM_NVP_FAMILIES and value = array of 'uint16_t' + * + * + */ + static size_t + i_ipadm_families_nvp2dbline(nvpair_t *nvp, char *buf, size_t buflen) + { + uint_t nelem = 0; + uint16_t *elem; + + assert(nvpair_type(nvp) == DATA_TYPE_UINT16_ARRAY); + + if (nvpair_value_uint16_array(nvp, + &elem, &nelem) != 0) { + buf[0] = '\0'; + return (0); + } + + assert(nelem != 0 || nelem > 2); + + if (nelem == 1) { + return (snprintf(buf, buflen, "%s=%d", + nvpair_name(nvp), elem[0])); + } else { + return (snprintf(buf, buflen, "%s=%d,%d", + nvpair_name(nvp), elem[0], elem[1])); + } + } + + /* + * name = IPADM_NVP_FAMILIES and value = <FAMILY>[,FAMILY] + * + * output nvp: name = IPADM_NVP_FAMILIES and value = array of 'uint16_t' + * + */ + static void + i_ipadm_families_dbline2nvl(nvlist_t *nvl, char *name, char *value) + { + uint16_t families[2]; + uint_t nelem = 0; + char *val, *lasts; + + if ((val = strtok_r(value, + ",", &lasts)) != NULL) { + families[0] = atoi(val); + nelem++; + if ((val = strtok_r(NULL, + ",", &lasts)) != NULL) { + families[1] = atoi(val); + nelem++; + } + nvlist_add_uint16_array(nvl, + IPADM_NVP_FAMILIES, families, nelem); + } + } + + /* + * input nvp: name = IPADM_NVP_MIFNAMES and value = array of 'char *' + * + * + */ + static size_t + i_ipadm_groupmembers_nvp2dbline(nvpair_t *nvp, char *buf, size_t buflen) + { + uint_t nelem = 0; + char **elem; + size_t n; + + assert(nvpair_type(nvp) == DATA_TYPE_STRING_ARRAY); + + if (nvpair_value_string_array(nvp, + &elem, &nelem) != 0) { + buf[0] = '\0'; + return (0); + } + + assert(nelem != 0); + + n = snprintf(buf, buflen, "%s=", IPADM_NVP_MIFNAMES); + if (n >= buflen) + return (n); + + while (nelem--) { + n = strlcat(buf, elem[nelem], buflen); + if (nelem > 0) + n = strlcat(buf, ",", buflen); + + if (n > buflen) + return (n); + } + + return (n); + } + + /* + * name = IPADM_NVP_MIFNAMES and value = <if_name>[,if_name] + * + * output nvp: name = IPADM_NVP_MIFNAMES and value = array of 'char *' + */ + static void + i_ipadm_groupmembers_dbline2nvl(nvlist_t *nvl, char *name, char *value) + { + char *members[256]; + char *member; + char *val, *lasts; + uint_t m_cnt = 0; + + assert(strcmp(name, IPADM_NVP_MIFNAMES) == 0 && value != NULL); + + if ((val = strtok_r(value, ",", &lasts)) != NULL) { + if ((member = calloc(1, LIFNAMSIZ)) == NULL) + return; + + strlcpy(member, val, LIFNAMSIZ); + members[m_cnt++] = member; + + while ((val = strtok_r(NULL, ",", &lasts)) != NULL) { + if ((member = calloc(1, LIFNAMSIZ)) == NULL) + goto fail; + + strlcpy(member, val, LIFNAMSIZ); + members[m_cnt++] = member; + } + + nvlist_add_string_array(nvl, IPADM_NVP_MIFNAMES, + members, m_cnt); + } + + fail: + while (m_cnt--) { + free(members[m_cnt]); + } + } + /* * Parses the buffer, for name-value pairs and creates nvlist. The value * is always considered to be a string. */ int