Lines Matching refs:c
377 const struct mfc_cache *c = ptr; in ipmr_hash_cmp() local
379 return cmparg->mfc_mcastgrp != c->mfc_mcastgrp || in ipmr_hash_cmp()
380 cmparg->mfc_origin != c->mfc_origin; in ipmr_hash_cmp()
724 struct mr_mfc *c = container_of(head, struct mr_mfc, rcu); in ipmr_cache_free_rcu() local
726 kmem_cache_free(mrt_cachep, (struct mfc_cache *)c); in ipmr_cache_free_rcu()
729 static void ipmr_cache_free(struct mfc_cache *c) in ipmr_cache_free() argument
731 call_rcu(&c->_c.rcu, ipmr_cache_free_rcu); in ipmr_cache_free()
737 static void ipmr_destroy_unres(struct mr_table *mrt, struct mfc_cache *c) in ipmr_destroy_unres() argument
745 while ((skb = skb_dequeue(&c->_c.mfc_un.unres.unresolved))) { in ipmr_destroy_unres()
762 ipmr_cache_free(c); in ipmr_destroy_unres()
769 struct mr_mfc *c, *next; in ipmr_expire_process() local
784 list_for_each_entry_safe(c, next, &mrt->mfc_unres_queue, list) { in ipmr_expire_process()
785 if (time_after(c->mfc_un.unres.expires, now)) { in ipmr_expire_process()
786 unsigned long interval = c->mfc_un.unres.expires - now; in ipmr_expire_process()
792 list_del(&c->list); in ipmr_expire_process()
793 mroute_netlink_event(mrt, (struct mfc_cache *)c, RTM_DELROUTE); in ipmr_expire_process()
794 ipmr_destroy_unres(mrt, (struct mfc_cache *)c); in ipmr_expire_process()
974 struct mfc_cache *c = kmem_cache_zalloc(mrt_cachep, GFP_KERNEL); in ipmr_cache_alloc() local
976 if (c) { in ipmr_cache_alloc()
977 c->_c.mfc_un.res.last_assert = jiffies - MFC_ASSERT_THRESH - 1; in ipmr_cache_alloc()
978 c->_c.mfc_un.res.minvif = MAXVIFS; in ipmr_cache_alloc()
979 c->_c.free = ipmr_cache_free_rcu; in ipmr_cache_alloc()
980 refcount_set(&c->_c.mfc_un.res.refcount, 1); in ipmr_cache_alloc()
982 return c; in ipmr_cache_alloc()
987 struct mfc_cache *c = kmem_cache_zalloc(mrt_cachep, GFP_ATOMIC); in ipmr_cache_alloc_unres() local
989 if (c) { in ipmr_cache_alloc_unres()
990 skb_queue_head_init(&c->_c.mfc_un.unres.unresolved); in ipmr_cache_alloc_unres()
991 c->_c.mfc_un.unres.expires = jiffies + 10 * HZ; in ipmr_cache_alloc_unres()
993 return c; in ipmr_cache_alloc_unres()
998 struct mfc_cache *uc, struct mfc_cache *c) in ipmr_cache_resolve() argument
1009 if (mr_fill_mroute(mrt, skb, &c->_c, in ipmr_cache_resolve()
1025 ip_mr_forward(net, mrt, skb->dev, skb, c, 0); in ipmr_cache_resolve()
1123 struct mfc_cache *c; in ipmr_cache_unresolved() local
1128 list_for_each_entry(c, &mrt->mfc_unres_queue, _c.list) { in ipmr_cache_unresolved()
1129 if (c->mfc_mcastgrp == iph->daddr && in ipmr_cache_unresolved()
1130 c->mfc_origin == iph->saddr) { in ipmr_cache_unresolved()
1138 c = ipmr_cache_alloc_unres(); in ipmr_cache_unresolved()
1139 if (!c) { in ipmr_cache_unresolved()
1147 c->_c.mfc_parent = -1; in ipmr_cache_unresolved()
1148 c->mfc_origin = iph->saddr; in ipmr_cache_unresolved()
1149 c->mfc_mcastgrp = iph->daddr; in ipmr_cache_unresolved()
1160 ipmr_cache_free(c); in ipmr_cache_unresolved()
1166 list_add(&c->_c.list, &mrt->mfc_unres_queue); in ipmr_cache_unresolved()
1167 mroute_netlink_event(mrt, c, RTM_NEWROUTE); in ipmr_cache_unresolved()
1171 c->_c.mfc_un.unres.expires); in ipmr_cache_unresolved()
1175 if (c->_c.mfc_un.unres.unresolved.qlen > 3) { in ipmr_cache_unresolved()
1183 skb_queue_tail(&c->_c.mfc_un.unres.unresolved, skb); in ipmr_cache_unresolved()
1196 struct mfc_cache *c; in ipmr_mfc_delete() local
1200 c = ipmr_cache_find_parent(mrt, mfc->mfcc_origin.s_addr, in ipmr_mfc_delete()
1203 if (!c) in ipmr_mfc_delete()
1205 rhltable_remove(&mrt->mfc_hash, &c->_c.mnode, ipmr_rht_params); in ipmr_mfc_delete()
1206 list_del_rcu(&c->_c.list); in ipmr_mfc_delete()
1207 call_ipmr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, c, mrt->id); in ipmr_mfc_delete()
1208 mroute_netlink_event(mrt, c, RTM_DELROUTE); in ipmr_mfc_delete()
1209 mr_cache_put(&c->_c); in ipmr_mfc_delete()
1217 struct mfc_cache *uc, *c; in ipmr_mfc_add() local
1227 c = ipmr_cache_find_parent(mrt, mfc->mfcc_origin.s_addr, in ipmr_mfc_add()
1230 if (c) { in ipmr_mfc_add()
1232 c->_c.mfc_parent = mfc->mfcc_parent; in ipmr_mfc_add()
1233 ipmr_update_thresholds(mrt, &c->_c, mfc->mfcc_ttls); in ipmr_mfc_add()
1235 c->_c.mfc_flags |= MFC_STATIC; in ipmr_mfc_add()
1237 call_ipmr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_REPLACE, c, in ipmr_mfc_add()
1239 mroute_netlink_event(mrt, c, RTM_NEWROUTE); in ipmr_mfc_add()
1247 c = ipmr_cache_alloc(); in ipmr_mfc_add()
1248 if (!c) in ipmr_mfc_add()
1251 c->mfc_origin = mfc->mfcc_origin.s_addr; in ipmr_mfc_add()
1252 c->mfc_mcastgrp = mfc->mfcc_mcastgrp.s_addr; in ipmr_mfc_add()
1253 c->_c.mfc_parent = mfc->mfcc_parent; in ipmr_mfc_add()
1254 ipmr_update_thresholds(mrt, &c->_c, mfc->mfcc_ttls); in ipmr_mfc_add()
1256 c->_c.mfc_flags |= MFC_STATIC; in ipmr_mfc_add()
1258 ret = rhltable_insert_key(&mrt->mfc_hash, &c->cmparg, &c->_c.mnode, in ipmr_mfc_add()
1262 ipmr_cache_free(c); in ipmr_mfc_add()
1265 list_add_tail_rcu(&c->_c.list, &mrt->mfc_cache_list); in ipmr_mfc_add()
1273 if (uc->mfc_origin == c->mfc_origin && in ipmr_mfc_add()
1274 uc->mfc_mcastgrp == c->mfc_mcastgrp) { in ipmr_mfc_add()
1286 ipmr_cache_resolve(net, mrt, uc, c); in ipmr_mfc_add()
1289 call_ipmr_mfc_entry_notifiers(net, FIB_EVENT_ENTRY_ADD, c, mrt->id); in ipmr_mfc_add()
1290 mroute_netlink_event(mrt, c, RTM_NEWROUTE); in ipmr_mfc_add()
1298 struct mr_mfc *c, *tmp; in mroute_clean_tables() local
1317 list_for_each_entry_safe(c, tmp, &mrt->mfc_cache_list, list) { in mroute_clean_tables()
1318 if (((c->mfc_flags & MFC_STATIC) && !(flags & MRT_FLUSH_MFC_STATIC)) || in mroute_clean_tables()
1319 (!(c->mfc_flags & MFC_STATIC) && !(flags & MRT_FLUSH_MFC))) in mroute_clean_tables()
1321 rhltable_remove(&mrt->mfc_hash, &c->mnode, ipmr_rht_params); in mroute_clean_tables()
1322 list_del_rcu(&c->list); in mroute_clean_tables()
1323 cache = (struct mfc_cache *)c; in mroute_clean_tables()
1327 mr_cache_put(c); in mroute_clean_tables()
1334 list_for_each_entry_safe(c, tmp, &mrt->mfc_unres_queue, list) { in mroute_clean_tables()
1335 list_del(&c->list); in mroute_clean_tables()
1336 cache = (struct mfc_cache *)c; in mroute_clean_tables()
1639 struct mfc_cache *c; in ipmr_ioctl() local
1672 c = ipmr_cache_find(mrt, sr->src.s_addr, sr->grp.s_addr); in ipmr_ioctl()
1673 if (c) { in ipmr_ioctl()
1674 sr->pktcnt = atomic_long_read(&c->_c.mfc_un.res.pkt); in ipmr_ioctl()
1675 sr->bytecnt = atomic_long_read(&c->_c.mfc_un.res.bytes); in ipmr_ioctl()
1676 sr->wrong_if = atomic_long_read(&c->_c.mfc_un.res.wrong_if); in ipmr_ioctl()
1709 struct mfc_cache *c; in ipmr_compat_ioctl() local
1744 c = ipmr_cache_find(mrt, sr.src.s_addr, sr.grp.s_addr); in ipmr_compat_ioctl()
1745 if (c) { in ipmr_compat_ioctl()
1746 sr.pktcnt = atomic_long_read(&c->_c.mfc_un.res.pkt); in ipmr_compat_ioctl()
1747 sr.bytecnt = atomic_long_read(&c->_c.mfc_un.res.bytes); in ipmr_compat_ioctl()
1748 sr.wrong_if = atomic_long_read(&c->_c.mfc_un.res.wrong_if); in ipmr_compat_ioctl()
1997 struct mfc_cache *c, int local) in ip_mr_forward() argument
2003 vif = c->_c.mfc_parent; in ip_mr_forward()
2004 atomic_long_inc(&c->_c.mfc_un.res.pkt); in ip_mr_forward()
2005 atomic_long_add(skb->len, &c->_c.mfc_un.res.bytes); in ip_mr_forward()
2006 WRITE_ONCE(c->_c.mfc_un.res.lastuse, jiffies); in ip_mr_forward()
2008 if (c->mfc_origin == htonl(INADDR_ANY) && true_vifi >= 0) { in ip_mr_forward()
2037 atomic_long_inc(&c->_c.mfc_un.res.wrong_if); in ip_mr_forward()
2046 c->_c.mfc_un.res.ttls[true_vifi] < 255) && in ip_mr_forward()
2048 c->_c.mfc_un.res.last_assert + in ip_mr_forward()
2050 c->_c.mfc_un.res.last_assert = jiffies; in ip_mr_forward()
2066 if (c->mfc_origin == htonl(INADDR_ANY) && in ip_mr_forward()
2067 c->mfc_mcastgrp == htonl(INADDR_ANY)) { in ip_mr_forward()
2069 true_vifi != c->_c.mfc_parent && in ip_mr_forward()
2071 c->_c.mfc_un.res.ttls[c->_c.mfc_parent]) { in ip_mr_forward()
2076 psend = c->_c.mfc_parent; in ip_mr_forward()
2081 for (ct = c->_c.mfc_un.res.maxvif - 1; in ip_mr_forward()
2082 ct >= c->_c.mfc_un.res.minvif; ct--) { in ip_mr_forward()
2084 if ((c->mfc_origin != htonl(INADDR_ANY) || in ip_mr_forward()
2086 ip_hdr(skb)->ttl > c->_c.mfc_un.res.ttls[ct]) { in ip_mr_forward()
2242 struct mfc_cache *c) in ip_mr_output_finish() argument
2247 atomic_long_inc(&c->_c.mfc_un.res.pkt); in ip_mr_output_finish()
2248 atomic_long_add(skb->len, &c->_c.mfc_un.res.bytes); in ip_mr_output_finish()
2249 WRITE_ONCE(c->_c.mfc_un.res.lastuse, jiffies); in ip_mr_output_finish()
2252 if (c->mfc_origin == htonl(INADDR_ANY) && in ip_mr_output_finish()
2253 c->mfc_mcastgrp == htonl(INADDR_ANY)) { in ip_mr_output_finish()
2255 c->_c.mfc_un.res.ttls[c->_c.mfc_parent]) { in ip_mr_output_finish()
2260 psend = c->_c.mfc_parent; in ip_mr_output_finish()
2266 for (ct = c->_c.mfc_un.res.maxvif - 1; in ip_mr_output_finish()
2267 ct >= c->_c.mfc_un.res.minvif; ct--) { in ip_mr_output_finish()
2268 if (ip_hdr(skb)->ttl > c->_c.mfc_un.res.ttls[ct]) { in ip_mr_output_finish()
2461 u32 portid, u32 seq, struct mfc_cache *c, int cmd, in ipmr_fill_mroute() argument
2482 if (c->_c.mfc_flags & MFC_STATIC) in ipmr_fill_mroute()
2488 if (nla_put_in_addr(skb, RTA_SRC, c->mfc_origin) || in ipmr_fill_mroute()
2489 nla_put_in_addr(skb, RTA_DST, c->mfc_mcastgrp)) in ipmr_fill_mroute()
2491 err = mr_fill_mroute(mrt, skb, &c->_c, rtm); in ipmr_fill_mroute()
2505 u32 portid, u32 seq, struct mr_mfc *c, int cmd, in _ipmr_fill_mroute() argument
2508 return ipmr_fill_mroute(mrt, skb, portid, seq, (struct mfc_cache *)c, in _ipmr_fill_mroute()