Lines Matching refs:ixa
101 #define IXA_REFRELE(ixa) \
103 if (atomic_dec_32_nv(&(ixa)->ixa_refcnt) == 0) \
104 ixa_inactive(ixa); \
107 #define IXA_REFHOLD(ixa) \
109 ASSERT((ixa)->ixa_refcnt != 0); \
110 atomic_inc_32(&(ixa)->ixa_refcnt); \
227 ip_xmit_attr_to_mblk(ip_xmit_attr_t *ixa)
231 nce_t *nce = ixa->ixa_nce;
244 ixm->ixm_flags = ixa->ixa_flags;
245 ixm->ixm_stackid = ixa->ixa_ipst->ips_netstack->netstack_stackid;
248 ixm->ixm_fragsize = ixa->ixa_fragsize;
249 ixm->ixm_pktlen = ixa->ixa_pktlen;
250 ixm->ixm_ip_hdr_length = ixa->ixa_ip_hdr_length;
251 ixm->ixm_protocol = ixa->ixa_protocol;
252 ixm->ixm_postfragfn = ixa->ixa_postfragfn;
253 ixm->ixm_zoneid = ixa->ixa_zoneid;
254 ixm->ixm_no_loop_zoneid = ixa->ixa_no_loop_zoneid;
255 ixm->ixm_scopeid = ixa->ixa_scopeid;
256 ixm->ixm_ident = ixa->ixa_ident;
257 ixm->ixm_xmit_hint = ixa->ixa_xmit_hint;
259 if (ixa->ixa_tsl != NULL) {
260 ixm->ixm_tsl = ixa->ixa_tsl;
263 if (ixa->ixa_cred != NULL) {
264 ixm->ixm_cred = ixa->ixa_cred;
265 crhold(ixa->ixa_cred);
267 ixm->ixm_cpid = ixa->ixa_cpid;
268 ixm->ixm_conn_id = ixa->ixa_conn_id;
270 if (ixa->ixa_flags & IXAF_IPSEC_SECURE) {
271 if (ixa->ixa_ipsec_ah_sa != NULL) {
272 ixm->ixm_ipsec_ah_sa = ixa->ixa_ipsec_ah_sa;
273 IPSA_REFHOLD(ixa->ixa_ipsec_ah_sa);
275 if (ixa->ixa_ipsec_esp_sa != NULL) {
276 ixm->ixm_ipsec_esp_sa = ixa->ixa_ipsec_esp_sa;
277 IPSA_REFHOLD(ixa->ixa_ipsec_esp_sa);
279 if (ixa->ixa_ipsec_policy != NULL) {
280 ixm->ixm_ipsec_policy = ixa->ixa_ipsec_policy;
281 IPPOL_REFHOLD(ixa->ixa_ipsec_policy);
283 if (ixa->ixa_ipsec_action != NULL) {
284 ixm->ixm_ipsec_action = ixa->ixa_ipsec_action;
285 IPACT_REFHOLD(ixa->ixa_ipsec_action);
287 if (ixa->ixa_ipsec_latch != NULL) {
288 ixm->ixm_ipsec_latch = ixa->ixa_ipsec_latch;
289 IPLATCH_REFHOLD(ixa->ixa_ipsec_latch);
291 ixm->ixm_ipsec_ref[0] = ixa->ixa_ipsec_ref[0];
292 ixm->ixm_ipsec_ref[1] = ixa->ixa_ipsec_ref[1];
293 ixm->ixm_ipsec_src_port = ixa->ixa_ipsec_src_port;
294 ixm->ixm_ipsec_dst_port = ixa->ixa_ipsec_dst_port;
295 ixm->ixm_ipsec_icmp_type = ixa->ixa_ipsec_icmp_type;
296 ixm->ixm_ipsec_icmp_code = ixa->ixa_ipsec_icmp_code;
297 ixm->ixm_ipsec_inaf = ixa->ixa_ipsec_inaf;
298 ixm->ixm_ipsec_insrc[0] = ixa->ixa_ipsec_insrc[0];
299 ixm->ixm_ipsec_insrc[1] = ixa->ixa_ipsec_insrc[1];
300 ixm->ixm_ipsec_insrc[2] = ixa->ixa_ipsec_insrc[2];
301 ixm->ixm_ipsec_insrc[3] = ixa->ixa_ipsec_insrc[3];
302 ixm->ixm_ipsec_indst[0] = ixa->ixa_ipsec_indst[0];
303 ixm->ixm_ipsec_indst[1] = ixa->ixa_ipsec_indst[1];
304 ixm->ixm_ipsec_indst[2] = ixa->ixa_ipsec_indst[2];
305 ixm->ixm_ipsec_indst[3] = ixa->ixa_ipsec_indst[3];
306 ixm->ixm_ipsec_insrcpfx = ixa->ixa_ipsec_insrcpfx;
307 ixm->ixm_ipsec_indstpfx = ixa->ixa_ipsec_indstpfx;
308 ixm->ixm_ipsec_proto = ixa->ixa_ipsec_proto;
318 * Otherwise ixa is updated.
319 * Caller needs to release references on the ixa by calling ixa_refrele()
323 ip_xmit_attr_from_mblk(mblk_t *ixamp, ip_xmit_attr_t *ixa)
331 /* We assume the caller hasn't initialized ixa */
332 bzero(ixa, sizeof (*ixa));
382 ixa->ixa_flags = ixm->ixm_flags;
383 ixa->ixa_refcnt = 1;
384 ixa->ixa_ipst = ipst;
385 ixa->ixa_fragsize = ixm->ixm_fragsize;
386 ixa->ixa_pktlen = ixm->ixm_pktlen;
387 ixa->ixa_ip_hdr_length = ixm->ixm_ip_hdr_length;
388 ixa->ixa_protocol = ixm->ixm_protocol;
389 ixa->ixa_nce = nce;
390 ixa->ixa_postfragfn = ixm->ixm_postfragfn;
391 ixa->ixa_zoneid = ixm->ixm_zoneid;
392 ixa->ixa_no_loop_zoneid = ixm->ixm_no_loop_zoneid;
393 ixa->ixa_scopeid = ixm->ixm_scopeid;
394 ixa->ixa_ident = ixm->ixm_ident;
395 ixa->ixa_xmit_hint = ixm->ixm_xmit_hint;
398 ixa->ixa_tsl = ixm->ixm_tsl;
399 ixa->ixa_free_flags |= IXA_FREE_TSL;
403 ixa->ixa_cred = ixm->ixm_cred;
404 ixa->ixa_free_flags |= IXA_FREE_CRED;
407 ixa->ixa_cpid = ixm->ixm_cpid;
408 ixa->ixa_conn_id = ixm->ixm_conn_id;
410 ixa->ixa_ipsec_ah_sa = ixm->ixm_ipsec_ah_sa;
411 ixa->ixa_ipsec_esp_sa = ixm->ixm_ipsec_esp_sa;
412 ixa->ixa_ipsec_policy = ixm->ixm_ipsec_policy;
413 ixa->ixa_ipsec_action = ixm->ixm_ipsec_action;
414 ixa->ixa_ipsec_latch = ixm->ixm_ipsec_latch;
416 ixa->ixa_ipsec_ref[0] = ixm->ixm_ipsec_ref[0];
417 ixa->ixa_ipsec_ref[1] = ixm->ixm_ipsec_ref[1];
418 ixa->ixa_ipsec_src_port = ixm->ixm_ipsec_src_port;
419 ixa->ixa_ipsec_dst_port = ixm->ixm_ipsec_dst_port;
420 ixa->ixa_ipsec_icmp_type = ixm->ixm_ipsec_icmp_type;
421 ixa->ixa_ipsec_icmp_code = ixm->ixm_ipsec_icmp_code;
422 ixa->ixa_ipsec_inaf = ixm->ixm_ipsec_inaf;
423 ixa->ixa_ipsec_insrc[0] = ixm->ixm_ipsec_insrc[0];
424 ixa->ixa_ipsec_insrc[1] = ixm->ixm_ipsec_insrc[1];
425 ixa->ixa_ipsec_insrc[2] = ixm->ixm_ipsec_insrc[2];
426 ixa->ixa_ipsec_insrc[3] = ixm->ixm_ipsec_insrc[3];
427 ixa->ixa_ipsec_indst[0] = ixm->ixm_ipsec_indst[0];
428 ixa->ixa_ipsec_indst[1] = ixm->ixm_ipsec_indst[1];
429 ixa->ixa_ipsec_indst[2] = ixm->ixm_ipsec_indst[2];
430 ixa->ixa_ipsec_indst[3] = ixm->ixm_ipsec_indst[3];
431 ixa->ixa_ipsec_insrcpfx = ixm->ixm_ipsec_insrcpfx;
432 ixa->ixa_ipsec_indstpfx = ixm->ixm_ipsec_indstpfx;
433 ixa->ixa_ipsec_proto = ixm->ixm_ipsec_proto;
749 ip_xmit_attr_t *ixa;
753 ixa = connp->conn_ixa;
756 ASSERT(ixa->ixa_refcnt >= 1);
757 if (atomic_inc_32_nv(&ixa->ixa_refcnt) == 2) {
760 return (ixa);
762 ixa = kmem_alloc(sizeof (*ixa), kmflag);
763 if (ixa == NULL) {
768 ixa_safe_copy(connp->conn_ixa, ixa);
772 ixa->ixa_refcnt++; /* No atomic needed - not visible */
774 connp->conn_ixa = ixa;
783 return (ixa);
808 * cleaning up ixa references on ills etc.
817 * Replace conn_ixa with the ixa argument.
821 * We return the old ixa; the caller must ixa_refrele that after conn_lock
825 conn_replace_ixa(conn_t *connp, ip_xmit_attr_t *ixa)
832 IXA_REFHOLD(ixa);
833 ixa->ixa_conn_id = oldixa->ixa_conn_id;
834 connp->conn_ixa = ixa;
850 ip_xmit_attr_t *ixa;
853 ixa = connp->conn_ixa;
856 ASSERT(ixa->ixa_refcnt >= 1);
859 atomic_inc_32(&ixa->ixa_refcnt);
861 ixa = kmem_alloc(sizeof (*ixa), KM_NOSLEEP);
862 if (ixa == NULL) {
867 ixa_safe_copy(connp->conn_ixa, ixa);
870 return (ixa);
874 ixa_safe_copy(ip_xmit_attr_t *src, ip_xmit_attr_t *ixa)
876 bcopy(src, ixa, sizeof (*ixa));
877 ixa->ixa_refcnt = 1;
882 ixa->ixa_ire = NULL;
883 ixa->ixa_nce = NULL;
884 ixa->ixa_dce = NULL;
885 ixa->ixa_ire_generation = IRE_GENERATION_VERIFY;
886 ixa->ixa_dce_generation = DCE_GENERATION_VERIFY;
888 ixa->ixa_curthread = NULL;
891 ixa->ixa_flags &= ~IXAF_IPSEC_SECURE;
893 ixa->ixa_ipsec_latch = NULL;
894 ixa->ixa_ipsec_ah_sa = NULL;
895 ixa->ixa_ipsec_esp_sa = NULL;
896 ixa->ixa_ipsec_policy = NULL;
897 ixa->ixa_ipsec_action = NULL;
903 if (ixa->ixa_free_flags & IXA_FREE_TSL)
904 label_hold(ixa->ixa_tsl);
910 if (ixa->ixa_free_flags & IXA_FREE_CRED)
911 crhold(ixa->ixa_cred);
916 * Assumes that the caller controls the ixa, hence we do not need to use
922 ip_xmit_attr_t *ixa;
924 ixa = kmem_alloc(sizeof (*ixa), KM_NOSLEEP);
925 if (ixa == NULL)
927 bcopy(src_ixa, ixa, sizeof (*ixa));
928 ixa->ixa_refcnt = 1;
930 if (ixa->ixa_ire != NULL)
931 ire_refhold_notr(ixa->ixa_ire);
932 if (ixa->ixa_nce != NULL)
933 nce_refhold(ixa->ixa_nce);
934 if (ixa->ixa_dce != NULL)
935 dce_refhold_notr(ixa->ixa_dce);
938 ixa->ixa_curthread = NULL;
941 if (ixa->ixa_ipsec_latch != NULL)
942 IPLATCH_REFHOLD(ixa->ixa_ipsec_latch);
943 if (ixa->ixa_ipsec_ah_sa != NULL)
944 IPSA_REFHOLD(ixa->ixa_ipsec_ah_sa);
945 if (ixa->ixa_ipsec_esp_sa != NULL)
946 IPSA_REFHOLD(ixa->ixa_ipsec_esp_sa);
947 if (ixa->ixa_ipsec_policy != NULL)
948 IPPOL_REFHOLD(ixa->ixa_ipsec_policy);
949 if (ixa->ixa_ipsec_action != NULL)
950 IPACT_REFHOLD(ixa->ixa_ipsec_action);
952 if (ixa->ixa_tsl != NULL) {
953 label_hold(ixa->ixa_tsl);
954 ixa->ixa_free_flags |= IXA_FREE_TSL;
956 if (ixa->ixa_cred != NULL) {
957 crhold(ixa->ixa_cred);
958 ixa->ixa_free_flags |= IXA_FREE_CRED;
960 return (ixa);
970 ip_xmit_attr_replace_tsl(ip_xmit_attr_t *ixa, ts_label_t *tsl)
974 if (ixa->ixa_free_flags & IXA_FREE_TSL) {
975 ASSERT(ixa->ixa_tsl != NULL);
976 label_rele(ixa->ixa_tsl);
978 ixa->ixa_free_flags |= IXA_FREE_TSL;
980 ixa->ixa_tsl = tsl;
1028 ip_xmit_attr_restore_tsl(ip_xmit_attr_t *ixa, cred_t *cr)
1033 if (ixa->ixa_free_flags & IXA_FREE_TSL) {
1034 ASSERT(ixa->ixa_tsl != NULL);
1035 label_rele(ixa->ixa_tsl);
1036 ixa->ixa_free_flags &= ~IXA_FREE_TSL;
1038 ixa->ixa_tsl = crgetlabel(cr);
1042 ixa_refrele(ip_xmit_attr_t *ixa)
1044 IXA_REFRELE(ixa);
1048 ixa_inactive(ip_xmit_attr_t *ixa)
1050 ASSERT(ixa->ixa_refcnt == 0);
1052 ixa_cleanup(ixa);
1053 kmem_free(ixa, sizeof (*ixa));
1057 * Release any references contained in the ixa.
1061 ixa_cleanup(ip_xmit_attr_t *ixa)
1063 if (ixa->ixa_ire != NULL) {
1064 ire_refrele_notr(ixa->ixa_ire);
1065 ixa->ixa_ire = NULL;
1067 if (ixa->ixa_dce != NULL) {
1068 dce_refrele_notr(ixa->ixa_dce);
1069 ixa->ixa_dce = NULL;
1071 if (ixa->ixa_nce != NULL) {
1072 nce_refrele(ixa->ixa_nce);
1073 ixa->ixa_nce = NULL;
1075 ixa->ixa_ire_generation = IRE_GENERATION_VERIFY;
1076 ixa->ixa_dce_generation = DCE_GENERATION_VERIFY;
1077 if (ixa->ixa_flags & IXAF_IPSEC_SECURE) {
1078 ipsec_out_release_refs(ixa);
1080 if (ixa->ixa_free_flags & IXA_FREE_TSL) {
1081 ASSERT(ixa->ixa_tsl != NULL);
1082 label_rele(ixa->ixa_tsl);
1083 ixa->ixa_free_flags &= ~IXA_FREE_TSL;
1085 ixa->ixa_tsl = NULL;
1086 if (ixa->ixa_free_flags & IXA_FREE_CRED) {
1087 ASSERT(ixa->ixa_cred != NULL);
1088 crfree(ixa->ixa_cred);
1089 ixa->ixa_free_flags &= ~IXA_FREE_CRED;
1091 ixa->ixa_cred = NULL;
1092 ixa->ixa_src_preferences = 0;
1093 ixa->ixa_ifindex = 0;
1094 ixa->ixa_multicast_ifindex = 0;
1095 ixa->ixa_multicast_ifaddr = INADDR_ANY;
1138 ixa_cleanup_stale(ip_xmit_attr_t *ixa)
1144 ire = ixa->ixa_ire;
1145 nce = ixa->ixa_nce;
1146 dce = ixa->ixa_dce;
1150 ire = ire_blackhole(ixa->ixa_ipst,
1151 !(ixa->ixa_flags & IXAF_IS_IPV4));
1157 ixa->ixa_ire = ire;
1158 ixa->ixa_ire_generation = IRE_GENERATION_VERIFY;
1163 ixa->ixa_nce = NULL;
1164 ixa->ixa_ire_generation = IRE_GENERATION_VERIFY;
1168 dce = dce_get_default(ixa->ixa_ipst);
1174 ixa->ixa_dce = dce;
1175 ixa->ixa_dce_generation = DCE_GENERATION_VERIFY;
1321 ip_xmit_attr_t *ixa;
1339 ixa = conn_get_ixa_tryhard(connp, B_TRUE);
1340 ASSERT(ixa != NULL);
1342 ixa = conn_get_ixa(connp, B_TRUE);
1343 if (ixa == NULL) {
1354 ixa_cleanup_stale(ixa);
1355 ixa_refrele(ixa);
1360 * ixa needs to be an exclusive copy so that no one changes the cookie
1364 ixa_check_drain_insert(conn_t *connp, ip_xmit_attr_t *ixa)
1366 uintptr_t cookie = ixa->ixa_cookie;
1369 ill_t *ill = ixa->ixa_nce->nce_ill;
1373 idl_txl = &ixa->ixa_ipst->ips_idl_tx_list[IDLHASHINDEX(cookie)];
1389 idl_txl->txl_cookie != ixa->ixa_cookie) {