Print this page
Overlay fabric router

*** 1070,1114 **** mutex_exit(&odd->odd_lock); bzero(&hdr, sizeof (struct msghdr)); bzero(&einfo, sizeof (ovep_encap_info_t)); ! einfo.ovdi_id = odd->odd_vid; mp = mp_chain; while (mp != NULL) { socklen_t slen; struct sockaddr_storage storage; mp_chain = mp->b_next; mp->b_next = NULL; ep = NULL; - /* - * TODO: we probably need to change 'storage' to a - * refheld overlay_target_entry_t and also maybe set - * local vlan from packet header for check below - */ ret = overlay_target_lookup(odd, mp, ! (struct sockaddr *)&storage, &slen); if (ret != OVERLAY_TARGET_OK) { if (ret == OVERLAY_TARGET_DROP) freemsg(mp); mp = mp_chain; continue; } - /* - * TODO: - * set hdr.msg_name from target_entry - * - * if !local: - * check fabric attachment - * modify vlan tag, VL2 mac addresses - * - * set einfo.ovdi_id to vnet id (move into loop since - * things cannot assume to all have same vnet id anymore) - */ hdr.msg_name = &storage; hdr.msg_namelen = slen; ret = odd->odd_plugin->ovp_ops->ovpo_encap(odd->odd_mh, mp, &einfo, &ep); --- 1070,1098 ---- mutex_exit(&odd->odd_lock); bzero(&hdr, sizeof (struct msghdr)); bzero(&einfo, sizeof (ovep_encap_info_t)); ! mp = mp_chain; while (mp != NULL) { socklen_t slen; struct sockaddr_storage storage; mp_chain = mp->b_next; mp->b_next = NULL; ep = NULL; ret = overlay_target_lookup(odd, mp, ! (struct sockaddr *)&storage, &slen, &einfo.ovdi_id); if (ret != OVERLAY_TARGET_OK) { if (ret == OVERLAY_TARGET_DROP) freemsg(mp); mp = mp_chain; continue; } hdr.msg_name = &storage; hdr.msg_namelen = slen; ret = odd->odd_plugin->ovp_ops->ovpo_encap(odd->odd_mh, mp, &einfo, &ep);
*** 2167,2185 **** ddi_fm_fini(dip); overlay_dip = NULL; return (DDI_SUCCESS); } static struct cb_ops overlay_cbops = { overlay_target_open, /* cb_open */ overlay_target_close, /* cb_close */ nodev, /* cb_strategy */ nodev, /* cb_print */ nodev, /* cb_dump */ nodev, /* cb_read */ nodev, /* cb_write */ ! overlay_target_ioctl, /* cb_ioctl */ nodev, /* cb_devmap */ nodev, /* cb_mmap */ nodev, /* cb_segmap */ nochpoll, /* cb_chpoll */ ddi_prop_op, /* cb_prop_op */ --- 2151,2187 ---- ddi_fm_fini(dip); overlay_dip = NULL; return (DDI_SUCCESS); } + #define OVERLAY_IOCTL_MASK 0xffffff00 + /* ARGSUSED */ + static int + overlay_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, + int *rvalp) + { + switch (cmd & OVERLAY_IOCTL_MASK) { + case OVERLAY_TARG_IOCTL: + return (overlay_target_ioctl(dev, cmd, arg, mode, credp, + rvalp)); + case OVERLAY_ROUTER_IOCTL: + return (overlay_router_ioctl(dev, cmd, arg, mode, credp, + rvalp)); + default: + return (ENOTTY); + } + } + static struct cb_ops overlay_cbops = { overlay_target_open, /* cb_open */ overlay_target_close, /* cb_close */ nodev, /* cb_strategy */ nodev, /* cb_print */ nodev, /* cb_dump */ nodev, /* cb_read */ nodev, /* cb_write */ ! overlay_ioctl, /* cb_ioctl */ nodev, /* cb_devmap */ nodev, /* cb_mmap */ nodev, /* cb_segmap */ nochpoll, /* cb_chpoll */ ddi_prop_op, /* cb_prop_op */