static inline void oce_rx_insert_tag(mblk_t *mp, uint16_t vtag) { struct ether_vlan_header *ehp; (void) memmove(mp->b_rptr - VLAN_TAGSZ, mp->b_rptr, 2 * ETHERADDRL); mp->b_rptr -= VLAN_TAGSZ; ehp = (struct ether_vlan_header *)voidptr(mp->b_rptr); ehp->ether_tpid = htons(ETHERTYPE_VLAN); ehp->ether_tci = LE_16(vtag); }
/* * function to handle dlpi streams message from GLDv3 mac layer */ void oce_m_ioctl(void *arg, queue_t *wq, mblk_t *mp) { struct oce_dev *dev = arg; struct iocblk *iocp; int cmd; uint32_t payload_length; int ret; iocp = (struct iocblk *)voidptr(mp->b_rptr); iocp->ioc_error = 0; cmd = iocp->ioc_cmd; DEV_LOCK(dev); if (dev->suspended) { miocnak(wq, mp, 0, EINVAL); DEV_UNLOCK(dev); return; } DEV_UNLOCK(dev); switch (cmd) { case OCE_ISSUE_MBOX: { ret = oce_issue_mbox(dev, wq, mp, &payload_length); miocack(wq, mp, payload_length, ret); break; } case OCE_QUERY_DRIVER_DATA: { struct oce_driver_query *drv_query = (struct oce_driver_query *)(void *)mp->b_cont->b_rptr; /* if the driver version does not match bail */ if (drv_query->version != OCN_VERSION_SUPPORTED) { oce_log(dev, CE_NOTE, MOD_CONFIG, "%s", "One Connect version mismatch"); miocnak(wq, mp, 0, ENOTSUP); break; } /* fill the return values */ bcopy(OCE_MOD_NAME, drv_query->driver_name, (sizeof (OCE_MOD_NAME) > 32) ? 31 : sizeof (OCE_MOD_NAME)); drv_query->driver_name[31] = '\0'; bcopy(OCE_VERSION, drv_query->driver_version, (sizeof (OCE_VERSION) > 32) ? 31 : sizeof (OCE_VERSION)); drv_query->driver_version[31] = '\0'; if (dev->num_smac == 0) { drv_query->num_smac = 1; bcopy(dev->mac_addr, drv_query->smac_addr[0], ETHERADDRL); } else { drv_query->num_smac = dev->num_smac; bcopy(dev->unicast_addr, drv_query->smac_addr[0], ETHERADDRL); } bcopy(dev->mac_addr, drv_query->pmac_addr, ETHERADDRL); payload_length = sizeof (struct oce_driver_query); miocack(wq, mp, payload_length, 0); break; } default: miocnak(wq, mp, 0, ENOTSUP); break; } } /* oce_m_ioctl */