Print this page
Overlay fabric router


1055 {
1056         overlay_dev_t *odd = arg;
1057         mblk_t *mp, *ep;
1058         int ret;
1059         ovep_encap_info_t einfo;
1060         struct msghdr hdr;
1061 
1062         mutex_enter(&odd->odd_lock);
1063         if ((odd->odd_flags & OVERLAY_F_MDDROP) ||
1064             !(odd->odd_flags & OVERLAY_F_IN_MUX)) {
1065                 mutex_exit(&odd->odd_lock);
1066                 freemsgchain(mp_chain);
1067                 return (NULL);
1068         }
1069         overlay_io_start(odd, OVERLAY_F_IN_TX);
1070         mutex_exit(&odd->odd_lock);
1071 
1072         bzero(&hdr, sizeof (struct msghdr));
1073 
1074         bzero(&einfo, sizeof (ovep_encap_info_t));
1075         einfo.ovdi_id = odd->odd_vid;
1076         mp = mp_chain;
1077         while (mp != NULL) {
1078                 socklen_t slen;
1079                 struct sockaddr_storage storage;
1080 
1081                 mp_chain = mp->b_next;
1082                 mp->b_next = NULL;
1083                 ep = NULL;
1084 
1085                 /*
1086                  * TODO: we probably need to change 'storage' to a
1087                  * refheld overlay_target_entry_t and also maybe set
1088                  * local vlan from packet header for check below
1089                  */
1090                 ret = overlay_target_lookup(odd, mp,
1091                     (struct sockaddr *)&storage, &slen);
1092                 if (ret != OVERLAY_TARGET_OK) {
1093                         if (ret == OVERLAY_TARGET_DROP)
1094                                 freemsg(mp);
1095                         mp = mp_chain;
1096                         continue;
1097                 }
1098 
1099                 /*
1100                  * TODO:
1101                  *      set hdr.msg_name from target_entry
1102                  *
1103                  *      if !local:
1104                  *              check fabric attachment
1105                  *              modify vlan tag, VL2 mac addresses
1106                  *
1107                  *      set einfo.ovdi_id to vnet id (move into loop since
1108                  *      things cannot assume to all have same vnet id anymore)
1109                  */
1110                 hdr.msg_name = &storage;
1111                 hdr.msg_namelen = slen;
1112 
1113                 ret = odd->odd_plugin->ovp_ops->ovpo_encap(odd->odd_mh, mp,
1114                     &einfo, &ep);
1115                 if (ret != 0 || ep == NULL) {
1116                         freemsg(mp);
1117                         goto out;
1118                 }
1119 
1120                 ep->b_cont = mp;
1121                 ret = overlay_mux_tx(odd->odd_mux, &hdr, ep);
1122                 if (ret != 0)
1123                         goto out;
1124 
1125                 mp = mp_chain;
1126         }
1127 
1128 out:
1129         mutex_enter(&odd->odd_lock);


2152 overlay_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
2153 {
2154         if (cmd != DDI_DETACH)
2155                 return (DDI_FAILURE);
2156 
2157         mutex_enter(&overlay_dev_lock);
2158         if (!list_is_empty(&overlay_dev_list) || overlay_target_busy()) {
2159                 mutex_exit(&overlay_dev_lock);
2160                 return (EBUSY);
2161         }
2162         mutex_exit(&overlay_dev_lock);
2163 
2164 
2165         dld_ioc_unregister(OVERLAY_IOC);
2166         ddi_remove_minor_node(dip, OVERLAY_CTL);
2167         ddi_fm_fini(dip);
2168         overlay_dip = NULL;
2169         return (DDI_SUCCESS);
2170 }
2171 


















2172 static struct cb_ops overlay_cbops = {
2173         overlay_target_open,    /* cb_open */
2174         overlay_target_close,   /* cb_close */
2175         nodev,                  /* cb_strategy */
2176         nodev,                  /* cb_print */
2177         nodev,                  /* cb_dump */
2178         nodev,                  /* cb_read */
2179         nodev,                  /* cb_write */
2180         overlay_target_ioctl,   /* cb_ioctl */
2181         nodev,                  /* cb_devmap */
2182         nodev,                  /* cb_mmap */
2183         nodev,                  /* cb_segmap */
2184         nochpoll,               /* cb_chpoll */
2185         ddi_prop_op,            /* cb_prop_op */
2186         NULL,                   /* cb_stream */
2187         D_MP,                   /* cb_flag */
2188         CB_REV,                 /* cb_rev */
2189         nodev,                  /* cb_aread */
2190         nodev,                  /* cb_awrite */
2191 };
2192 
2193 static struct dev_ops overlay_dev_ops = {
2194         DEVO_REV,               /* devo_rev */
2195         0,                      /* devo_refcnt */
2196         overlay_getinfo,        /* devo_getinfo */
2197         nulldev,                /* devo_identify */
2198         nulldev,                /* devo_probe */
2199         overlay_attach,         /* devo_attach */
2200         overlay_detach,         /* devo_detach */




1055 {
1056         overlay_dev_t *odd = arg;
1057         mblk_t *mp, *ep;
1058         int ret;
1059         ovep_encap_info_t einfo;
1060         struct msghdr hdr;
1061 
1062         mutex_enter(&odd->odd_lock);
1063         if ((odd->odd_flags & OVERLAY_F_MDDROP) ||
1064             !(odd->odd_flags & OVERLAY_F_IN_MUX)) {
1065                 mutex_exit(&odd->odd_lock);
1066                 freemsgchain(mp_chain);
1067                 return (NULL);
1068         }
1069         overlay_io_start(odd, OVERLAY_F_IN_TX);
1070         mutex_exit(&odd->odd_lock);
1071 
1072         bzero(&hdr, sizeof (struct msghdr));
1073 
1074         bzero(&einfo, sizeof (ovep_encap_info_t));
1075 
1076         mp = mp_chain;
1077         while (mp != NULL) {
1078                 socklen_t slen;
1079                 struct sockaddr_storage storage;
1080 
1081                 mp_chain = mp->b_next;
1082                 mp->b_next = NULL;
1083                 ep = NULL;
1084 





1085                 ret = overlay_target_lookup(odd, mp,
1086                     (struct sockaddr *)&storage, &slen, &einfo.ovdi_id);
1087                 if (ret != OVERLAY_TARGET_OK) {
1088                         if (ret == OVERLAY_TARGET_DROP)
1089                                 freemsg(mp);
1090                         mp = mp_chain;
1091                         continue;
1092                 }
1093 











1094                 hdr.msg_name = &storage;
1095                 hdr.msg_namelen = slen;
1096 
1097                 ret = odd->odd_plugin->ovp_ops->ovpo_encap(odd->odd_mh, mp,
1098                     &einfo, &ep);
1099                 if (ret != 0 || ep == NULL) {
1100                         freemsg(mp);
1101                         goto out;
1102                 }
1103 
1104                 ep->b_cont = mp;
1105                 ret = overlay_mux_tx(odd->odd_mux, &hdr, ep);
1106                 if (ret != 0)
1107                         goto out;
1108 
1109                 mp = mp_chain;
1110         }
1111 
1112 out:
1113         mutex_enter(&odd->odd_lock);


2136 overlay_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
2137 {
2138         if (cmd != DDI_DETACH)
2139                 return (DDI_FAILURE);
2140 
2141         mutex_enter(&overlay_dev_lock);
2142         if (!list_is_empty(&overlay_dev_list) || overlay_target_busy()) {
2143                 mutex_exit(&overlay_dev_lock);
2144                 return (EBUSY);
2145         }
2146         mutex_exit(&overlay_dev_lock);
2147 
2148 
2149         dld_ioc_unregister(OVERLAY_IOC);
2150         ddi_remove_minor_node(dip, OVERLAY_CTL);
2151         ddi_fm_fini(dip);
2152         overlay_dip = NULL;
2153         return (DDI_SUCCESS);
2154 }
2155 
2156 #define OVERLAY_IOCTL_MASK      0xffffff00
2157 /* ARGSUSED */
2158 static int
2159 overlay_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
2160     int *rvalp)
2161 {
2162         switch (cmd & OVERLAY_IOCTL_MASK) {
2163         case OVERLAY_TARG_IOCTL:
2164                 return (overlay_target_ioctl(dev, cmd, arg, mode, credp,
2165                     rvalp));
2166         case OVERLAY_ROUTER_IOCTL:
2167                 return (overlay_router_ioctl(dev, cmd, arg, mode, credp,
2168                     rvalp));
2169         default:
2170                 return (ENOTTY);
2171         }
2172 }
2173 
2174 static struct cb_ops overlay_cbops = {
2175         overlay_target_open,    /* cb_open */
2176         overlay_target_close,   /* cb_close */
2177         nodev,                  /* cb_strategy */
2178         nodev,                  /* cb_print */
2179         nodev,                  /* cb_dump */
2180         nodev,                  /* cb_read */
2181         nodev,                  /* cb_write */
2182         overlay_ioctl,          /* cb_ioctl */
2183         nodev,                  /* cb_devmap */
2184         nodev,                  /* cb_mmap */
2185         nodev,                  /* cb_segmap */
2186         nochpoll,               /* cb_chpoll */
2187         ddi_prop_op,            /* cb_prop_op */
2188         NULL,                   /* cb_stream */
2189         D_MP,                   /* cb_flag */
2190         CB_REV,                 /* cb_rev */
2191         nodev,                  /* cb_aread */
2192         nodev,                  /* cb_awrite */
2193 };
2194 
2195 static struct dev_ops overlay_dev_ops = {
2196         DEVO_REV,               /* devo_rev */
2197         0,                      /* devo_refcnt */
2198         overlay_getinfo,        /* devo_getinfo */
2199         nulldev,                /* devo_identify */
2200         nulldev,                /* devo_probe */
2201         overlay_attach,         /* devo_attach */
2202         overlay_detach,         /* devo_detach */