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;
827 * If we find an ire which has a non-zero ire_badcnt then we remember
833 ire = irb_ptr->irb_ire;
835 if (IRE_IS_CONDEMNED(ire))
845 if (ire->ire_type != orig_ire->ire_type ||
846 ((ire->ire_flags ^ orig_ire->ire_flags) & RTF_MULTIRT) != 0)
856 if (ire->ire_ipversion == IPV6_VERSION) {
858 &ire->ire_addr_v6))
866 if (ire->ire_ipversion == IPV4_VERSION ?
867 !ire_match_args(ire, margs->ift_addr,
868 ire->ire_mask, margs->ift_gateway,
871 !ire_match_args_v6(ire, &margs->ift_addr_v6,
872 &ire->ire_mask_v6, &margs->ift_gateway_v6,
878 (ire->ire_type & IRE_OFFLINK)) {
884 if (ire->ire_ipversion == IPV4_VERSION) {
886 ire->ire_gateway_addr, margs->ift_zoneid,
887 ire->ire_ill, margs->ift_tsl, ipst,
892 &ire->ire_gateway_addr_v6,
893 margs->ift_zoneid, ire->ire_ill,
898 mutex_enter(&ire->ire_lock);
900 if (ire->ire_badcnt != 0 &&
901 (TICK_TO_SEC(ddi_get_lbolt64()) - ire->ire_last_badcnt >
903 ire->ire_badcnt = 0;
904 mutex_exit(&ire->ire_lock);
906 if (ire->ire_badcnt == 0) {
908 ire_refhold(ire);
913 if (ire->ire_ipversion == IPV4_VERSION) {
923 return (ire);
931 maybe_ire = ire;
932 maybe_badcnt = ire->ire_badcnt;
933 } else if (ire->ire_badcnt < maybe_badcnt) {
934 maybe_ire = ire;
935 maybe_badcnt = ire->ire_badcnt;
941 ire = ire->ire_next;
942 if (ire == NULL)
943 ire = irb_ptr->irb_ire;
949 if (ire->ire_ipversion == IPV4_VERSION) {
1063 ire_t *ire;
1146 ire = ire_reject(ipst, isv6);
1147 return (ire);
1154 ire = ire_reject(ipst, isv6);
1155 return (ire);
1168 ire = ire_reject(ipst, isv6);
1169 return (ire);
1172 ire = ire_multicast(ill);
1175 *generationp = ire->ire_generation;
1177 (ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE))) {
1180 return (ire);
1203 ire = ire_reject(ipst, isv6);
1204 return (ire);
1228 ire = ire_reject(ipst, isv6);
1229 return (ire);
1243 ire = ire_reject(ipst, isv6);
1244 return (ire);
1274 ire = ire_route_recursive_v4(v4nexthop, ire_type, ill,
1280 ire = ire_route_recursive_v6(&v6nexthop, ire_type, ill,
1287 ip3dbg(("looking for hidden; dst %x ire %p\n",
1288 v4dst, (void *)ire));
1295 if ((ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE)) ||
1296 (ire->ire_type & IRE_MULTICAST)) {
1300 * find an ire whose ire_ill had the desired source
1304 ire_refrele(ire);
1310 return (ire);
1314 mutex_enter(&ire->ire_lock);
1315 nce = ire->ire_nce_cache;
1317 mutex_exit(&ire->ire_lock);
1318 (void) ire_revalidate_nce(ire);
1320 mutex_exit(&ire->ire_lock);
1322 return (ire);
1358 ire_t *ire;
1367 ire = ip_select_route(&v6dst, v6src, ixa, generationp, &setsrc, errorp,
1371 return (ire);
1393 ire_route_recursive_impl_v4(ire_t *ire,
1421 if (ire == NULL) {
1422 ire = ire_ftable_lookup_v4(nexthop, 0, 0, ire_type,
1427 ire_refhold(ire);
1433 if (ire == NULL) {
1435 ire = ires[0];
1436 ire_refhold(ire);
1438 ire = ire_reject(ipst, B_FALSE);
1443 /* Need to return the ire with RTF_REJECT|BLACKHOLE */
1444 if (ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE))
1447 ASSERT(!(ire->ire_type & IRE_MULTICAST)); /* Not in ftable */
1452 if ((ire->ire_type & IRE_IF_CLONE) && !ire_clone_verify(ire)) {
1453 ire_refrele(ire);
1454 ire = NULL;
1469 if ((ire->ire_type & IRE_OFFLINK) &&
1470 !(ire->ire_flags & RTF_INDIRECT)) {
1483 ires[i] = ire;
1488 if ((ire->ire_flags & RTF_SETSRC) &&
1490 ASSERT(ire->ire_setsrc_addr != INADDR_ANY);
1491 *setsrcp = ire->ire_setsrc_addr;
1495 if (ire->ire_gw_secattr != NULL &&
1497 *gwattrp = ire->ire_gw_secattr;
1506 mutex_enter(&ire->ire_lock);
1507 if (ire->ire_dep_parent != NULL &&
1508 ire->ire_dep_parent->ire_generation ==
1509 ire->ire_dep_parent_generation) {
1510 mutex_exit(&ire->ire_lock);
1511 ire = NULL;
1514 mutex_exit(&ire->ire_lock);
1521 if (ire->ire_nce_capable) {
1522 ire = NULL;
1525 ASSERT(!(ire->ire_type & IRE_IF_CLONE));
1530 if (ire->ire_type & IRE_INTERFACE) {
1534 ASSERT(ire->ire_masklen != IPV4_ABITS);
1549 ire = NULL;
1555 clone = ire_create_if_clone(ire, &v6nexthop,
1563 ire = ire_blackhole(ipst, B_FALSE);
1581 ire = NULL;
1592 * ire->ire_ill, and we want to find the IRE_INTERFACE for
1596 nexthop = ire->ire_gateway_addr;
1597 if (ill == NULL && ire->ire_ill != NULL) {
1598 ill = ire->ire_ill;
1603 ire = NULL;
1605 ASSERT(ire == NULL);
1606 ire = ire_reject(ipst, B_FALSE);
1609 ASSERT(ire != NULL);
1626 ASSERT((ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE)) ||
1634 return (ire);
1637 ASSERT(ire == NULL);
1646 ire = ire_reject(ipst, B_FALSE);
1716 ire_t *ire;
1721 ire = ire_ftable_lookup_simple_v4(nexthop, xmit_hint, ipst,
1723 ASSERT(ire != NULL);
1729 mutex_enter(&ire->ire_lock);
1730 if (ire->ire_dep_parent != NULL) {
1731 if (ire->ire_dep_parent->ire_generation ==
1732 ire->ire_dep_parent_generation) {
1733 mutex_exit(&ire->ire_lock);
1734 return (ire);
1736 mutex_exit(&ire->ire_lock);
1738 mutex_exit(&ire->ire_lock);
1744 if (ire->ire_nce_capable)
1745 return (ire);
1749 * Fallback to loop in the normal code starting with the ire
1750 * we found. Normally this would return the same ire.
1752 ire1 = ire_route_recursive_impl_v4(ire, nexthop, 0, NULL, ALL_ZONES,
1755 ire_refrele(ire);
1765 ire_clone_verify(ire_t *ire)
1767 ASSERT((ire->ire_type & IRE_IF_CLONE) != 0);
1768 mutex_enter(&ire->ire_lock);
1769 if (ire->ire_dep_parent != NULL &&
1770 ire->ire_dep_parent->ire_generation !=
1771 ire->ire_dep_parent_generation) {
1772 mutex_exit(&ire->ire_lock);
1773 ire_delete(ire);
1776 mutex_exit(&ire->ire_lock);