int oce_m_unicast(void *arg, const uint8_t *uca) { struct oce_dev *dev = arg; int ret; DEV_LOCK(dev); if (dev->suspended) { bcopy(uca, dev->unicast_addr, ETHERADDRL); dev->num_smac = 0; DEV_UNLOCK(dev); return (DDI_SUCCESS); } /* Delete previous one and add new one */ ret = oce_del_mac(dev, dev->if_id, &dev->pmac_id); if (ret != DDI_SUCCESS) { DEV_UNLOCK(dev); return (EIO); } dev->num_smac = 0; bzero(dev->unicast_addr, ETHERADDRL); /* Set the New MAC addr earlier is no longer valid */ ret = oce_add_mac(dev, dev->if_id, uca, &dev->pmac_id); if (ret != DDI_SUCCESS) { DEV_UNLOCK(dev); return (EIO); } bcopy(uca, dev->unicast_addr, ETHERADDRL); dev->num_smac = 1; DEV_UNLOCK(dev); return (ret); } /* oce_m_unicast */
int oce_group_remmac(void *group_handle, const uint8_t *mac) { oce_group_t *grp = group_handle; struct oce_dev *dev; int ret; int pmac_index = 0; dev = grp->parent; while ((pmac_index < OCE_MAX_PMAC_PER_GRP)) { if (bcmp(mac, &grp->mac_addr[pmac_index], ETHERADDRL) == 0) { break; } pmac_index++; } if (pmac_index >= OCE_MAX_PMAC_PER_GRP) { oce_log(dev, CE_WARN, MOD_CONFIG, "Could not find the MAC: %x:%x:%x:%x:%x:%x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return (EINVAL); } /* Delete previous one */ ret = oce_del_mac(dev, grp->if_id, &grp->pmac_ids[pmac_index], MBX_BOOTSTRAP); if (ret != DDI_SUCCESS) { oce_log(dev, CE_WARN, MOD_CONFIG, "Failed to delete MAC: %x:%x:%x:%x:%x:%x, ret=0x%x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], ret); return (EIO); } grp->num_pmac--; dev->num_pmac--; grp->pmac_ids[pmac_index] = INVALID_PMAC_ID; bzero(&grp->mac_addr[pmac_index], ETHERADDRL); return (0); }