@@ -460,6 +460,10 @@ static __init struct wg_peer *init_peer(void)
460460 wg_allowedips_insert_v##version(&t, ip##version(ipa, ipb, ipc, ipd), \
461461 cidr, mem, &mutex)
462462
463+ #define remove (version , mem , ipa , ipb , ipc , ipd , cidr ) \
464+ wg_allowedips_remove_v##version(&t, ip##version(ipa, ipb, ipc, ipd), \
465+ cidr, mem, &mutex)
466+
463467#define maybe_fail () do { \
464468 ++i; \
465469 if (!_s) { \
@@ -585,6 +589,50 @@ bool __init wg_allowedips_selftest(void)
585589 test_negative (4 , a , 192 , 0 , 0 , 0 );
586590 test_negative (4 , a , 255 , 0 , 0 , 0 );
587591
592+ insert (4 , a , 1 , 0 , 0 , 0 , 32 );
593+ insert (4 , a , 192 , 0 , 0 , 0 , 24 );
594+ insert (6 , a , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef , 128 );
595+ insert (6 , a , 0x24446800 , 0xf0e40800 , 0xeeaebeef , 0 , 98 );
596+ test (4 , a , 1 , 0 , 0 , 0 );
597+ test (4 , a , 192 , 0 , 0 , 1 );
598+ test (6 , a , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef );
599+ test (6 , a , 0x24446800 , 0xf0e40800 , 0xeeaebeef , 0x10101010 );
600+ /* Must be an exact match to remove */
601+ remove (4 , a , 192 , 0 , 0 , 0 , 32 );
602+ test (4 , a , 192 , 0 , 0 , 1 );
603+ /* NULL peer should have no effect and return 0 */
604+ test_boolean (!remove (4 , NULL , 192 , 0 , 0 , 0 , 24 ));
605+ test (4 , a , 192 , 0 , 0 , 1 );
606+ /* different peer should have no effect and return 0 */
607+ test_boolean (!remove (4 , b , 192 , 0 , 0 , 0 , 24 ));
608+ test (4 , a , 192 , 0 , 0 , 1 );
609+ /* invalid CIDR should have no effect and return -EINVAL */
610+ test_boolean (remove (4 , b , 192 , 0 , 0 , 0 , 33 ) == - EINVAL );
611+ test (4 , a , 192 , 0 , 0 , 1 );
612+ remove (4 , a , 192 , 0 , 0 , 0 , 24 );
613+ test_negative (4 , a , 192 , 0 , 0 , 1 );
614+ remove (4 , a , 1 , 0 , 0 , 0 , 32 );
615+ test_negative (4 , a , 1 , 0 , 0 , 0 );
616+ /* Must be an exact match to remove */
617+ remove (6 , a , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef , 96 );
618+ test (6 , a , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef );
619+ /* NULL peer should have no effect and return 0 */
620+ test_boolean (!remove (6 , NULL , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef , 128 ));
621+ test (6 , a , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef );
622+ /* different peer should have no effect and return 0 */
623+ test_boolean (!remove (6 , b , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef , 128 ));
624+ test (6 , a , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef );
625+ /* invalid CIDR should have no effect and return -EINVAL */
626+ test_boolean (remove (6 , a , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef , 129 ) == - EINVAL );
627+ test (6 , a , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef );
628+ remove (6 , a , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef , 128 );
629+ test_negative (6 , a , 0x24446801 , 0x40e40800 , 0xdeaebeef , 0xdefbeef );
630+ /* Must match the peer to remove */
631+ remove (6 , b , 0x24446800 , 0xf0e40800 , 0xeeaebeef , 0 , 98 );
632+ test (6 , a , 0x24446800 , 0xf0e40800 , 0xeeaebeef , 0x10101010 );
633+ remove (6 , a , 0x24446800 , 0xf0e40800 , 0xeeaebeef , 0 , 98 );
634+ test_negative (6 , a , 0x24446800 , 0xf0e40800 , 0xeeaebeef , 0x10101010 );
635+
588636 wg_allowedips_free (& t , & mutex );
589637 wg_allowedips_init (& t );
590638 insert (4 , a , 192 , 168 , 0 , 0 , 16 );
0 commit comments