Print this page
Overlay fabric router
        
@@ -1070,45 +1070,29 @@
         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);
+                    (struct sockaddr *)&storage, &slen, &einfo.ovdi_id);
                 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);
@@ -2167,19 +2151,37 @@
         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_target_ioctl,   /* cb_ioctl */
+        overlay_ioctl,          /* cb_ioctl */
         nodev,                  /* cb_devmap */
         nodev,                  /* cb_mmap */
         nodev,                  /* cb_segmap */
         nochpoll,               /* cb_chpoll */
         ddi_prop_op,            /* cb_prop_op */