@@ -39,7 +39,7 @@ pex_msg_init_ext(struct network *net, uint8_t opcode, bool ext)
39
39
}
40
40
41
41
static struct network_peer *
42
- pex_msg_peer (struct network * net , const uint8_t * id )
42
+ pex_msg_peer (struct network * net , const uint8_t * id , bool allow_indirect )
43
43
{
44
44
struct network_peer * peer ;
45
45
uint8_t key [WG_KEY_LEN ] = {};
@@ -50,6 +50,8 @@ pex_msg_peer(struct network *net, const uint8_t *id)
50
50
D_NET (net , "can't find peer %s" , pex_peer_id_str (id ));
51
51
return NULL ;
52
52
}
53
+ if (peer -> indirect && !allow_indirect )
54
+ return NULL ;
53
55
54
56
return peer ;
55
57
}
@@ -154,7 +156,7 @@ network_pex_handle_endpoint_change(struct network *net, struct network_peer *pee
154
156
struct network_peer * cur ;
155
157
156
158
vlist_for_each_element (& net -> peers , cur , node ) {
157
- if (cur == peer || !cur -> state .connected )
159
+ if (cur == peer || !cur -> state .connected || cur -> indirect )
158
160
continue ;
159
161
160
162
pex_msg_init (net , PEX_MSG_NOTIFY_PEERS );
@@ -483,7 +485,7 @@ network_pex_recv_peers(struct network *net, struct network_peer *peer,
483
485
continue ;
484
486
}
485
487
486
- cur = pex_msg_peer (net , data -> peer_id );
488
+ cur = pex_msg_peer (net , data -> peer_id , false );
487
489
if (!cur || cur == peer )
488
490
continue ;
489
491
@@ -507,7 +509,7 @@ network_pex_recv_query(struct network *net, struct network_peer *peer,
507
509
508
510
pex_msg_init (net , PEX_MSG_NOTIFY_PEERS );
509
511
for (; len >= 8 ; data += 8 , len -= 8 ) {
510
- cur = pex_msg_peer (net , data );
512
+ cur = pex_msg_peer (net , data , false );
511
513
if (!cur || !cur -> state .connected )
512
514
continue ;
513
515
@@ -717,7 +719,7 @@ network_pex_fd_cb(struct uloop_fd *fd, unsigned int events)
717
719
if (!hdr )
718
720
continue ;
719
721
720
- peer = pex_msg_peer (net , hdr -> id );
722
+ peer = pex_msg_peer (net , hdr -> id , false );
721
723
if (!peer )
722
724
continue ;
723
725
@@ -958,7 +960,7 @@ global_pex_recv(void *msg, size_t msg_len, struct sockaddr_in6 *addr)
958
960
case PEX_MSG_PONG :
959
961
break ;
960
962
case PEX_MSG_UPDATE_REQUEST :
961
- peer = pex_msg_peer (net , hdr -> id );
963
+ peer = pex_msg_peer (net , hdr -> id , true );
962
964
network_pex_recv_update_request (net , peer , data , hdr -> len ,
963
965
addr );
964
966
break ;
@@ -974,7 +976,7 @@ global_pex_recv(void *msg, size_t msg_len, struct sockaddr_in6 *addr)
974
976
ep_idx = ENDPOINT_TYPE_ENDPOINT_PORT_NOTIFY ;
975
977
fallthrough ;
976
978
case PEX_MSG_ENDPOINT_NOTIFY :
977
- peer = pex_msg_peer (net , hdr -> id );
979
+ peer = pex_msg_peer (net , hdr -> id , true );
978
980
if (!peer )
979
981
break ;
980
982
0 commit comments