Lines Matching refs:tunnel
121 static u32 amt_source_hash(struct amt_tunnel_list *tunnel, union amt_addr *src)
123 u32 hash = jhash(src, sizeof(*src), tunnel->amt->hash_seed);
125 return reciprocal_scale(hash, tunnel->amt->hash_buckets);
182 static struct amt_source_node *amt_lookup_src(struct amt_tunnel_list *tunnel,
187 u32 hash = amt_source_hash(tunnel, src);
198 static u32 amt_group_hash(struct amt_tunnel_list *tunnel, union amt_addr *group)
200 u32 hash = jhash(group, sizeof(*group), tunnel->amt->hash_seed);
202 return reciprocal_scale(hash, tunnel->amt->hash_buckets);
205 static struct amt_group_node *amt_lookup_group(struct amt_tunnel_list *tunnel,
210 u32 hash = amt_group_hash(tunnel, group);
213 hlist_for_each_entry_rcu(gnode, &tunnel->groups[hash], node) {
226 struct amt_tunnel_list *tunnel;
228 tunnel = gnode->tunnel_list;
246 tunnel->nr_sources--;
276 /* tunnel->lock was acquired outside of amt_del_group()
294 struct amt_tunnel_list *tunnel;
296 tunnel = gnode->tunnel_list;
297 spin_lock_bh(&tunnel->lock);
310 spin_unlock_bh(&tunnel->lock);
313 static void amt_act_src(struct amt_tunnel_list *tunnel,
318 struct amt_dev *amt = tunnel->amt;
413 struct amt_tunnel_list *tunnel = gnode->tunnel_list;
422 spin_lock_bh(&tunnel->lock);
425 spin_unlock_bh(&tunnel->lock);
447 spin_unlock_bh(&tunnel->lock);
464 struct amt_tunnel_list *tunnel,
473 if (tunnel->nr_groups >= amt->max_groups)
486 gnode->tunnel_list = tunnel;
493 hash = amt_group_hash(tunnel, group);
494 hlist_add_head_rcu(&gnode->node, &tunnel->groups[hash]);
495 tunnel->nr_groups++;
590 static void __amt_update_relay_status(struct amt_tunnel_list *tunnel,
594 if (validate && tunnel->status >= status)
596 netdev_dbg(tunnel->amt->dev,
598 &tunnel->ip4, ntohs(tunnel->source_port),
599 status_str[tunnel->status], status_str[status]);
600 tunnel->status = status;
603 static void amt_update_relay_status(struct amt_tunnel_list *tunnel,
606 spin_lock_bh(&tunnel->lock);
607 __amt_update_relay_status(tunnel, status, validate);
608 spin_unlock_bh(&tunnel->lock);
791 struct amt_tunnel_list *tunnel)
799 amt_skb_cb(skb)->tunnel = tunnel;
876 static void amt_send_mld_gq(struct amt_dev *amt, struct amt_tunnel_list *tunnel)
884 amt_skb_cb(skb)->tunnel = tunnel;
888 static void amt_send_mld_gq(struct amt_dev *amt, struct amt_tunnel_list *tunnel)
1056 struct amt_tunnel_list *tunnel,
1078 fl4.daddr = tunnel->ip4;
1083 netdev_dbg(amt->dev, "no route to %pI4\n", &tunnel->ip4);
1104 tunnel->source_port,
1111 struct amt_tunnel_list *tunnel,
1132 fl4.daddr = tunnel->ip4;
1138 netdev_dbg(amt->dev, "no route to %pI4\n", &tunnel->ip4);
1148 amtmq->nonce = tunnel->nonce;
1149 amtmq->response_mac = tunnel->mac;
1162 tunnel->source_port,
1165 amt_update_relay_status(tunnel, AMT_STATUS_SENT_QUERY, true);
1172 struct amt_tunnel_list *tunnel;
1257 tunnel = amt_skb_cb(skb)->tunnel;
1258 if (!tunnel) {
1264 if (amt_send_membership_query(amt, skb, tunnel, v6))
1271 list_for_each_entry_rcu(tunnel, &amt->tunnel_list, list) {
1272 hash = amt_group_hash(tunnel, &group);
1273 hlist_for_each_entry_rcu(gnode, &tunnel->groups[hash],
1288 amt_send_multicast_data(amt, skb, tunnel, v6);
1319 static void amt_clear_groups(struct amt_tunnel_list *tunnel)
1321 struct amt_dev *amt = tunnel->amt;
1326 spin_lock_bh(&tunnel->lock);
1329 hlist_for_each_entry_safe(gnode, t, &tunnel->groups[i], node)
1332 spin_unlock_bh(&tunnel->lock);
1337 struct amt_tunnel_list *tunnel = container_of(to_delayed_work(work),
1340 struct amt_dev *amt = tunnel->amt;
1344 list_del_rcu(&tunnel->list);
1346 amt_clear_groups(tunnel);
1349 kfree_rcu(tunnel, rcu);
1353 struct amt_tunnel_list *tunnel,
1388 static void amt_add_srcs(struct amt_dev *amt, struct amt_tunnel_list *tunnel,
1414 if (tunnel->nr_sources >= amt->max_sources)
1423 if (amt_lookup_src(tunnel, gnode, AMT_FILTER_ALL, &src))
1428 hash = amt_source_hash(tunnel, &snode->source_addr);
1430 tunnel->nr_sources++;
1468 static void amt_lookup_act_srcs(struct amt_tunnel_list *tunnel,
1476 struct amt_dev *amt = tunnel->amt;
1511 snode = amt_lookup_src(tunnel, gnode, filter, &src);
1514 amt_act_src(tunnel, gnode, snode, act);
1523 amt_act_src(tunnel, gnode, snode, act);
1534 snode = amt_lookup_src(tunnel, gnode, filter, &src);
1537 amt_act_src(tunnel, gnode, snode, act);
1560 amt_act_src(tunnel, gnode, snode, act);
1576 snode = amt_lookup_src(tunnel, gnode, AMT_FILTER_ALL,
1579 snode = amt_lookup_src(tunnel, gnode,
1582 amt_act_src(tunnel, gnode, snode, act);
1593 struct amt_tunnel_list *tunnel,
1603 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_UNI,
1608 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_UNI,
1613 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_INT,
1623 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_INT,
1628 amt_lookup_act_srcs(tunnel, gnode, zero_grec, AMT_OPS_UNI,
1633 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_INT,
1638 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_SUB,
1646 struct amt_tunnel_list *tunnel,
1658 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_INT,
1663 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_SUB_REV,
1668 amt_lookup_act_srcs(tunnel, gnode, zero_grec, AMT_OPS_UNI,
1687 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_SUB_REV,
1692 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_INT,
1697 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_SUB_REV,
1710 struct amt_tunnel_list *tunnel,
1721 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_UNI,
1726 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_UNI,
1731 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_INT,
1743 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_UNI,
1748 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_UNI,
1756 amt_lookup_act_srcs(tunnel, gnode, zero_grec, AMT_OPS_UNI,
1763 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_INT,
1771 struct amt_tunnel_list *tunnel,
1784 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_INT,
1789 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_SUB_REV,
1794 amt_lookup_act_srcs(tunnel, gnode, zero_grec, AMT_OPS_UNI,
1814 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_SUB_REV,
1819 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_SUB_REV,
1824 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_INT,
1837 struct amt_tunnel_list *tunnel,
1847 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_UNI,
1852 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_INT,
1862 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_UNI,
1867 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_SUB,
1874 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_INT,
1882 struct amt_tunnel_list *tunnel,
1892 amt_lookup_act_srcs(tunnel, gnode, zero_grec, AMT_OPS_UNI,
1903 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_SUB_REV,
1908 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_UNI,
1913 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_SUB_REV,
1918 amt_lookup_act_srcs(tunnel, gnode, grec, AMT_OPS_UNI,
1938 struct amt_tunnel_list *tunnel)
1950 gnode = amt_lookup_group(tunnel, &group, &host, false);
1952 gnode = amt_add_group(amt, tunnel, &group, &host, false);
1975 struct amt_tunnel_list *tunnel)
1987 gnode = amt_lookup_group(tunnel, &group, &host, false);
1993 struct amt_tunnel_list *tunnel)
2021 gnode = amt_lookup_group(tunnel, &group, &host, false);
2023 gnode = amt_add_group(amt, tunnel, &group, &host,
2029 amt_add_srcs(amt, tunnel, gnode, grec, false);
2032 amt_mcast_is_in_handler(amt, tunnel, gnode, grec,
2036 amt_mcast_is_ex_handler(amt, tunnel, gnode, grec,
2040 amt_mcast_to_in_handler(amt, tunnel, gnode, grec,
2044 amt_mcast_to_ex_handler(amt, tunnel, gnode, grec,
2048 amt_mcast_allow_handler(amt, tunnel, gnode, grec,
2052 amt_mcast_block_handler(amt, tunnel, gnode, grec,
2058 amt_cleanup_srcs(amt, tunnel, gnode);
2062 /* caller held tunnel->lock */
2064 struct amt_tunnel_list *tunnel)
2070 amt_igmpv3_report_handler(amt, skb, tunnel);
2073 amt_igmpv2_report_handler(amt, skb, tunnel);
2076 amt_igmpv2_leave_handler(amt, skb, tunnel);
2099 struct amt_tunnel_list *tunnel)
2109 gnode = amt_lookup_group(tunnel, &group, &host, true);
2111 gnode = amt_add_group(amt, tunnel, &group, &host, true);
2136 struct amt_tunnel_list *tunnel)
2147 gnode = amt_lookup_group(tunnel, &group, &host, true);
2155 struct amt_tunnel_list *tunnel)
2183 gnode = amt_lookup_group(tunnel, &group, &host, true);
2185 gnode = amt_add_group(amt, tunnel, &group, &host,
2191 amt_add_srcs(amt, tunnel, gnode, grec, true);
2194 amt_mcast_is_in_handler(amt, tunnel, gnode, grec,
2198 amt_mcast_is_ex_handler(amt, tunnel, gnode, grec,
2202 amt_mcast_to_in_handler(amt, tunnel, gnode, grec,
2206 amt_mcast_to_ex_handler(amt, tunnel, gnode, grec,
2210 amt_mcast_allow_handler(amt, tunnel, gnode, grec,
2214 amt_mcast_block_handler(amt, tunnel, gnode, grec,
2220 amt_cleanup_srcs(amt, tunnel, gnode);
2224 /* caller held tunnel->lock */
2226 struct amt_tunnel_list *tunnel)
2232 amt_mldv1_report_handler(amt, skb, tunnel);
2235 amt_mldv2_report_handler(amt, skb, tunnel);
2238 amt_mldv1_leave_handler(amt, skb, tunnel);
2449 struct amt_tunnel_list *tunnel;
2469 list_for_each_entry_rcu(tunnel, &amt->tunnel_list, list) {
2470 if (tunnel->ip4 == iph->saddr) {
2471 if ((amtmu->nonce == tunnel->nonce &&
2472 amtmu->response_mac == tunnel->mac)) {
2473 mod_delayed_work(amt_wq, &tunnel->gc_wq,
2497 spin_lock_bh(&tunnel->lock);
2498 amt_igmp_report_handler(amt, skb, tunnel);
2499 spin_unlock_bh(&tunnel->lock);
2516 spin_lock_bh(&tunnel->lock);
2517 amt_mld_report_handler(amt, skb, tunnel);
2518 spin_unlock_bh(&tunnel->lock);
2537 amt_update_relay_status(tunnel, AMT_STATUS_RECEIVED_UPDATE,
2661 struct amt_tunnel_list *tunnel;
2678 list_for_each_entry_rcu(tunnel, &amt->tunnel_list, list)
2679 if (tunnel->ip4 == iph->saddr)
2689 tunnel = kzalloc(sizeof(*tunnel) +
2692 if (!tunnel) {
2697 tunnel->source_port = udph->source;
2698 tunnel->ip4 = iph->saddr;
2700 memcpy(&key, &tunnel->key, sizeof(unsigned long long));
2701 tunnel->amt = amt;
2702 spin_lock_init(&tunnel->lock);
2704 INIT_HLIST_HEAD(&tunnel->groups[i]);
2706 INIT_DELAYED_WORK(&tunnel->gc_wq, amt_tunnel_expire);
2708 list_add_tail_rcu(&tunnel->list, &amt->tunnel_list);
2709 tunnel->key = amt->key;
2710 __amt_update_relay_status(tunnel, AMT_STATUS_RECEIVED_REQUEST, true);
2712 mod_delayed_work(amt_wq, &tunnel->gc_wq,
2717 tunnel->nonce = amtrh->nonce;
2718 mac = siphash_3u32((__force u32)tunnel->ip4,
2719 (__force u32)tunnel->source_port,
2720 (__force u32)tunnel->nonce,
2721 &tunnel->key);
2722 tunnel->mac = mac >> 16;
2728 amt_send_igmp_gq(amt, tunnel);
2730 amt_send_mld_gq(amt, tunnel);
3016 struct amt_tunnel_list *tunnel, *tmp;
3045 list_for_each_entry_safe(tunnel, tmp, &amt->tunnel_list, list) {
3046 list_del_rcu(&tunnel->list);
3048 cancel_delayed_work_sync(&tunnel->gc_wq);
3049 amt_clear_groups(tunnel);
3050 kfree_rcu(tunnel, rcu);