From e97a3f88aa573526670bae2f71263b6d86b043ff Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 2 Apr 2015 09:46:29 +0100 Subject: [PATCH] allow router to be started w/o capture/inject interface useful for testing of the control plane --- router/router.go | 23 ++++++++++++++++------- weaver/main.go | 17 +++++++++-------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/router/router.go b/router/router.go index 9dc0e7c8..975c06a4 100644 --- a/router/router.go +++ b/router/router.go @@ -73,17 +73,24 @@ func NewRouter(iface *net.Interface, name PeerName, nickName string, password [] func (router *Router) Start() { // we need two pcap handles since they aren't thread-safe - pio, err := NewPcapIO(router.Iface.Name, router.BufSz) - checkFatal(err) - po, err := NewPcapO(router.Iface.Name) - checkFatal(err) + var pio PacketSourceSink + var po PacketSink + var err error + if router.Iface != nil { + pio, err = NewPcapIO(router.Iface.Name, router.BufSz) + checkFatal(err) + po, err = NewPcapO(router.Iface.Name) + checkFatal(err) + } router.Ourself.Start() router.Macs.Start() router.Routes.Start() router.ConnectionMaker.Start() router.UDPListener = router.listenUDP(Port, po) router.listenTCP(Port) - router.sniff(pio) + if pio != nil { + router.sniff(pio) + } } func (router *Router) UsingPassword() bool { @@ -310,8 +317,10 @@ func (router *Router) handleUDPPacketFunc(dec *EthernetDecoder, sender *net.UDPA if router.Macs.Enter(srcMac, srcPeer) { log.Println("Discovered remote MAC", srcMac, "at", srcPeer.FullName()) } - router.LogFrame("Injecting", frame, &dec.eth) - checkWarn(po.WritePacket(frame)) + if po != nil { + router.LogFrame("Injecting", frame, &dec.eth) + checkWarn(po.WritePacket(frame)) + } dstPeer, found = router.Macs.Lookup(dstMac) if !found || dstPeer != router.Ourself.Peer { diff --git a/weaver/main.go b/weaver/main.go index fb5b5956..b8ced44b 100644 --- a/weaver/main.go +++ b/weaver/main.go @@ -49,7 +49,7 @@ func main() { ) flag.BoolVar(&justVersion, "version", false, "print version and exit") - flag.StringVar(&ifaceName, "iface", "", "name of interface to read from") + flag.StringVar(&ifaceName, "iface", "", "name of interface to capture/inject from (disabled if left blank)") flag.StringVar(&routerName, "name", "", "name of router (defaults to MAC)") flag.StringVar(&nickName, "nickname", "", "nickname of peer (defaults to hostname)") flag.StringVar(&password, "password", "", "network password") @@ -77,13 +77,14 @@ func main() { log.Println("Command line options:", options) log.Println("Command line peers:", peers) - if ifaceName == "" { - fmt.Println("Missing required parameter 'iface'") - os.Exit(1) - } - iface, err := weavenet.EnsureInterface(ifaceName, wait) - if err != nil { - log.Fatal(err) + var err error + + var iface *net.Interface + if ifaceName != "" { + iface, err = weavenet.EnsureInterface(ifaceName, wait) + if err != nil { + log.Fatal(err) + } } if routerName == "" {