Lines Matching refs:peer
29 struct ovpn_peer *peer; in unlock_ovpn() local
33 llist_for_each_entry(peer, release_list->first, release_entry) { in unlock_ovpn()
34 ovpn_socket_release(peer); in unlock_ovpn()
35 ovpn_peer_put(peer); in unlock_ovpn()
45 void ovpn_peer_keepalive_set(struct ovpn_peer *peer, u32 interval, u32 timeout) in ovpn_peer_keepalive_set() argument
49 netdev_dbg(peer->ovpn->dev, in ovpn_peer_keepalive_set()
51 peer->id, interval, timeout); in ovpn_peer_keepalive_set()
53 peer->keepalive_interval = interval; in ovpn_peer_keepalive_set()
54 WRITE_ONCE(peer->last_sent, now); in ovpn_peer_keepalive_set()
55 peer->keepalive_xmit_exp = now + interval; in ovpn_peer_keepalive_set()
57 peer->keepalive_timeout = timeout; in ovpn_peer_keepalive_set()
58 WRITE_ONCE(peer->last_recv, now); in ovpn_peer_keepalive_set()
59 peer->keepalive_recv_exp = now + timeout; in ovpn_peer_keepalive_set()
64 mod_delayed_work(system_wq, &peer->ovpn->keepalive_work, 0); in ovpn_peer_keepalive_set()
76 struct ovpn_peer *peer = container_of(work, struct ovpn_peer, in ovpn_peer_keepalive_send() local
80 ovpn_xmit_special(peer, ovpn_keepalive_message, in ovpn_peer_keepalive_send()
94 struct ovpn_peer *peer; in ovpn_peer_new() local
98 peer = kzalloc(sizeof(*peer), GFP_KERNEL); in ovpn_peer_new()
99 if (!peer) in ovpn_peer_new()
102 peer->id = id; in ovpn_peer_new()
103 peer->ovpn = ovpn; in ovpn_peer_new()
105 peer->vpn_addrs.ipv4.s_addr = htonl(INADDR_ANY); in ovpn_peer_new()
106 peer->vpn_addrs.ipv6 = in6addr_any; in ovpn_peer_new()
108 RCU_INIT_POINTER(peer->bind, NULL); in ovpn_peer_new()
109 ovpn_crypto_state_init(&peer->crypto); in ovpn_peer_new()
110 spin_lock_init(&peer->lock); in ovpn_peer_new()
111 kref_init(&peer->refcount); in ovpn_peer_new()
112 ovpn_peer_stats_init(&peer->vpn_stats); in ovpn_peer_new()
113 ovpn_peer_stats_init(&peer->link_stats); in ovpn_peer_new()
114 INIT_WORK(&peer->keepalive_work, ovpn_peer_keepalive_send); in ovpn_peer_new()
116 ret = dst_cache_init(&peer->dst_cache, GFP_KERNEL); in ovpn_peer_new()
120 peer->id); in ovpn_peer_new()
121 kfree(peer); in ovpn_peer_new()
125 netdev_hold(ovpn->dev, &peer->dev_tracker, GFP_KERNEL); in ovpn_peer_new()
127 return peer; in ovpn_peer_new()
138 int ovpn_peer_reset_sockaddr(struct ovpn_peer *peer, in ovpn_peer_reset_sockaddr() argument
145 lockdep_assert_held(&peer->lock); in ovpn_peer_reset_sockaddr()
159 netdev_name(peer->ovpn->dev), in ovpn_peer_reset_sockaddr()
160 ss->ss_family, peer->id); in ovpn_peer_reset_sockaddr()
169 ovpn_bind_reset(peer, bind); in ovpn_peer_reset_sockaddr()
192 void ovpn_peer_endpoints_update(struct ovpn_peer *peer, struct sk_buff *skb) in ovpn_peer_endpoints_update() argument
203 spin_lock_bh(&peer->lock); in ovpn_peer_endpoints_update()
204 bind = rcu_dereference_protected(peer->bind, in ovpn_peer_endpoints_update()
205 lockdep_is_held(&peer->lock)); in ovpn_peer_endpoints_update()
231 netdev_name(peer->ovpn->dev), in ovpn_peer_endpoints_update()
232 peer->id, &bind->local.ipv4.s_addr, in ovpn_peer_endpoints_update()
262 netdev_name(peer->ovpn->dev), in ovpn_peer_endpoints_update()
263 peer->id, &bind->local.ipv6, in ovpn_peer_endpoints_update()
274 dst_cache_reset(&peer->dst_cache); in ovpn_peer_endpoints_update()
280 if (unlikely(ovpn_peer_reset_sockaddr(peer, in ovpn_peer_endpoints_update()
286 netdev_name(peer->ovpn->dev), peer->id, &ss); in ovpn_peer_endpoints_update()
288 spin_unlock_bh(&peer->lock); in ovpn_peer_endpoints_update()
293 if (peer->ovpn->mode == OVPN_MODE_MP) { in ovpn_peer_endpoints_update()
294 spin_lock_bh(&peer->ovpn->lock); in ovpn_peer_endpoints_update()
295 spin_lock_bh(&peer->lock); in ovpn_peer_endpoints_update()
296 bind = rcu_dereference_protected(peer->bind, in ovpn_peer_endpoints_update()
297 lockdep_is_held(&peer->lock)); in ovpn_peer_endpoints_update()
299 spin_unlock_bh(&peer->lock); in ovpn_peer_endpoints_update()
300 spin_unlock_bh(&peer->ovpn->lock); in ovpn_peer_endpoints_update()
319 hlist_nulls_del_init_rcu(&peer->hash_entry_transp_addr); in ovpn_peer_endpoints_update()
321 nhead = ovpn_get_hash_head(peer->ovpn->peers->by_transp_addr, in ovpn_peer_endpoints_update()
323 hlist_nulls_add_head_rcu(&peer->hash_entry_transp_addr, nhead); in ovpn_peer_endpoints_update()
324 spin_unlock_bh(&peer->lock); in ovpn_peer_endpoints_update()
325 spin_unlock_bh(&peer->ovpn->lock); in ovpn_peer_endpoints_update()
329 spin_unlock_bh(&peer->lock); in ovpn_peer_endpoints_update()
338 struct ovpn_peer *peer = container_of(head, struct ovpn_peer, rcu); in ovpn_peer_release_rcu() local
343 dst_cache_destroy(&peer->dst_cache); in ovpn_peer_release_rcu()
344 kfree(peer); in ovpn_peer_release_rcu()
351 void ovpn_peer_release(struct ovpn_peer *peer) in ovpn_peer_release() argument
353 ovpn_crypto_state_release(&peer->crypto); in ovpn_peer_release()
354 spin_lock_bh(&peer->lock); in ovpn_peer_release()
355 ovpn_bind_reset(peer, NULL); in ovpn_peer_release()
356 spin_unlock_bh(&peer->lock); in ovpn_peer_release()
357 call_rcu(&peer->rcu, ovpn_peer_release_rcu); in ovpn_peer_release()
358 netdev_put(peer->ovpn->dev, &peer->dev_tracker); in ovpn_peer_release()
367 struct ovpn_peer *peer = container_of(kref, struct ovpn_peer, refcount); in ovpn_peer_release_kref() local
369 ovpn_peer_release(peer); in ovpn_peer_release_kref()
512 static bool ovpn_peer_transp_match(const struct ovpn_peer *peer, in ovpn_peer_transp_match() argument
515 struct ovpn_bind *bind = rcu_dereference(peer->bind); in ovpn_peer_transp_match()
560 struct ovpn_peer *tmp, *peer = NULL; in ovpn_peer_get_by_transp_addr_p2p() local
563 tmp = rcu_dereference(ovpn->peer); in ovpn_peer_get_by_transp_addr_p2p()
566 peer = tmp; in ovpn_peer_get_by_transp_addr_p2p()
569 return peer; in ovpn_peer_get_by_transp_addr_p2p()
582 struct ovpn_peer *tmp, *peer = NULL; in ovpn_peer_get_by_transp_addr() local
609 peer = tmp; in ovpn_peer_get_by_transp_addr()
616 if (!peer && get_nulls_value(ntmp) != slot) in ovpn_peer_get_by_transp_addr()
620 return peer; in ovpn_peer_get_by_transp_addr()
633 struct ovpn_peer *tmp, *peer = NULL; in ovpn_peer_get_by_id_p2p() local
636 tmp = rcu_dereference(ovpn->peer); in ovpn_peer_get_by_id_p2p()
638 peer = tmp; in ovpn_peer_get_by_id_p2p()
641 return peer; in ovpn_peer_get_by_id_p2p()
653 struct ovpn_peer *tmp, *peer = NULL; in ovpn_peer_get_by_id() local
670 peer = tmp; in ovpn_peer_get_by_id()
675 return peer; in ovpn_peer_get_by_id()
678 static void ovpn_peer_remove(struct ovpn_peer *peer, in ovpn_peer_remove() argument
682 lockdep_assert_held(&peer->ovpn->lock); in ovpn_peer_remove()
684 switch (peer->ovpn->mode) { in ovpn_peer_remove()
687 if (hlist_unhashed(&peer->hash_entry_id)) in ovpn_peer_remove()
690 hlist_del_init_rcu(&peer->hash_entry_id); in ovpn_peer_remove()
691 hlist_nulls_del_init_rcu(&peer->hash_entry_addr4); in ovpn_peer_remove()
692 hlist_nulls_del_init_rcu(&peer->hash_entry_addr6); in ovpn_peer_remove()
693 hlist_nulls_del_init_rcu(&peer->hash_entry_transp_addr); in ovpn_peer_remove()
697 if (peer != rcu_access_pointer(peer->ovpn->peer)) in ovpn_peer_remove()
700 RCU_INIT_POINTER(peer->ovpn->peer, NULL); in ovpn_peer_remove()
704 netif_carrier_off(peer->ovpn->dev); in ovpn_peer_remove()
708 peer->delete_reason = reason; in ovpn_peer_remove()
709 ovpn_nl_peer_del_notify(peer); in ovpn_peer_remove()
712 llist_add(&peer->release_entry, release_list); in ovpn_peer_remove()
731 struct ovpn_peer *peer = NULL; in ovpn_peer_get_by_dst() local
740 peer = rcu_dereference(ovpn->peer); in ovpn_peer_get_by_dst()
741 if (unlikely(peer && !ovpn_peer_hold(peer))) in ovpn_peer_get_by_dst()
742 peer = NULL; in ovpn_peer_get_by_dst()
744 return peer; in ovpn_peer_get_by_dst()
751 peer = ovpn_peer_get_by_vpn_addr4(ovpn, addr4); in ovpn_peer_get_by_dst()
755 peer = ovpn_peer_get_by_vpn_addr6(ovpn, &addr6); in ovpn_peer_get_by_dst()
759 if (unlikely(peer && !ovpn_peer_hold(peer))) in ovpn_peer_get_by_dst()
760 peer = NULL; in ovpn_peer_get_by_dst()
763 return peer; in ovpn_peer_get_by_dst()
856 struct ovpn_peer *peer) in ovpn_peer_check_by_src() argument
866 return peer == rcu_access_pointer(ovpn->peer); in ovpn_peer_check_by_src()
879 match = (peer == ovpn_peer_get_by_vpn_addr4(ovpn, addr4)); in ovpn_peer_check_by_src()
885 match = (peer == ovpn_peer_get_by_vpn_addr6(ovpn, &addr6)); in ovpn_peer_check_by_src()
893 void ovpn_peer_hash_vpn_ip(struct ovpn_peer *peer) in ovpn_peer_hash_vpn_ip() argument
897 lockdep_assert_held(&peer->ovpn->lock); in ovpn_peer_hash_vpn_ip()
900 if (peer->ovpn->mode != OVPN_MODE_MP) in ovpn_peer_hash_vpn_ip()
903 if (peer->vpn_addrs.ipv4.s_addr != htonl(INADDR_ANY)) { in ovpn_peer_hash_vpn_ip()
905 hlist_nulls_del_init_rcu(&peer->hash_entry_addr4); in ovpn_peer_hash_vpn_ip()
907 nhead = ovpn_get_hash_head(peer->ovpn->peers->by_vpn_addr4, in ovpn_peer_hash_vpn_ip()
908 &peer->vpn_addrs.ipv4, in ovpn_peer_hash_vpn_ip()
909 sizeof(peer->vpn_addrs.ipv4)); in ovpn_peer_hash_vpn_ip()
910 hlist_nulls_add_head_rcu(&peer->hash_entry_addr4, nhead); in ovpn_peer_hash_vpn_ip()
913 if (!ipv6_addr_any(&peer->vpn_addrs.ipv6)) { in ovpn_peer_hash_vpn_ip()
915 hlist_nulls_del_init_rcu(&peer->hash_entry_addr6); in ovpn_peer_hash_vpn_ip()
917 nhead = ovpn_get_hash_head(peer->ovpn->peers->by_vpn_addr6, in ovpn_peer_hash_vpn_ip()
918 &peer->vpn_addrs.ipv6, in ovpn_peer_hash_vpn_ip()
919 sizeof(peer->vpn_addrs.ipv6)); in ovpn_peer_hash_vpn_ip()
920 hlist_nulls_add_head_rcu(&peer->hash_entry_addr6, nhead); in ovpn_peer_hash_vpn_ip()
931 static int ovpn_peer_add_mp(struct ovpn_priv *ovpn, struct ovpn_peer *peer) in ovpn_peer_add_mp() argument
944 tmp = ovpn_peer_get_by_id(ovpn, peer->id); in ovpn_peer_add_mp()
951 bind = rcu_dereference_protected(peer->bind, true); in ovpn_peer_add_mp()
978 hlist_nulls_add_head_rcu(&peer->hash_entry_transp_addr, nhead); in ovpn_peer_add_mp()
981 hlist_add_head_rcu(&peer->hash_entry_id, in ovpn_peer_add_mp()
982 ovpn_get_hash_head(ovpn->peers->by_id, &peer->id, in ovpn_peer_add_mp()
983 sizeof(peer->id))); in ovpn_peer_add_mp()
985 ovpn_peer_hash_vpn_ip(peer); in ovpn_peer_add_mp()
998 static int ovpn_peer_add_p2p(struct ovpn_priv *ovpn, struct ovpn_peer *peer) in ovpn_peer_add_p2p() argument
1007 tmp = rcu_dereference_protected(ovpn->peer, in ovpn_peer_add_p2p()
1013 rcu_assign_pointer(ovpn->peer, peer); in ovpn_peer_add_p2p()
1030 int ovpn_peer_add(struct ovpn_priv *ovpn, struct ovpn_peer *peer) in ovpn_peer_add() argument
1034 return ovpn_peer_add_mp(ovpn, peer); in ovpn_peer_add()
1036 return ovpn_peer_add_p2p(ovpn, peer); in ovpn_peer_add()
1050 static int ovpn_peer_del_mp(struct ovpn_peer *peer, in ovpn_peer_del_mp() argument
1057 lockdep_assert_held(&peer->ovpn->lock); in ovpn_peer_del_mp()
1059 tmp = ovpn_peer_get_by_id(peer->ovpn, peer->id); in ovpn_peer_del_mp()
1060 if (tmp == peer) { in ovpn_peer_del_mp()
1061 ovpn_peer_remove(peer, reason, release_list); in ovpn_peer_del_mp()
1079 static int ovpn_peer_del_p2p(struct ovpn_peer *peer, in ovpn_peer_del_p2p() argument
1085 lockdep_assert_held(&peer->ovpn->lock); in ovpn_peer_del_p2p()
1087 tmp = rcu_dereference_protected(peer->ovpn->peer, in ovpn_peer_del_p2p()
1088 lockdep_is_held(&peer->ovpn->lock)); in ovpn_peer_del_p2p()
1089 if (tmp != peer) in ovpn_peer_del_p2p()
1092 ovpn_peer_remove(peer, reason, release_list); in ovpn_peer_del_p2p()
1104 int ovpn_peer_del(struct ovpn_peer *peer, enum ovpn_del_peer_reason reason) in ovpn_peer_del() argument
1109 spin_lock_bh(&peer->ovpn->lock); in ovpn_peer_del()
1110 switch (peer->ovpn->mode) { in ovpn_peer_del()
1112 ret = ovpn_peer_del_mp(peer, reason, &release_list); in ovpn_peer_del()
1115 ret = ovpn_peer_del_p2p(peer, reason, &release_list); in ovpn_peer_del()
1120 unlock_ovpn(peer->ovpn, &release_list); in ovpn_peer_del()
1136 struct ovpn_peer *peer; in ovpn_peer_release_p2p() local
1139 peer = rcu_dereference_protected(ovpn->peer, in ovpn_peer_release_p2p()
1141 if (!peer) { in ovpn_peer_release_p2p()
1147 ovpn_sock = rcu_access_pointer(peer->sock); in ovpn_peer_release_p2p()
1150 ovpn_peer_put(peer); in ovpn_peer_release_p2p()
1155 ovpn_peer_remove(peer, reason, &release_list); in ovpn_peer_release_p2p()
1164 struct ovpn_peer *peer; in ovpn_peers_release_mp() local
1169 hash_for_each_safe(ovpn->peers->by_id, bkt, tmp, peer, hash_entry_id) { in ovpn_peers_release_mp()
1177 ovpn_sock = rcu_dereference(peer->sock); in ovpn_peers_release_mp()
1183 ovpn_peer_remove(peer, reason, &release_list); in ovpn_peers_release_mp()
1208 static time64_t ovpn_peer_keepalive_work_single(struct ovpn_peer *peer, in ovpn_peer_keepalive_work_single() argument
1216 spin_lock_bh(&peer->lock); in ovpn_peer_keepalive_work_single()
1220 if (!peer->keepalive_timeout || !peer->keepalive_interval) { in ovpn_peer_keepalive_work_single()
1221 spin_unlock_bh(&peer->lock); in ovpn_peer_keepalive_work_single()
1227 timeout = peer->keepalive_timeout; in ovpn_peer_keepalive_work_single()
1228 last_recv = READ_ONCE(peer->last_recv); in ovpn_peer_keepalive_work_single()
1230 peer->keepalive_recv_exp = last_recv + timeout; in ovpn_peer_keepalive_work_single()
1231 next_run1 = peer->keepalive_recv_exp; in ovpn_peer_keepalive_work_single()
1232 } else if (peer->keepalive_recv_exp > now) { in ovpn_peer_keepalive_work_single()
1233 next_run1 = peer->keepalive_recv_exp; in ovpn_peer_keepalive_work_single()
1240 spin_unlock_bh(&peer->lock); in ovpn_peer_keepalive_work_single()
1241 netdev_dbg(peer->ovpn->dev, "peer %u expired\n", in ovpn_peer_keepalive_work_single()
1242 peer->id); in ovpn_peer_keepalive_work_single()
1243 ovpn_peer_remove(peer, OVPN_DEL_PEER_REASON_EXPIRED, in ovpn_peer_keepalive_work_single()
1250 interval = peer->keepalive_interval; in ovpn_peer_keepalive_work_single()
1251 last_sent = READ_ONCE(peer->last_sent); in ovpn_peer_keepalive_work_single()
1253 peer->keepalive_xmit_exp = last_sent + interval; in ovpn_peer_keepalive_work_single()
1254 next_run2 = peer->keepalive_xmit_exp; in ovpn_peer_keepalive_work_single()
1255 } else if (peer->keepalive_xmit_exp > now) { in ovpn_peer_keepalive_work_single()
1256 next_run2 = peer->keepalive_xmit_exp; in ovpn_peer_keepalive_work_single()
1261 spin_unlock_bh(&peer->lock); in ovpn_peer_keepalive_work_single()
1265 netdev_dbg(peer->ovpn->dev, in ovpn_peer_keepalive_work_single()
1267 peer->id); in ovpn_peer_keepalive_work_single()
1268 if (schedule_work(&peer->keepalive_work)) in ovpn_peer_keepalive_work_single()
1269 ovpn_peer_hold(peer); in ovpn_peer_keepalive_work_single()
1284 struct ovpn_peer *peer; in ovpn_peer_keepalive_work_mp() local
1289 hash_for_each_safe(ovpn->peers->by_id, bkt, tmp, peer, hash_entry_id) { in ovpn_peer_keepalive_work_mp()
1290 tmp_next_run = ovpn_peer_keepalive_work_single(peer, now, in ovpn_peer_keepalive_work_mp()
1309 struct ovpn_peer *peer; in ovpn_peer_keepalive_work_p2p() local
1314 peer = rcu_dereference_protected(ovpn->peer, in ovpn_peer_keepalive_work_p2p()
1316 if (peer) in ovpn_peer_keepalive_work_p2p()
1317 next_run = ovpn_peer_keepalive_work_single(peer, now, in ovpn_peer_keepalive_work_p2p()