Print this page


Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libdladm/common/linkprop.c
          +++ new/usr/src/lib/libdladm/common/linkprop.c
↓ open down ↓ 146 lines elided ↑ open up ↑
 147  147  static link_attr_t      *dladm_id2prop(mac_prop_id_t);
 148  148  
 149  149  static pd_getf_t        get_zone, get_autopush, get_rate_mod, get_rate,
 150  150                          get_speed, get_channel, get_powermode, get_radio,
 151  151                          get_duplex, get_link_state, get_binary, get_uint32,
 152  152                          get_flowctl, get_maxbw, get_cpus, get_priority,
 153  153                          get_tagmode, get_range, get_stp, get_bridge_forward,
 154  154                          get_bridge_pvid, get_protection, get_rxrings,
 155  155                          get_txrings, get_cntavail, get_secondary_macs,
 156  156                          get_allowedips, get_allowedcids, get_pool,
 157      -                        get_rings_range, get_linkmode_prop,
 158      -                        get_promisc_filtered;
      157 +                        get_rings_range, get_linkmode_prop;
 159  158  
 160  159  static pd_setf_t        set_zone, set_rate, set_powermode, set_radio,
 161  160                          set_public_prop, set_resource, set_stp_prop,
 162      -                        set_bridge_forward, set_bridge_pvid, set_secondary_macs,
 163      -                        set_promisc_filtered;
      161 +                        set_bridge_forward, set_bridge_pvid, set_secondary_macs;
 164  162  
 165  163  static pd_checkf_t      check_zone, check_autopush, check_rate, check_hoplimit,
 166  164                          check_encaplim, check_uint32, check_maxbw, check_cpus,
 167  165                          check_stp_prop, check_bridge_pvid, check_allowedips,
 168  166                          check_allowedcids, check_secondary_macs, check_rings,
 169  167                          check_pool, check_prop;
 170  168  
 171  169  struct prop_desc {
 172  170          /*
 173  171           * link property name
↓ open down ↓ 203 lines elided ↑ open up ↑
 377  375  
 378  376          { MAC_PROP_MAX_RX_RINGS_AVAIL,  sizeof (uint_t),
 379  377              "rxrings-available"},
 380  378  
 381  379          { MAC_PROP_MAX_RXHWCLNT_AVAIL,  sizeof (uint_t), "rxhwclnt-available"},
 382  380  
 383  381          { MAC_PROP_MAX_TXHWCLNT_AVAIL,  sizeof (uint_t), "txhwclnt-available"},
 384  382  
 385  383          { MAC_PROP_IB_LINKMODE, sizeof (uint32_t),      "linkmode"},
 386  384  
 387      -        { MAC_PROP_VN_PROMISC_FILTERED, sizeof (boolean_t), "promisc-filtered"},
 388      -
 389  385          { MAC_PROP_SECONDARY_ADDRS, sizeof (mac_secondary_addr_t),
 390  386              "secondary-macs"},
 391  387  
 392  388          { MAC_PROP_PRIVATE,     0,                      "driver-private"}
 393  389  };
 394  390  
 395  391  typedef struct bridge_public_prop_s {
 396  392          const char      *bpp_name;
 397  393          int             bpp_code;
 398  394  } bridge_public_prop_t;
↓ open down ↓ 37 lines elided ↑ open up ↑
 436  432          { "vlanonly",   LINK_TAGMODE_VLANONLY   }
 437  433  };
 438  434  
 439  435  static  val_desc_t      link_protect_vals[] = {
 440  436          { "mac-nospoof",        MPT_MACNOSPOOF  },
 441  437          { "restricted",         MPT_RESTRICTED  },
 442  438          { "ip-nospoof",         MPT_IPNOSPOOF   },
 443  439          { "dhcp-nospoof",       MPT_DHCPNOSPOOF },
 444  440  };
 445  441  
 446      -static  val_desc_t      link_promisc_filtered_vals[] = {
 447      -        { "off",        B_FALSE },
 448      -        { "on",         B_TRUE },
 449      -};
 450      -
 451  442  static val_desc_t       dladm_wlan_radio_vals[] = {
 452  443          { "on",         DLADM_WLAN_RADIO_ON     },
 453  444          { "off",        DLADM_WLAN_RADIO_OFF    }
 454  445  };
 455  446  
 456  447  static val_desc_t       dladm_wlan_powermode_vals[] = {
 457  448          { "off",        DLADM_WLAN_PM_OFF       },
 458  449          { "fast",       DLADM_WLAN_PM_FAST      },
 459  450          { "max",        DLADM_WLAN_PM_MAX       }
 460  451  };
↓ open down ↓ 296 lines elided ↑ open up ↑
 757  748              link_01_vals, VALCNT(link_01_vals),
 758  749              set_stp_prop, NULL, get_stp, check_stp_prop, PD_AFTER_PERM,
 759  750              DATALINK_CLASS_PHYS|DATALINK_CLASS_AGGR|
 760  751              DATALINK_CLASS_ETHERSTUB|DATALINK_CLASS_SIMNET, DL_ETHER },
 761  752  
 762  753          { "protection", { "--", RESET_VAL },
 763  754              link_protect_vals, VALCNT(link_protect_vals),
 764  755              set_resource, NULL, get_protection, check_prop, 0,
 765  756              DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
 766  757  
 767      -        { "promisc-filtered", { "on", 1 },
 768      -            link_promisc_filtered_vals, VALCNT(link_promisc_filtered_vals),
 769      -            set_promisc_filtered, NULL, get_promisc_filtered, check_prop, 0,
 770      -            DATALINK_CLASS_VNIC, DATALINK_ANY_MEDIATYPE },
 771      -
 772      -
 773  758          { "allowed-ips", { "--", 0 },
 774  759              NULL, 0, set_resource, NULL,
 775  760              get_allowedips, check_allowedips, PD_CHECK_ALLOC,
 776  761              DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
 777  762  
 778  763          { "allowed-dhcp-cids", { "--", 0 },
 779  764              NULL, 0, set_resource, NULL,
 780  765              get_allowedcids, check_allowedcids, PD_CHECK_ALLOC,
 781  766              DATALINK_CLASS_ALL, DATALINK_ANY_MEDIATYPE },
 782  767  
↓ open down ↓ 721 lines elided ↑ open up ↑
1504 1489  
1505 1490                  (void) strncpy(*prop_val, zone_name, DLADM_PROP_VAL_MAX);
1506 1491          } else {
1507 1492                  *prop_val[0] = '\0';
1508 1493          }
1509 1494  
1510 1495          return (DLADM_STATUS_OK);
1511 1496  }
1512 1497  
1513 1498  typedef int (*zone_get_devroot_t)(char *, char *, size_t);
     1499 +typedef int (*zone_get_brand_t)(char *, char *, size_t);
1514 1500  
1515 1501  static int
1516 1502  i_dladm_get_zone_dev(char *zone_name, char *dev, size_t devlen)
1517 1503  {
1518 1504          char                    root[MAXPATHLEN];
     1505 +        char                    brand[MAXPATHLEN]; /* Overkill, for sure. */
     1506 +        static char             *full_native_path = "/native/dev";
     1507 +        char                    *native_dev_path = full_native_path;
1519 1508          zone_get_devroot_t      real_zone_get_devroot;
     1509 +        zone_get_brand_t        real_zone_get_brand;
1520 1510          void                    *dlhandle;
1521 1511          void                    *sym;
1522 1512          int                     ret;
1523 1513  
1524 1514          if ((dlhandle = dlopen("libzonecfg.so.1", RTLD_LAZY)) == NULL)
1525 1515                  return (-1);
1526 1516  
1527 1517          if ((sym = dlsym(dlhandle, "zone_get_devroot")) == NULL) {
1528 1518                  (void) dlclose(dlhandle);
1529 1519                  return (-1);
1530 1520          }
1531      -
1532 1521          real_zone_get_devroot = (zone_get_devroot_t)sym;
1533 1522  
     1523 +        if ((sym = dlsym(dlhandle, "zone_get_brand")) == NULL) {
     1524 +                (void) dlclose(dlhandle);
     1525 +                return (-1);
     1526 +        }
     1527 +        real_zone_get_brand = (zone_get_devroot_t)sym;
     1528 +
     1529 +        /* Have "/dev" be LX-agile for possibility of "/native/dev". */
     1530 +        ret = real_zone_get_brand(zone_name, brand, sizeof (brand));
     1531 +        if (ret != 0) {
     1532 +                (void) dlclose(dlhandle);
     1533 +                return (ret);
     1534 +        }
     1535 +        /* Can use strcmp with constant string... */
     1536 +        if (strcmp(brand, "lx") != 0) {
     1537 +                /* Non-LX zone, don't use "/native/dev" */
     1538 +                native_dev_path += 7;   /* strlen("/native") */
     1539 +        }
     1540 +
1534 1541          if ((ret = real_zone_get_devroot(zone_name, root, sizeof (root))) == 0)
1535      -                (void) snprintf(dev, devlen, "%s%s", root, "/dev");
     1542 +                (void) snprintf(dev, devlen, "%s%s", root, native_dev_path);
1536 1543          (void) dlclose(dlhandle);
1537 1544          return (ret);
1538 1545  }
1539 1546  
1540 1547  static dladm_status_t
1541 1548  i_dladm_update_deventry(dladm_handle_t handle, zoneid_t zid,
1542 1549      datalink_id_t linkid, boolean_t add)
1543 1550  {
1544 1551          char            path[MAXPATHLEN];
1545 1552          char            name[MAXLINKNAMELEN];
↓ open down ↓ 48 lines elided ↑ open up ↑
1594 1601  
1595 1602          status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
1596 1603              NULL, &zid_old, sizeof (zid_old));
1597 1604          if (status != DLADM_STATUS_OK)
1598 1605                  return (status);
1599 1606  
1600 1607          zid_new = dzp->diz_zid;
1601 1608          if (zid_new == zid_old)
1602 1609                  return (DLADM_STATUS_OK);
1603 1610  
1604      -        if (flags & DLADM_OPT_TRANSIENT)
1605      -                dzp->diz_transient = B_TRUE;
1606      -
1607 1611          if ((status = set_public_prop(handle, pdp, linkid, vdp, val_cnt,
1608 1612              flags, media)) != DLADM_STATUS_OK)
1609 1613                  return (status);
1610 1614  
1611 1615          /*
1612 1616           * It is okay to fail to update the /dev entry (some vanity-named
1613 1617           * links do not have a /dev entry).
1614 1618           */
1615 1619          if (zid_old != GLOBAL_ZONEID) {
1616 1620                  (void) i_dladm_update_deventry(handle, zid_old, linkid,
↓ open down ↓ 3220 lines elided ↑ open up ↑
4837 4841                  s = "ud";
4838 4842                  break;
4839 4843          default:
4840 4844                  s = "";
4841 4845                  break;
4842 4846          }
4843 4847          (void) snprintf(prop_val[0], DLADM_STRSIZE, "%s", s);
4844 4848  
4845 4849          *val_cnt = 1;
4846 4850          return (DLADM_STATUS_OK);
4847      -}
4848      -
4849      -/*ARGSUSED*/
4850      -static dladm_status_t
4851      -get_promisc_filtered(dladm_handle_t handle, prop_desc_t *pdp,
4852      -    datalink_id_t linkid, char **prop_val, uint_t *val_cnt,
4853      -    datalink_media_t media, uint_t flags, uint_t *perm_flags)
4854      -{
4855      -        char                    *s;
4856      -        dladm_status_t          status;
4857      -        boolean_t               filt;
4858      -
4859      -        status = i_dladm_get_public_prop(handle, linkid, pdp->pd_name, flags,
4860      -            perm_flags, &filt, sizeof (filt));
4861      -        if (status != DLADM_STATUS_OK)
4862      -                return (status);
4863      -
4864      -        if (filt != 0)
4865      -                s = link_promisc_filtered_vals[1].vd_name;
4866      -        else
4867      -                s = link_promisc_filtered_vals[0].vd_name;
4868      -        (void) snprintf(prop_val[0], DLADM_STRSIZE, "%s", s);
4869      -
4870      -        *val_cnt = 1;
4871      -        return (DLADM_STATUS_OK);
4872      -}
4873      -
4874      -/* ARGSUSED */
4875      -static dladm_status_t
4876      -set_promisc_filtered(dladm_handle_t handle, prop_desc_t *pdp,
4877      -    datalink_id_t linkid, val_desc_t *vdp, uint_t val_cnt, uint_t flags,
4878      -    datalink_media_t media)
4879      -{
4880      -        dld_ioc_macprop_t       *dip;
4881      -        dladm_status_t          status = DLADM_STATUS_OK;
4882      -
4883      -        dip = i_dladm_buf_alloc_by_name(0, linkid, pdp->pd_name,
4884      -            0, &status);
4885      -
4886      -        if (dip == NULL)
4887      -                return (status);
4888      -
4889      -        (void) memcpy(dip->pr_val, &vdp->vd_val, dip->pr_valsize);
4890      -        status = i_dladm_macprop(handle, dip, B_TRUE);
4891      -
4892      -        free(dip);
4893      -        return (status);
4894 4851  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX