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