Lines Matching defs:ire

75 #define	IS_DEFAULT_ROUTE(ire)	\
76 (((ire)->ire_type & IRE_DEFAULT) || \
77 (((ire)->ire_type & IRE_INTERFACE) && ((ire)->ire_addr == 0)))
99 ire_t *ire;
148 ire = margs.ift_best_ire;
153 ASSERT(ire != NULL);
155 DTRACE_PROBE2(ire__found, ire_ftable_args_t *, &margs, ire_t *, ire);
164 if (ire->ire_bucket->irb_ire_cnt > 1 && !(flags & MATCH_IRE_GW)) {
167 IS_DEFAULT_ROUTE(ire))) {
171 next_ire = ire_round_robin(ire->ire_bucket, &margs,
172 xmit_hint, ire, ipst);
174 /* keep ire if next_ire is null */
177 ire_refrele(ire);
178 ire = next_ire;
185 *generationp = ire->ire_generation;
200 if ((ire->ire_type & IRE_LOCAL) && zoneid != ALL_ZONES &&
201 ire->ire_zoneid != zoneid && ire->ire_zoneid != ALL_ZONES &&
203 ire = ire_alt_local(ire, zoneid, tsl, ill, generationp);
204 ASSERT(ire != NULL);
206 return (ire);
225 ire_t *ire;
250 ire = irb->irb_ire;
251 if (ire == NULL) {
255 while (IRE_IS_CONDEMNED(ire)) {
256 ire = ire->ire_next;
257 if (ire == NULL) {
263 /* we have a ire that matches */
264 ire_refhold(ire);
278 if (ire->ire_bucket->irb_ire_cnt > 1) {
281 IS_DEFAULT_ROUTE(ire))) {
289 next_ire = ire_round_robin(ire->ire_bucket, &margs,
290 xmit_hint, ire, ipst);
292 /* keep ire if next_ire is null */
294 *generationp = ire->ire_generation;
296 return (ire);
298 ire_refrele(ire);
299 ire = next_ire;
304 *generationp = ire->ire_generation;
312 return (ire);
344 ire_t *ire;
347 ire = ire_route_recursive_v4(group, 0, NULL, zoneid, NULL,
349 ASSERT(ire != NULL);
350 if (ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE)) {
351 ire_refrele(ire);
356 *multirtp = (ire->ire_flags & RTF_MULTIRT) != 0;
358 ill = ire_nexthop_ill(ire);
359 ire_refrele(ire);
364 * Delete the passed in ire if the gateway addr matches
367 ire_del_host_redir(ire_t *ire, char *gateway)
369 if ((ire->ire_flags & RTF_DYNAMIC) &&
370 (ire->ire_gateway_addr == *(ipaddr_t *)gateway))
371 ire_delete(ire);
402 * returns with a ref'ed irb_t. The ire itself is added in ire_add_v4()
406 ire_get_bucket(ire_t *ire)
412 ip_stack_t *ipst = ire->ire_ipst;
420 rdst.rt_sin_addr.s_addr = ire->ire_addr;
425 rmask.rt_sin_addr.s_addr = ire->ire_mask;
480 ire_t *ire;
501 if ((ire = route_to_dst(ipaddr, zoneid, ipst)) != NULL) {
502 ill = ire_nexthop_ill(ire);
507 ire_refrele(ire);
520 ire_t *ire = NULL;
528 ire = ire_route_recursive_v4(
533 ire = ire_route_recursive_v6(
538 ASSERT(ire != NULL);
539 if (ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE)) {
540 ire_refrele(ire);
543 return (ire);
664 ire_t *ire;
676 for (ire = irb_ptr->irb_ire; ire != NULL; ire = ire->ire_next) {
677 if (IRE_IS_CONDEMNED(ire))
683 match_mask = ire->ire_mask;
685 if (ire_match_args(ire, margs->ift_addr, match_mask,
689 ire_refhold(ire);
691 margs->ift_best_ire = ire;
705 * - no other threads holding references to ire's in the bucket,
707 * - no active ire's in the bucket, i.e., irb_ire_cnt == 0
809 ire_t *ire, *maybe_ire = NULL;
832 * If we find an ire which has a non-zero ire_badcnt then we remember
838 ire = irb_ptr->irb_ire;
840 if (IRE_IS_CONDEMNED(ire))
850 if (ire->ire_type != orig_ire->ire_type ||
851 ((ire->ire_flags ^ orig_ire->ire_flags) & RTF_MULTIRT) != 0)
861 if (ire->ire_ipversion == IPV6_VERSION) {
863 &ire->ire_addr_v6))
871 if (ire->ire_ipversion == IPV4_VERSION ?
872 !ire_match_args(ire, margs->ift_addr,
873 ire->ire_mask, margs->ift_gateway,
876 !ire_match_args_v6(ire, &margs->ift_addr_v6,
877 &ire->ire_mask_v6, &margs->ift_gateway_v6,
883 (ire->ire_type & IRE_OFFLINK)) {
889 if (ire->ire_ipversion == IPV4_VERSION) {
891 ire->ire_gateway_addr, margs->ift_zoneid,
892 ire->ire_ill, margs->ift_tsl, ipst,
897 &ire->ire_gateway_addr_v6,
898 margs->ift_zoneid, ire->ire_ill,
903 mutex_enter(&ire->ire_lock);
905 if (ire->ire_badcnt != 0 &&
906 (TICK_TO_SEC(ddi_get_lbolt64()) - ire->ire_last_badcnt >
908 ire->ire_badcnt = 0;
909 mutex_exit(&ire->ire_lock);
911 if (ire->ire_badcnt == 0) {
913 ire_refhold(ire);
918 if (ire->ire_ipversion == IPV4_VERSION) {
928 return (ire);
936 maybe_ire = ire;
937 maybe_badcnt = ire->ire_badcnt;
938 } else if (ire->ire_badcnt < maybe_badcnt) {
939 maybe_ire = ire;
940 maybe_badcnt = ire->ire_badcnt;
946 ire = ire->ire_next;
947 if (ire == NULL)
948 ire = irb_ptr->irb_ire;
954 if (ire->ire_ipversion == IPV4_VERSION) {
1068 ire_t *ire;
1151 ire = ire_reject(ipst, isv6);
1152 return (ire);
1159 ire = ire_reject(ipst, isv6);
1160 return (ire);
1173 ire = ire_reject(ipst, isv6);
1174 return (ire);
1177 ire = ire_multicast(ill);
1180 *generationp = ire->ire_generation;
1182 (ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE))) {
1185 return (ire);
1208 ire = ire_reject(ipst, isv6);
1209 return (ire);
1233 ire = ire_reject(ipst, isv6);
1234 return (ire);
1248 ire = ire_reject(ipst, isv6);
1249 return (ire);
1279 ire = ire_route_recursive_v4(v4nexthop, ire_type, ill,
1285 ire = ire_route_recursive_v6(&v6nexthop, ire_type, ill,
1292 ip3dbg(("looking for hidden; dst %x ire %p\n",
1293 v4dst, (void *)ire));
1300 if ((ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE)) ||
1301 (ire->ire_type & IRE_MULTICAST)) {
1305 * find an ire whose ire_ill had the desired source
1309 ire_refrele(ire);
1315 return (ire);
1319 mutex_enter(&ire->ire_lock);
1320 nce = ire->ire_nce_cache;
1322 mutex_exit(&ire->ire_lock);
1323 (void) ire_revalidate_nce(ire);
1325 mutex_exit(&ire->ire_lock);
1327 return (ire);
1363 ire_t *ire;
1372 ire = ip_select_route(&v6dst, v6src, ixa, generationp, &setsrc, errorp,
1376 return (ire);
1398 ire_route_recursive_impl_v4(ire_t *ire,
1426 if (ire == NULL) {
1427 ire = ire_ftable_lookup_v4(nexthop, 0, 0, ire_type,
1432 ire_refhold(ire);
1438 if (ire == NULL) {
1440 ire = ires[0];
1441 ire_refhold(ire);
1443 ire = ire_reject(ipst, B_FALSE);
1448 /* Need to return the ire with RTF_REJECT|BLACKHOLE */
1449 if (ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE))
1452 ASSERT(!(ire->ire_type & IRE_MULTICAST)); /* Not in ftable */
1457 if ((ire->ire_type & IRE_IF_CLONE) && !ire_clone_verify(ire)) {
1458 ire_refrele(ire);
1459 ire = NULL;
1474 if ((ire->ire_type & IRE_OFFLINK) &&
1475 !(ire->ire_flags & RTF_INDIRECT)) {
1488 ires[i] = ire;
1493 if ((ire->ire_flags & RTF_SETSRC) &&
1495 ASSERT(ire->ire_setsrc_addr != INADDR_ANY);
1496 *setsrcp = ire->ire_setsrc_addr;
1500 if (ire->ire_gw_secattr != NULL &&
1502 *gwattrp = ire->ire_gw_secattr;
1511 mutex_enter(&ire->ire_lock);
1512 if (ire->ire_dep_parent != NULL &&
1513 ire->ire_dep_parent->ire_generation ==
1514 ire->ire_dep_parent_generation) {
1515 mutex_exit(&ire->ire_lock);
1516 ire = NULL;
1519 mutex_exit(&ire->ire_lock);
1526 if (ire->ire_nce_capable) {
1527 ire = NULL;
1530 ASSERT(!(ire->ire_type & IRE_IF_CLONE));
1535 if (ire->ire_type & IRE_INTERFACE) {
1539 ASSERT(ire->ire_masklen != IPV4_ABITS);
1554 ire = NULL;
1560 clone = ire_create_if_clone(ire, &v6nexthop,
1568 ire = ire_blackhole(ipst, B_FALSE);
1586 ire = NULL;
1597 * ire->ire_ill, and we want to find the IRE_INTERFACE for
1601 nexthop = ire->ire_gateway_addr;
1602 if (ill == NULL && ire->ire_ill != NULL) {
1603 ill = ire->ire_ill;
1608 ire = NULL;
1610 ASSERT(ire == NULL);
1611 ire = ire_reject(ipst, B_FALSE);
1614 ASSERT(ire != NULL);
1631 ASSERT((ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE)) ||
1639 return (ire);
1642 ASSERT(ire == NULL);
1651 ire = ire_reject(ipst, B_FALSE);
1721 ire_t *ire;
1726 ire = ire_ftable_lookup_simple_v4(nexthop, xmit_hint, ipst,
1728 ASSERT(ire != NULL);
1734 mutex_enter(&ire->ire_lock);
1735 if (ire->ire_dep_parent != NULL) {
1736 if (ire->ire_dep_parent->ire_generation ==
1737 ire->ire_dep_parent_generation) {
1738 mutex_exit(&ire->ire_lock);
1739 return (ire);
1741 mutex_exit(&ire->ire_lock);
1743 mutex_exit(&ire->ire_lock);
1749 if (ire->ire_nce_capable)
1750 return (ire);
1754 * Fallback to loop in the normal code starting with the ire
1755 * we found. Normally this would return the same ire.
1757 ire1 = ire_route_recursive_impl_v4(ire, nexthop, 0, NULL, ALL_ZONES,
1760 ire_refrele(ire);
1770 ire_clone_verify(ire_t *ire)
1772 ASSERT((ire->ire_type & IRE_IF_CLONE) != 0);
1773 mutex_enter(&ire->ire_lock);
1774 if (ire->ire_dep_parent != NULL &&
1775 ire->ire_dep_parent->ire_generation !=
1776 ire->ire_dep_parent_generation) {
1777 mutex_exit(&ire->ire_lock);
1778 ire_delete(ire);
1781 mutex_exit(&ire->ire_lock);