Lines Matching refs:ila
55 static inline int ila_cmp_wildcards(struct ila_map *ila, in ila_cmp_wildcards() argument
58 return (ila->xp.ifindex && ila->xp.ifindex != ifindex); in ila_cmp_wildcards()
61 static inline int ila_cmp_params(struct ila_map *ila, in ila_cmp_params() argument
64 return (ila->xp.ifindex != xp->ifindex); in ila_cmp_params()
70 const struct ila_map *ila = obj; in ila_cmpfn() local
72 return (ila->xp.ip.locator_match.v64 != *(__be64 *)arg->key); in ila_cmpfn()
75 static inline int ila_order(struct ila_map *ila) in ila_order() argument
79 if (ila->xp.ifindex) in ila_order()
131 struct ila_map *ila; in ila_lookup_wildcards() local
133 ila = rhashtable_lookup_fast(&ilan->xlat.rhash_table, &iaddr->loc, in ila_lookup_wildcards()
135 while (ila) { in ila_lookup_wildcards()
136 if (!ila_cmp_wildcards(ila, iaddr, ifindex)) in ila_lookup_wildcards()
137 return ila; in ila_lookup_wildcards()
138 ila = rcu_access_pointer(ila->next); in ila_lookup_wildcards()
148 struct ila_map *ila; in ila_lookup_by_params() local
150 ila = rhashtable_lookup_fast(&ilan->xlat.rhash_table, in ila_lookup_by_params()
153 while (ila) { in ila_lookup_by_params()
154 if (!ila_cmp_params(ila, xp)) in ila_lookup_by_params()
155 return ila; in ila_lookup_by_params()
156 ila = rcu_access_pointer(ila->next); in ila_lookup_by_params()
162 static inline void ila_release(struct ila_map *ila) in ila_release() argument
164 kfree_rcu(ila, rcu); in ila_release()
167 static void ila_free_node(struct ila_map *ila) in ila_free_node() argument
172 while (ila) { in ila_free_node()
173 next = rcu_access_pointer(ila->next); in ila_free_node()
174 ila_release(ila); in ila_free_node()
175 ila = next; in ila_free_node()
207 struct ila_map *ila, *head; in ila_add_mapping() local
223 ila = kzalloc(sizeof(*ila), GFP_KERNEL); in ila_add_mapping()
224 if (!ila) in ila_add_mapping()
229 ila->xp = *xp; in ila_add_mapping()
231 order = ila_order(ila); in ila_add_mapping()
241 &ila->node, rht_params); in ila_add_mapping()
261 RCU_INIT_POINTER(ila->next, tila); in ila_add_mapping()
262 rcu_assign_pointer(prev->next, ila); in ila_add_mapping()
265 RCU_INIT_POINTER(ila->next, head); in ila_add_mapping()
268 &ila->node, rht_params); in ila_add_mapping()
278 kfree(ila); in ila_add_mapping()
286 struct ila_map *ila, *head, *prev; in ila_del_mapping() local
294 ila = head; in ila_del_mapping()
298 while (ila) { in ila_del_mapping()
299 if (ila_cmp_params(ila, xp)) { in ila_del_mapping()
300 prev = ila; in ila_del_mapping()
301 ila = rcu_dereference_protected(ila->next, in ila_del_mapping()
310 rcu_assign_pointer(prev->next, ila->next); in ila_del_mapping()
315 head = rcu_dereference_protected(ila->next, in ila_del_mapping()
322 &ilan->xlat.rhash_table, &ila->node, in ila_del_mapping()
330 &ila->node, rht_params); in ila_del_mapping()
334 ila_release(ila); in ila_del_mapping()
374 struct ila_map *ila) in lock_from_ila_map() argument
376 return ila_get_lock(ilan, ila->xp.ip.locator_match); in lock_from_ila_map()
384 struct ila_map *ila; in ila_xlat_nl_cmd_flush() local
392 ila = rhashtable_walk_next(&iter); in ila_xlat_nl_cmd_flush()
394 if (IS_ERR(ila)) { in ila_xlat_nl_cmd_flush()
395 if (PTR_ERR(ila) == -EAGAIN) in ila_xlat_nl_cmd_flush()
397 ret = PTR_ERR(ila); in ila_xlat_nl_cmd_flush()
399 } else if (!ila) { in ila_xlat_nl_cmd_flush()
403 lock = lock_from_ila_map(ilan, ila); in ila_xlat_nl_cmd_flush()
408 &ila->node, rht_params); in ila_xlat_nl_cmd_flush()
410 ila_free_node(ila); in ila_xlat_nl_cmd_flush()
424 static int ila_fill_info(struct ila_map *ila, struct sk_buff *msg) in ila_fill_info() argument
427 (__force u64)ila->xp.ip.locator.v64, in ila_fill_info()
430 (__force u64)ila->xp.ip.locator_match.v64, in ila_fill_info()
432 nla_put_s32(msg, ILA_ATTR_IFINDEX, ila->xp.ifindex) || in ila_fill_info()
433 nla_put_u8(msg, ILA_ATTR_CSUM_MODE, ila->xp.ip.csum_mode) || in ila_fill_info()
434 nla_put_u8(msg, ILA_ATTR_IDENT_TYPE, ila->xp.ip.ident_type)) in ila_fill_info()
440 static int ila_dump_info(struct ila_map *ila, in ila_dump_info() argument
450 if (ila_fill_info(ila, skb) < 0) in ila_dump_info()
467 struct ila_map *ila; in ila_xlat_nl_cmd_get_mapping() local
480 ila = ila_lookup_by_params(&xp, ilan); in ila_xlat_nl_cmd_get_mapping()
481 if (ila) { in ila_xlat_nl_cmd_get_mapping()
482 ret = ila_dump_info(ila, in ila_xlat_nl_cmd_get_mapping()
539 struct ila_map *ila; in ila_xlat_nl_dump() local
545 ila = rhashtable_walk_peek(rhiter); in ila_xlat_nl_dump()
547 if (ila && !IS_ERR(ila) && skip) { in ila_xlat_nl_dump()
550 while (ila && skip) { in ila_xlat_nl_dump()
554 ila = rcu_access_pointer(ila->next); in ila_xlat_nl_dump()
562 if (IS_ERR(ila)) { in ila_xlat_nl_dump()
563 ret = PTR_ERR(ila); in ila_xlat_nl_dump()
575 } else if (!ila) { in ila_xlat_nl_dump()
580 while (ila) { in ila_xlat_nl_dump()
581 ret = ila_dump_info(ila, NETLINK_CB(cb->skb).portid, in ila_xlat_nl_dump()
588 ila = rcu_access_pointer(ila->next); in ila_xlat_nl_dump()
592 ila = rhashtable_walk_next(rhiter); in ila_xlat_nl_dump()
633 struct ila_map *ila; in ila_xlat_addr() local
648 ila = ila_lookup_wildcards(iaddr, skb->dev->ifindex, ilan); in ila_xlat_addr()
649 if (ila) in ila_xlat_addr()
650 ila_update_ipv6_locator(skb, &ila->xp.ip, sir2ila); in ila_xlat_addr()