Skip to content

Commit 15d9656

Browse files
committed
breaking: refactor from service-based advertising to prefixed-based
1 parent c350af0 commit 15d9656

28 files changed

+748
-620
lines changed

core/ipc.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,15 @@ func HandleNylonIPCGet(s *state.State, rw *bufio.ReadWriter) error {
7878
slices.Sort(rt)
7979
sb.WriteString(strings.Join(rt, "\n") + "\n")
8080

81-
// print services
82-
sb.WriteString("\n\nAdvertised Services:\n")
81+
// print advertised prefixes
82+
sb.WriteString("\n\nAdvertised Prefixes:\n")
8383
rt = make([]string, 0)
84-
for sid, adv := range s.Advertised {
85-
prefix := s.GetSvcPrefix(sid)
84+
for prefix, adv := range s.Advertised {
8685
timeRem := adv.Expiry.Sub(time.Now())
8786
if timeRem > time.Hour*24 {
88-
rt = append(rt, fmt.Sprintf(" - %s as %s expires never nh %s", sid, prefix, adv.NodeId))
87+
rt = append(rt, fmt.Sprintf(" - %s expires never nh %s", prefix, adv.NodeId))
8988
} else {
90-
rt = append(rt, fmt.Sprintf(" - %s as %s expires %.2fs nh %s", sid, prefix, timeRem.Seconds(), adv.NodeId))
89+
rt = append(rt, fmt.Sprintf(" - %s expires %.2fs nh %s", prefix, timeRem.Seconds(), adv.NodeId))
9190
}
9291
}
9392
slices.Sort(rt)

core/nylon_passive.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,29 @@ func scanPassivePeers(s *state.State) error {
2424
// If this device switches to another nylon node, that node will start advertising the client, and we will stop holding the route
2525

2626
hasOtherAdvertisers := false
27-
for _, neigh := range s.Neighbours {
28-
for _, route := range neigh.Routes {
29-
if route.ServiceId == state.ServiceId(*nid) && route.NodeId != s.Id && route.FD.Metric != state.INF {
30-
hasOtherAdvertisers = true
31-
break
27+
ncfg := s.GetNode(*nid)
28+
for _, prefix := range ncfg.Prefixes {
29+
for _, neigh := range s.Neighbours {
30+
for _, route := range neigh.Routes {
31+
if route.Prefix == prefix && route.NodeId != s.Id && route.FD.Metric != state.INF {
32+
hasOtherAdvertisers = true
33+
goto foundAdvertiser
34+
}
3235
}
3336
}
3437
}
38+
foundAdvertiser:
3539

3640
// TODO: we could make this expire after a longer period of time, like 24h. However, this would require our passive client to wait for the full route propagation time after 24 hours. (Might cause unexpected interruptions)
3741

3842
recentlyUpdated := time.Now().Sub(peer.LastReceivedPacket()) < state.ClientDeadThreshold
39-
recentlyAdvertised := r.hasRecentlyAdvertised(state.ServiceId(*nid))
40-
41-
if s.IsClient(*nid) && (recentlyUpdated || !hasOtherAdvertisers && recentlyAdvertised) {
43+
if s.IsClient(*nid) {
4244
// we have a passive client
43-
ncfg := s.GetNode(*nid)
44-
45-
for _, newSvc := range ncfg.Services {
46-
r.updatePassiveClient(s, newSvc, *nid, !recentlyUpdated)
45+
for _, newPrefix := range ncfg.Prefixes {
46+
recentlyAdvertised := r.hasRecentlyAdvertised(newPrefix)
47+
if recentlyUpdated || !hasOtherAdvertisers && recentlyAdvertised {
48+
r.updatePassiveClient(s, newPrefix, *nid, !recentlyUpdated)
49+
}
4750
}
4851
}
4952
}

core/nylon_wireguard.go

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -83,36 +83,54 @@ listen_port=%d
8383
// configure system networking
8484

8585
if !s.NoNetConfigure {
86-
// configure self
87-
selfSvc := make(map[state.ServiceId]struct{})
88-
89-
for _, svc := range s.GetRouter(s.Id).Services {
90-
prefix := s.GetSvcPrefix(svc)
91-
selfSvc[svc] = struct{}{}
92-
err = ConfigureAlias(itfName, prefix)
86+
// run pre-up commands
87+
for _, cmd := range s.PreUp {
88+
err = ExecSplit(s.Log, cmd)
9389
if err != nil {
94-
return err
90+
s.Log.Error("failed to run pre-up command", "err", err)
9591
}
9692
}
9793

98-
if len(s.GetRouter(s.Id).Services) == 0 {
99-
return fmt.Errorf("no address configured for self")
94+
for _, addr := range s.GetRouter(s.Id).Addresses {
95+
err := ConfigureAlias(s.Log, itfName, addr)
96+
if err != nil {
97+
s.Log.Error("failed to configure alias", "err", err)
98+
}
10099
}
101100

102-
err = InitInterface(itfName)
101+
err = InitInterface(s.Log, itfName)
103102

104103
if err != nil {
105104
return err
106105
}
107106

108-
// configure services
109-
for svc, prefix := range s.Services {
110-
if _, ok := selfSvc[svc]; ok {
111-
continue
107+
// configure prefixes
108+
include := append(s.GetPrefixes(), s.IncludeIPs...)
109+
if len(s.IncludeIPs) != 0 {
110+
include = s.IncludeIPs
111+
}
112+
for _, inc := range include {
113+
s.Log.Debug("Include Prefix", "prefix", inc.String())
114+
}
115+
for _, excl := range s.ExcludeIPs {
116+
s.Log.Debug("Exclude Prefix", "prefix", excl.String())
117+
}
118+
computed := state.ComputeSplitTunnel(include, s.ExcludeIPs)
119+
for _, pre := range computed {
120+
s.Log.Debug("Computed Prefix", "prefix", pre.String())
121+
}
122+
for _, prefix := range computed {
123+
err := ConfigureRoute(s.Log, n.Tun, itfName, prefix)
124+
if err != nil {
125+
s.Log.Error("failed to configure route", "err", err)
112126
}
113-
err = ConfigureRoute(n.Tun, itfName, prefix)
127+
}
128+
129+
// run post-up commands
130+
for _, cmd := range s.PostUp {
131+
err = ExecSplit(s.Log, cmd)
114132
if err != nil {
115-
return err
133+
s.Log.Error("failed to run post-up command", "err", err)
116134
}
117135
}
118136
}
@@ -125,7 +143,25 @@ listen_port=%d
125143
}
126144

127145
func (n *Nylon) cleanupWireGuard(s *state.State) error {
128-
return CleanupWireGuardDevice(s, n)
146+
// run pre-down commands
147+
for _, cmd := range s.PreUp {
148+
err := ExecSplit(s.Log, cmd)
149+
if err != nil {
150+
s.Log.Error("failed to run pre-down command", "err", err)
151+
}
152+
}
153+
err := CleanupWireGuardDevice(s, n)
154+
if err != nil {
155+
return err
156+
}
157+
// run post-down commands
158+
for _, cmd := range s.PostDown {
159+
err = ExecSplit(s.Log, cmd)
160+
if err != nil {
161+
s.Log.Error("failed to run post-down command", "err", err)
162+
}
163+
}
164+
return nil
129165
}
130166

131167
func UpdateWireGuard(s *state.State) error {

0 commit comments

Comments
 (0)