forked from extern/smegmesh
Fixing an issue where packets are dropped each time
we change wg configuration
This commit is contained in:
parent
a1caf2e8ae
commit
e63edea763
2
go.mod
2
go.mod
@ -6,6 +6,7 @@ require (
|
||||
github.com/akamensky/argparse v1.4.0
|
||||
github.com/automerge/automerge-go v0.0.0-20230903201930-b80ce8aadbb9
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/jmespath/go-jmespath v0.4.0
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6
|
||||
google.golang.org/grpc v1.58.1
|
||||
@ -16,7 +17,6 @@ require (
|
||||
require (
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/google/go-cmp v0.5.9 // indirect
|
||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||
github.com/josharian/native v1.1.0 // indirect
|
||||
github.com/mdlayher/genetlink v1.3.2 // indirect
|
||||
github.com/mdlayher/netlink v1.7.2 // indirect
|
||||
|
@ -1,9 +1,5 @@
|
||||
package lib
|
||||
|
||||
import (
|
||||
logging "github.com/tim-beatham/wgmesh/pkg/log"
|
||||
)
|
||||
|
||||
// MapToSlice converts a map to a slice in go
|
||||
func MapValues[K comparable, V any](m map[K]V) []V {
|
||||
return MapValuesWithExclude(m, map[K]struct{}{})
|
||||
@ -23,8 +19,6 @@ func MapValuesWithExclude[K comparable, V any](m map[K]V, exclude map[K]struct{}
|
||||
continue
|
||||
}
|
||||
|
||||
logging.Log.WriteInfof("Key %s", k)
|
||||
|
||||
values[i] = v
|
||||
i++
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ type WgMeshConfigApplyer struct {
|
||||
meshManager *MeshManager
|
||||
}
|
||||
|
||||
func ConvertMeshNode(node MeshNode) (*wgtypes.PeerConfig, error) {
|
||||
func convertMeshNode(node MeshNode) (*wgtypes.PeerConfig, error) {
|
||||
endpoint, err := net.ResolveUDPAddr("udp", node.GetWgEndpoint())
|
||||
|
||||
if err != nil {
|
||||
@ -59,7 +59,7 @@ func (m *WgMeshConfigApplyer) updateWgConf(mesh MeshProvider) error {
|
||||
var count int = 0
|
||||
|
||||
for _, n := range nodes {
|
||||
peer, err := ConvertMeshNode(n)
|
||||
peer, err := convertMeshNode(n)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
@ -70,8 +70,7 @@ func (m *WgMeshConfigApplyer) updateWgConf(mesh MeshProvider) error {
|
||||
}
|
||||
|
||||
cfg := wgtypes.Config{
|
||||
Peers: peerConfigs,
|
||||
ReplacePeers: true,
|
||||
Peers: peerConfigs,
|
||||
}
|
||||
|
||||
dev, err := mesh.GetDevice()
|
||||
|
@ -218,6 +218,10 @@ func (s *MeshManager) GetSelf(meshId string) (MeshNode, error) {
|
||||
return node, nil
|
||||
}
|
||||
|
||||
func (s *MeshManager) ApplyConfig() error {
|
||||
return s.configApplyer.ApplyConfig()
|
||||
}
|
||||
|
||||
// UpdateTimeStamp updates the timestamp of this node in all meshes
|
||||
func (s *MeshManager) UpdateTimeStamp() error {
|
||||
for _, mesh := range s.Meshes {
|
||||
|
@ -21,13 +21,18 @@ type SyncerImpl struct {
|
||||
manager *mesh.MeshManager
|
||||
requester SyncRequester
|
||||
authenticatedNodes []crdt.MeshNodeCrdt
|
||||
infectionCount int
|
||||
}
|
||||
|
||||
const subSetLength = 3
|
||||
const infectionCount = 3
|
||||
|
||||
// Sync: Sync random nodes
|
||||
func (s *SyncerImpl) Sync(meshId string) error {
|
||||
if !s.manager.HasChanges(meshId) {
|
||||
logging.Log.WriteInfof("UPDATING WG CONF")
|
||||
s.manager.ApplyConfig()
|
||||
|
||||
if !s.manager.HasChanges(meshId) && s.infectionCount == 0 {
|
||||
logging.Log.WriteInfof("No changes for %s", meshId)
|
||||
return nil
|
||||
}
|
||||
@ -76,6 +81,9 @@ func (s *SyncerImpl) Sync(meshId string) error {
|
||||
waitGroup.Wait()
|
||||
|
||||
logging.Log.WriteInfof("SYNC TIME: %v", time.Now().Sub(before))
|
||||
|
||||
s.infectionCount = ((infectionCount + s.infectionCount - 1) % infectionCount)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -93,5 +101,5 @@ func (s *SyncerImpl) SyncMeshes() error {
|
||||
}
|
||||
|
||||
func NewSyncer(m *mesh.MeshManager, r SyncRequester) Syncer {
|
||||
return &SyncerImpl{manager: m, requester: r}
|
||||
return &SyncerImpl{manager: m, requester: r, infectionCount: 0}
|
||||
}
|
||||
|
13
pkg/wg/wg.go
13
pkg/wg/wg.go
@ -1,6 +1,7 @@
|
||||
package wg
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
"os/exec"
|
||||
@ -75,19 +76,29 @@ func flushInterface(ifName string) error {
|
||||
// EnableInterface flushes the interface and sets the ip address of the
|
||||
// interface
|
||||
func (m *WgInterfaceManipulatorImpl) EnableInterface(ifName string, ip string) error {
|
||||
if len(ifName) == 0 {
|
||||
return errors.New("ifName not provided")
|
||||
}
|
||||
|
||||
err := flushInterface(ifName)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cmd := exec.Command("/usr/bin/ip", "link", "set", "up", "dev", ifName)
|
||||
|
||||
if err := cmd.Run(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
hostIp, _, err := net.ParseCIDR(ip)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cmd := exec.Command("/usr/bin/ip", "addr", "add", hostIp.String()+"/64", "dev", ifName)
|
||||
cmd = exec.Command("/usr/bin/ip", "addr", "add", hostIp.String()+"/64", "dev", ifName)
|
||||
|
||||
if err := cmd.Run(); err != nil {
|
||||
return err
|
||||
|
Loading…
Reference in New Issue
Block a user