@@ -172,15 +172,9 @@ func (t *NativeTun) Start() error {
172
172
if err != nil {
173
173
return err
174
174
}
175
- for _ , routeRange := range routeRanges {
176
- if routeRange .Addr ().Is4 () {
177
- err = luid .AddRoute (routeRange , gateway4 , 0 )
178
- } else {
179
- err = luid .AddRoute (routeRange , gateway6 , 0 )
180
- }
181
- if err != nil {
182
- return err
183
- }
175
+ err = addRouteList (luid , routeRanges , gateway4 , gateway6 , 0 )
176
+ if err != nil {
177
+ return err
184
178
}
185
179
err = windnsapi .FlushResolverCache ()
186
180
if err != nil {
@@ -560,20 +554,45 @@ func (t *NativeTun) UpdateRouteOptions(tunOptions Options) error {
560
554
if err != nil {
561
555
return err
562
556
}
563
- for _ , routeRange := range routeRanges {
564
- if routeRange .Addr ().Is4 () {
565
- err = luid .AddRoute (routeRange , gateway4 , 0 )
557
+ err = addRouteList (luid , routeRanges , gateway4 , gateway6 , 0 )
558
+ if err != nil {
559
+ return err
560
+ }
561
+ err = windnsapi .FlushResolverCache ()
562
+ if err != nil {
563
+ return err
564
+ }
565
+ return nil
566
+ }
567
+
568
+ func addRouteList (luid winipcfg.LUID , destinations []netip.Prefix , gateway4 netip.Addr , gateway6 netip.Addr , metric uint32 ) error {
569
+ row := winipcfg.MibIPforwardRow2 {}
570
+ row .Init ()
571
+ row .InterfaceLUID = luid
572
+ row .Metric = metric
573
+ nextHop4 := row .NextHop
574
+ nextHop6 := row .NextHop
575
+ if gateway4 .IsValid () {
576
+ nextHop4 .SetAddr (gateway4 )
577
+ }
578
+ if gateway6 .IsValid () {
579
+ nextHop6 .SetAddr (gateway6 )
580
+ }
581
+ for _ , destination := range destinations {
582
+ err := row .DestinationPrefix .SetPrefix (destination )
583
+ if err != nil {
584
+ return err
585
+ }
586
+ if destination .Addr ().Is4 () {
587
+ row .NextHop = nextHop4
566
588
} else {
567
- err = luid . AddRoute ( routeRange , gateway6 , 0 )
589
+ row . NextHop = nextHop6
568
590
}
591
+ err = row .Create ()
569
592
if err != nil {
570
593
return err
571
594
}
572
595
}
573
- err = windnsapi .FlushResolverCache ()
574
- if err != nil {
575
- return err
576
- }
577
596
return nil
578
597
}
579
598
0 commit comments