@@ -43,6 +43,9 @@ const SOCKET_TAG_TPU_QUIC: u8 = 8;
43
43
const SOCKET_TAG_TPU_VOTE : u8 = 9 ;
44
44
const SOCKET_TAG_TPU_VOTE_QUIC : u8 = 12 ;
45
45
const SOCKET_TAG_TVU : u8 = 10 ;
46
+ /// When multicast is enabled, this port has to be used for TVU
47
+ /// by all validators to ensure they can actually leverage multicasting
48
+ const TVU_MULTICAST_PORT : u16 = 8002 ;
46
49
const SOCKET_TAG_TVU_QUIC : u8 = 11 ;
47
50
const SOCKET_TAG_ALPENGLOW : u8 = 13 ;
48
51
const_assert_eq ! ( SOCKET_CACHE_SIZE , 14 ) ;
@@ -329,7 +332,7 @@ impl ContactInfo {
329
332
num_addrs : self . addrs . len ( ) ,
330
333
} ) ?;
331
334
let socket = SocketAddr :: new ( * addr, port) ;
332
- sanitize_socket ( & socket) ?;
335
+ sanitize_socket ( & socket, key ) ?;
333
336
return Ok ( socket) ;
334
337
}
335
338
}
@@ -349,7 +352,7 @@ impl ContactInfo {
349
352
}
350
353
351
354
pub fn set_socket ( & mut self , key : u8 , socket : SocketAddr ) -> Result < ( ) , Error > {
352
- sanitize_socket ( & socket) ?;
355
+ sanitize_socket ( & socket, key ) ?;
353
356
// Remove the old entry associated with this key (if any).
354
357
self . remove_socket ( key) ;
355
358
// Find the index at which the new socket entry would be inserted into
@@ -463,7 +466,7 @@ impl ContactInfo {
463
466
// Only for tests and simulations.
464
467
pub fn new_with_socketaddr ( pubkey : & Pubkey , socket : & SocketAddr ) -> Self {
465
468
use Protocol :: { QUIC , UDP } ;
466
- assert_matches ! ( sanitize_socket( socket) , Ok ( ( ) ) ) ;
469
+ assert_matches ! ( sanitize_socket( socket, SOCKET_TAG_GOSSIP ) , Ok ( ( ) ) ) ;
467
470
let mut node = Self :: new (
468
471
* pubkey,
469
472
solana_time_utils:: timestamp ( ) , // wallclock,
@@ -576,7 +579,7 @@ impl TryFrom<ContactInfoLite> for ContactInfo {
576
579
continue ;
577
580
} ;
578
581
let socket = SocketAddr :: new ( addr, port) ;
579
- if sanitize_socket ( & socket) . is_ok ( ) {
582
+ if sanitize_socket ( & socket, key ) . is_ok ( ) {
580
583
* entry = socket;
581
584
}
582
585
}
@@ -593,16 +596,21 @@ impl Sanitize for ContactInfo {
593
596
}
594
597
}
595
598
596
- pub ( crate ) fn sanitize_socket ( socket : & SocketAddr ) -> Result < ( ) , Error > {
599
+ pub ( crate ) fn sanitize_socket ( socket : & SocketAddr , key : u8 ) -> Result < ( ) , Error > {
597
600
if socket. port ( ) == 0u16 {
598
601
return Err ( Error :: InvalidPort ( socket. port ( ) ) ) ;
599
602
}
600
603
let addr = socket. ip ( ) ;
601
604
if addr. is_unspecified ( ) {
602
605
return Err ( Error :: UnspecifiedIpAddr ( addr) ) ;
603
606
}
607
+
604
608
if addr. is_multicast ( ) {
605
- return Err ( Error :: MulticastIpAddr ( addr) ) ;
609
+ if key != SOCKET_TAG_TVU {
610
+ return Err ( Error :: MulticastIpAddr ( addr) ) ;
611
+ } else if socket. port ( ) != TVU_MULTICAST_PORT {
612
+ return Err ( Error :: InvalidPort ( socket. port ( ) ) ) ;
613
+ }
606
614
}
607
615
Ok ( ( ) )
608
616
}
@@ -863,7 +871,7 @@ mod tests {
863
871
let addr = addrs. choose ( & mut rng) . unwrap ( ) ;
864
872
let socket = SocketAddr :: new ( * addr, new_rand_port ( & mut rng) ) ;
865
873
let key = rng. gen_range ( KEYS . start ..KEYS . end ) ;
866
- if sanitize_socket ( & socket) . is_ok ( ) {
874
+ if sanitize_socket ( & socket, key ) . is_ok ( ) {
867
875
sockets. insert ( key, socket) ;
868
876
assert_matches ! ( node. set_socket( key, socket) , Ok ( ( ) ) ) ;
869
877
assert_matches ! ( sanitize_entries( & node. addrs, & node. sockets) , Ok ( ( ) ) ) ;
@@ -877,7 +885,7 @@ mod tests {
877
885
assert_eq ! (
878
886
node. cache[ usize :: from( key) ] ,
879
887
socket
880
- . filter( |socket| sanitize_socket( socket) . is_ok( ) )
888
+ . filter( |socket| sanitize_socket( socket, key ) . is_ok( ) )
881
889
. copied( )
882
890
. unwrap_or( SOCKET_ADDR_UNSPECIFIED ) ,
883
891
) ;
@@ -1036,7 +1044,7 @@ mod tests {
1036
1044
fn test_new_with_socketaddr ( ) {
1037
1045
let mut rng = rand:: thread_rng ( ) ;
1038
1046
let socket = repeat_with ( || new_rand_socket ( & mut rng) )
1039
- . filter ( |socket| matches ! ( sanitize_socket( socket) , Ok ( ( ) ) ) )
1047
+ . filter ( |socket| matches ! ( sanitize_socket( socket, SOCKET_TAG_GOSSIP ) , Ok ( ( ) ) ) )
1040
1048
. find ( |socket| socket. port ( ) . checked_add ( 11 ) . is_some ( ) )
1041
1049
. unwrap ( ) ;
1042
1050
let node = ContactInfo :: new_with_socketaddr ( & Keypair :: new ( ) . pubkey ( ) , & socket) ;
@@ -1047,7 +1055,7 @@ mod tests {
1047
1055
fn test_sanitize_quic_offset ( ) {
1048
1056
let mut rng = rand:: thread_rng ( ) ;
1049
1057
let socket = repeat_with ( || new_rand_socket ( & mut rng) )
1050
- . filter ( |socket| matches ! ( sanitize_socket( socket) , Ok ( ( ) ) ) )
1058
+ . filter ( |socket| matches ! ( sanitize_socket( socket, SOCKET_TAG_GOSSIP ) , Ok ( ( ) ) ) )
1051
1059
. find ( |socket| socket. port ( ) . checked_add ( QUIC_PORT_OFFSET ) . is_some ( ) )
1052
1060
. unwrap ( ) ;
1053
1061
let mut other = get_quic_socket ( & socket) . unwrap ( ) ;
@@ -1079,7 +1087,7 @@ mod tests {
1079
1087
rng. gen ( ) , // shred_version
1080
1088
) ;
1081
1089
let socket = repeat_with ( || new_rand_socket ( & mut rng) )
1082
- . filter ( |socket| matches ! ( sanitize_socket( socket) , Ok ( ( ) ) ) )
1090
+ . filter ( |socket| matches ! ( sanitize_socket( socket, SOCKET_TAG_GOSSIP ) , Ok ( ( ) ) ) )
1083
1091
. find ( |socket| socket. port ( ) . checked_add ( QUIC_PORT_OFFSET ) . is_some ( ) )
1084
1092
. unwrap ( ) ;
1085
1093
// TPU socket.
0 commit comments