Lines Matching refs:ire
90 static int rts_getmetrics(ire_t *ire, ill_t *ill, rt_metrics_t *metrics);
91 static mblk_t *rts_rtmget(mblk_t *mp, ire_t *ire, ire_t *ifire,
93 static void rts_setmetrics(ire_t *ire, uint_t which, rt_metrics_t *metrics);
182 * Takes an ire and sends an ack to all the routing sockets. This
188 ip_rts_rtmsg(int type, ire_t *ire, int error, ip_stack_t *ipst)
196 if (ire == NULL)
198 ASSERT(ire->ire_ipversion == IPV4_VERSION ||
199 ire->ire_ipversion == IPV6_VERSION);
201 ASSERT(!(ire->ire_type & IRE_IF_CLONE));
203 if (ire->ire_flags & RTF_SETSRC)
206 switch (ire->ire_ipversion) {
212 rts_fill_msg(type, rtm_addrs, ire->ire_addr, ire->ire_mask,
213 ire->ire_gateway_addr, ire->ire_setsrc_addr, 0, 0, 0, NULL,
221 mutex_enter(&ire->ire_lock);
222 gw_addr_v6 = ire->ire_gateway_addr_v6;
223 mutex_exit(&ire->ire_lock);
224 rts_fill_msg_v6(type, rtm_addrs, &ire->ire_addr_v6,
225 &ire->ire_mask_v6, &gw_addr_v6,
226 &ire->ire_setsrc_addr_v6, &ipv6_all_zeros, &ipv6_all_zeros,
233 rtm->rtm_flags = ire->ire_flags;
285 ire_t *ire = NULL;
543 rtm->rtm_flags, ill, &ire, B_FALSE,
573 ill, &ire, rtsap, ipst, zoneid);
586 ill, &ire, rtsap, ipst, zoneid);
593 ASSERT(ire != NULL);
594 rts_setmetrics(ire, rtm->rtm_inits, &rtm->rtm_rmx);
699 ire = ire_ftable_lookup_v4(dst_addr, 0, gw_addr,
703 if (ire == NULL) {
704 ire = ire_lookup_v4(dst_addr, net_mask,
712 ire = ire_ftable_lookup_v6(&dst_addr_v6, NULL,
717 if (ire == NULL) {
718 ire = ire_lookup_v6(&dst_addr_v6,
728 if (ire == NULL) {
736 if (ire->ire_type & IRE_NOROUTE) {
737 ire_refrele(ire);
738 ire = NULL;
746 mp1 = rts_rtmget(mp, ire, ifire, &v6setsrc, gwattr, af);
762 if ((ire->ire_flags & RTF_MULTIRT) !=
777 (ire->ire_gateway_addr != gw_addr)) {
778 ire->ire_gateway_addr = gw_addr;
784 ire->ire_gateway_addr, &ga.ga_addr);
795 (ire->ire_setsrc_addr != src_addr)) {
824 ire->ire_flags |= RTF_SETSRC;
825 ire->ire_setsrc_addr =
828 ire->ire_flags &= ~RTF_SETSRC;
829 ire->ire_setsrc_addr =
838 ire_flush_cache_v4(ire, IRE_FLUSH_GWCHANGE);
841 mutex_enter(&ire->ire_lock);
844 &ire->ire_gateway_addr_v6, &gw_addr_v6)) {
845 ire->ire_gateway_addr_v6 = gw_addr_v6;
847 mutex_exit(&ire->ire_lock);
851 mutex_enter(&ire->ire_lock);
852 ga.ga_addr = ire->ire_gateway_addr_v6;
853 mutex_exit(&ire->ire_lock);
865 &ire->ire_setsrc_addr_v6, &src_addr_v6)) {
895 mutex_enter(&ire->ire_lock);
896 ire->ire_flags |= RTF_SETSRC;
897 ire->ire_setsrc_addr_v6 =
899 mutex_exit(&ire->ire_lock);
901 mutex_enter(&ire->ire_lock);
902 ire->ire_flags &= ~RTF_SETSRC;
903 ire->ire_setsrc_addr_v6 =
905 mutex_exit(&ire->ire_lock);
913 ire_flush_cache_v6(ire, IRE_FLUSH_GWCHANGE);
930 (error = tsol_ire_init_gwattr(ire,
931 ire->ire_ipversion, gc)) != 0) {
941 rts_setmetrics(ire, rtm->rtm_inits, &rtm->rtm_rmx);
950 if (ire != NULL)
951 ire_refrele(ire);
986 ire_t *ire;
1003 ire = ire_ftable_lookup_v4(dst_addr, net_mask, gw_addr,
1006 if (ire == NULL ||(ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE)))
1007 return (ire);
1009 if (ire->ire_type & IRE_ONLINK)
1010 return (ire);
1012 if (ire->ire_flags & RTF_SETSRC) {
1013 ASSERT(ire->ire_setsrc_addr != INADDR_ANY);
1014 *v4setsrcp = ire->ire_setsrc_addr;
1019 if (ire->ire_gw_secattr != NULL) {
1020 *gwattrp = ire->ire_gw_secattr;
1024 /* Look for an interface ire recursively based on the gateway */
1025 dst_addr = ire->ire_gateway_addr;
1038 if ((ire->ire_type & IRE_OFFLINK) &&
1039 !(ire->ire_flags & RTF_INDIRECT)) {
1055 ire = ire_route_recursive_v4(dst_addr, ire_type, ill, zoneid,
1060 return (ire);
1070 ire_t *ire;
1089 ire = ire_ftable_lookup_v6(dst_addr_v6, net_mask_v6,
1093 if (ire == NULL ||(ire->ire_flags & (RTF_REJECT|RTF_BLACKHOLE)))
1094 return (ire);
1096 if (ire->ire_type & IRE_ONLINK)
1097 return (ire);
1099 if (ire->ire_flags & RTF_SETSRC) {
1101 &ire->ire_setsrc_addr_v6));
1102 *v6setsrcp = ire->ire_setsrc_addr_v6;
1107 if (ire->ire_gw_secattr != NULL) {
1108 *gwattrp = ire->ire_gw_secattr;
1112 mutex_enter(&ire->ire_lock);
1113 dst = ire->ire_gateway_addr_v6;
1114 mutex_exit(&ire->ire_lock);
1127 if ((ire->ire_type & IRE_OFFLINK) &&
1128 !(ire->ire_flags & RTF_INDIRECT)) {
1144 ire = ire_route_recursive_v6(dst_addr_v6, ire_type, ill, zoneid,
1149 return (ire);
1223 rts_rtmget(mblk_t *mp, ire_t *ire, ire_t *ifire, const in6_addr_t *setsrc,
1250 ill = ire_nexthop_ill(ire);
1320 rtm_flags = ire->ire_flags;
1321 rts_fill_msg(RTM_GET, rtm_addrs, ire->ire_addr,
1322 ire->ire_mask, ire->ire_gateway_addr, v4setsrc,
1329 rtm_flags = ire->ire_flags;
1330 rts_fill_msg_v6(RTM_GET, rtm_addrs, &ire->ire_addr_v6,
1331 &ire->ire_mask_v6, &ire->ire_gateway_addr_v6,
1363 new_rtm->rtm_inits = rts_getmetrics(ire, ill, &new_rtm->rtm_rmx);
1402 rts_setmetrics(ire_t *ire, uint_t which, rt_metrics_t *metrics)
1418 ire->ire_metrics.iulp_set = B_TRUE;
1433 mutex_enter(&ire->ire_lock);
1435 ire->ire_metrics.iulp_mtu = metrics->rmx_mtu;
1437 ire->ire_metrics.iulp_rtt = rtt;
1439 ire->ire_metrics.iulp_ssthresh = metrics->rmx_ssthresh;
1441 ire->ire_metrics.iulp_rtt_sd = rtt_sd;
1443 ire->ire_metrics.iulp_spipe = metrics->rmx_sendpipe;
1445 ire->ire_metrics.iulp_rpipe = metrics->rmx_recvpipe;
1446 mutex_exit(&ire->ire_lock);
1452 ill = ire->ire_ill;
1455 ASSERT((ill->ill_isv6 && ire->ire_ipversion == IPV6_VERSION) ||
1456 ((!ill->ill_isv6 && ire->ire_ipversion == IPV4_VERSION)));
1458 mutex_enter(&ire->ire_lock);
1459 gw_addr_v6 = ire->ire_gateway_addr_v6;
1460 mutex_exit(&ire->ire_lock);
1471 &ire->ire_addr_v6) ||
1475 &ire->ire_mask_v6))
1478 if (ifrt->ifrt_addr != ire->ire_addr ||
1479 ifrt->ifrt_gateway_addr != ire->ire_gateway_addr ||
1480 ifrt->ifrt_mask != ire->ire_mask)
1483 if (ifrt->ifrt_zoneid != ire->ire_zoneid ||
1484 ifrt->ifrt_type != ire->ire_type)
1511 if ((ire->ire_type & IRE_INTERFACE) && ire->ire_dep_children != 0)
1512 ire_dep_delete_if_clone(ire);
1519 rts_getmetrics(ire_t *ire, ill_t *ill, rt_metrics_t *metrics)
1530 metrics->rmx_rtt = ire->ire_metrics.iulp_rtt * 1000;
1532 if (ire->ire_metrics.iulp_mtu != 0) {
1533 metrics->rmx_mtu = ire->ire_metrics.iulp_mtu;
1539 metrics->rmx_ssthresh = ire->ire_metrics.iulp_ssthresh;
1541 metrics->rmx_rttvar = ire->ire_metrics.iulp_rtt_sd * 1000;
1543 metrics->rmx_sendpipe = ire->ire_metrics.iulp_spipe;
1545 metrics->rmx_recvpipe = ire->ire_metrics.iulp_rpipe;