Пример #1
0
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 */
Пример #2
0
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);
}