Lines Matching refs:snode
92 struct amt_source_node *snode; in __amt_source_gc_work() local
100 hlist_for_each_entry_safe(snode, t, &gc_list, node) { in __amt_source_gc_work()
101 hlist_del_rcu(&snode->node); in __amt_source_gc_work()
102 kfree_rcu(snode, rcu); in __amt_source_gc_work()
128 static bool amt_status_filter(struct amt_source_node *snode, in amt_status_filter() argument
135 if (snode->status == AMT_SOURCE_STATUS_FWD && in amt_status_filter()
136 snode->flags == AMT_SOURCE_OLD) in amt_status_filter()
140 if (snode->status == AMT_SOURCE_STATUS_D_FWD && in amt_status_filter()
141 snode->flags == AMT_SOURCE_OLD) in amt_status_filter()
145 if (snode->status == AMT_SOURCE_STATUS_FWD && in amt_status_filter()
146 snode->flags == AMT_SOURCE_NEW) in amt_status_filter()
150 if (snode->status == AMT_SOURCE_STATUS_D_FWD && in amt_status_filter()
151 snode->flags == AMT_SOURCE_NEW) in amt_status_filter()
158 if (snode->status == AMT_SOURCE_STATUS_NONE && in amt_status_filter()
159 snode->flags == AMT_SOURCE_NEW) in amt_status_filter()
163 if ((snode->status == AMT_SOURCE_STATUS_D_FWD || in amt_status_filter()
164 snode->status == AMT_SOURCE_STATUS_FWD) && in amt_status_filter()
165 snode->flags == AMT_SOURCE_OLD) in amt_status_filter()
169 if ((snode->status == AMT_SOURCE_STATUS_D_FWD || in amt_status_filter()
170 snode->status == AMT_SOURCE_STATUS_FWD) && in amt_status_filter()
171 snode->flags == AMT_SOURCE_NEW) in amt_status_filter()
188 struct amt_source_node *snode; in amt_lookup_src() local
190 hlist_for_each_entry_rcu(snode, &gnode->sources[hash], node) in amt_lookup_src()
191 if (amt_status_filter(snode, filter) && in amt_lookup_src()
192 amt_addr_equal(&snode->source_addr, src)) in amt_lookup_src()
193 return snode; in amt_lookup_src()
223 static void amt_destroy_source(struct amt_source_node *snode) in amt_destroy_source() argument
225 struct amt_group_node *gnode = snode->gnode; in amt_destroy_source()
231 netdev_dbg(snode->gnode->amt->dev, in amt_destroy_source()
233 &snode->source_addr.ip4, in amt_destroy_source()
237 netdev_dbg(snode->gnode->amt->dev, in amt_destroy_source()
239 &snode->source_addr.ip6, in amt_destroy_source()
244 cancel_delayed_work(&snode->source_timer); in amt_destroy_source()
245 hlist_del_init_rcu(&snode->node); in amt_destroy_source()
249 hlist_add_head_rcu(&snode->node, &source_gc_list); in amt_destroy_source()
255 struct amt_source_node *snode; in amt_del_group() local
273 hlist_for_each_entry_safe(snode, t, &gnode->sources[i], node) in amt_del_group()
274 amt_destroy_source(snode); in amt_del_group()
289 struct amt_source_node *snode = container_of(to_delayed_work(work), in amt_source_work() local
292 struct amt_group_node *gnode = snode->gnode; in amt_source_work()
300 amt_destroy_source(snode); in amt_source_work()
307 snode->status = AMT_SOURCE_STATUS_D_FWD; in amt_source_work()
315 struct amt_source_node *snode, in amt_act_src() argument
322 mod_delayed_work(amt_wq, &snode->source_timer, in amt_act_src()
326 cancel_delayed_work(&snode->source_timer); in amt_act_src()
329 mod_delayed_work(amt_wq, &snode->source_timer, in amt_act_src()
333 snode->status = AMT_SOURCE_STATUS_FWD; in amt_act_src()
334 snode->flags = AMT_SOURCE_NEW; in amt_act_src()
337 snode->status = AMT_SOURCE_STATUS_D_FWD; in amt_act_src()
338 snode->flags = AMT_SOURCE_NEW; in amt_act_src()
341 cancel_delayed_work(&snode->source_timer); in amt_act_src()
342 snode->status = AMT_SOURCE_STATUS_NONE; in amt_act_src()
343 snode->flags = AMT_SOURCE_NEW; in amt_act_src()
352 &snode->source_addr.ip4, in amt_act_src()
358 &snode->source_addr.ip6, in amt_act_src()
367 struct amt_source_node *snode; in amt_alloc_snode() local
369 snode = kzalloc(sizeof(*snode), GFP_ATOMIC); in amt_alloc_snode()
370 if (!snode) in amt_alloc_snode()
373 memcpy(&snode->source_addr, src, sizeof(union amt_addr)); in amt_alloc_snode()
374 snode->gnode = gnode; in amt_alloc_snode()
375 snode->status = AMT_SOURCE_STATUS_NONE; in amt_alloc_snode()
376 snode->flags = AMT_SOURCE_NEW; in amt_alloc_snode()
377 INIT_HLIST_NODE(&snode->node); in amt_alloc_snode()
378 INIT_DELAYED_WORK(&snode->source_timer, amt_source_work); in amt_alloc_snode()
380 return snode; in amt_alloc_snode()
415 struct amt_source_node *snode; in amt_group_work() local
431 hlist_for_each_entry_safe(snode, t, in amt_group_work()
433 if (!delayed_work_pending(&snode->source_timer) || in amt_group_work()
434 snode->status == AMT_SOURCE_STATUS_D_FWD) { in amt_group_work()
435 amt_destroy_source(snode); in amt_group_work()
438 snode->status = AMT_SOURCE_STATUS_FWD; in amt_group_work()
1359 struct amt_source_node *snode; in amt_cleanup_srcs() local
1365 hlist_for_each_entry_safe(snode, t, &gnode->sources[i], node) { in amt_cleanup_srcs()
1366 if (snode->flags == AMT_SOURCE_OLD) in amt_cleanup_srcs()
1367 amt_destroy_source(snode); in amt_cleanup_srcs()
1373 hlist_for_each_entry_rcu(snode, &gnode->sources[i], node) { in amt_cleanup_srcs()
1374 snode->flags = AMT_SOURCE_OLD; in amt_cleanup_srcs()
1376 netdev_dbg(snode->gnode->amt->dev, in amt_cleanup_srcs()
1378 &snode->source_addr.ip4, in amt_cleanup_srcs()
1382 netdev_dbg(snode->gnode->amt->dev, in amt_cleanup_srcs()
1384 &snode->source_addr.ip6, in amt_cleanup_srcs()
1396 struct amt_source_node *snode; in amt_add_srcs() local
1429 snode = amt_alloc_snode(gnode, &src); in amt_add_srcs()
1430 if (snode) { in amt_add_srcs()
1431 hash = amt_source_hash(tunnel, &snode->source_addr); in amt_add_srcs()
1432 hlist_add_head_rcu(&snode->node, &gnode->sources[hash]); in amt_add_srcs()
1437 netdev_dbg(snode->gnode->amt->dev, in amt_add_srcs()
1439 &snode->source_addr.ip4, in amt_add_srcs()
1443 netdev_dbg(snode->gnode->amt->dev, in amt_add_srcs()
1445 &snode->source_addr.ip6, in amt_add_srcs()
1480 struct amt_source_node *snode; in amt_lookup_act_srcs() local
1514 snode = amt_lookup_src(tunnel, gnode, filter, &src); in amt_lookup_act_srcs()
1515 if (!snode) in amt_lookup_act_srcs()
1517 amt_act_src(tunnel, gnode, snode, act); in amt_lookup_act_srcs()
1523 hlist_for_each_entry_safe(snode, t, &gnode->sources[i], in amt_lookup_act_srcs()
1525 if (amt_status_filter(snode, filter)) in amt_lookup_act_srcs()
1526 amt_act_src(tunnel, gnode, snode, act); in amt_lookup_act_srcs()
1537 snode = amt_lookup_src(tunnel, gnode, filter, &src); in amt_lookup_act_srcs()
1538 if (!snode) in amt_lookup_act_srcs()
1540 amt_act_src(tunnel, gnode, snode, act); in amt_lookup_act_srcs()
1546 hlist_for_each_entry_safe(snode, t, &gnode->sources[i], in amt_lookup_act_srcs()
1548 if (!amt_status_filter(snode, filter)) in amt_lookup_act_srcs()
1559 if (amt_addr_equal(&snode->source_addr, in amt_lookup_act_srcs()
1563 amt_act_src(tunnel, gnode, snode, act); in amt_lookup_act_srcs()
1579 snode = amt_lookup_src(tunnel, gnode, AMT_FILTER_ALL, in amt_lookup_act_srcs()
1581 if (!snode) { in amt_lookup_act_srcs()
1582 snode = amt_lookup_src(tunnel, gnode, in amt_lookup_act_srcs()
1584 if (snode) in amt_lookup_act_srcs()
1585 amt_act_src(tunnel, gnode, snode, act); in amt_lookup_act_srcs()