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 */