Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 17 additions & 6 deletions cmd/inspect.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,28 @@ var inspectCmd = &cobra.Command{
fmt.Println("Usage: nylon inspect <interface>")
return
}
itf := args[0]
result, err := core.IPCGet(itf)
if err != nil {
fmt.Println("Error:", err.Error())
return
if ok, _ := cmd.Flags().GetBool("trace"); ok {
itf := args[0]
err := core.IPCTrace(itf)
if err != nil {
fmt.Println("Error:", err.Error())
return
}
} else {
itf := args[0]
result, err := core.IPCGet(itf)
if err != nil {
fmt.Println("Error:", err.Error())
return
}
fmt.Print(result)
}
fmt.Print(result)
},
GroupID: "ny",
}

func init() {
rootCmd.AddCommand(inspectCmd)

inspectCmd.Flags().BoolP("trace", "t", false, "Enables live packet routing capture")
}
1 change: 1 addition & 0 deletions core/entrypoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@ func Start(ccfg state.CentralCfg, ncfg state.LocalCfg, logLevel slog.Level, conf

func initModules(s *state.State) error {
var modules []state.NyModule
modules = append(modules, &NylonTrace{})
modules = append(modules, &NylonRouter{})
modules = append(modules, &Nylon{})

Expand Down
62 changes: 62 additions & 0 deletions core/ipc.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package core

import (
"bufio"
"context"
"fmt"
"io"
"slices"
Expand Down Expand Up @@ -41,6 +42,37 @@ func IPCGet(itf string) (string, error) {
return strings.TrimSuffix(res, "\x00"), nil
}

func IPCTrace(itf string) error {
conn, err := ipc.UAPIDial(itf)
if err != nil {
return err
}
defer conn.Close()
rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn))

_, err = rw.WriteString("get=nylon\n")
if err != nil {
return err
}

_, err = rw.WriteString("trace\n")
if err != nil {
return err
}
err = rw.Flush()
if err != nil {
return err
}

for {
str, err := rw.ReadString('\n')
if err != nil {
return err
}
fmt.Print(str)
}
}

func HandleNylonIPCGet(s *state.State, rw *bufio.ReadWriter) error {
cmd, err := rw.ReadString('\n')
if err != nil {
Expand Down Expand Up @@ -139,6 +171,36 @@ func HandleNylonIPCGet(s *state.State, rw *bufio.ReadWriter) error {
return err
}
return rw.Flush()
case "trace\n":
if !state.DBG_trace_tc {
return fmt.Errorf("trace mode is not enabled")
}
ctx, cancel := context.WithCancel(context.Background())
t := Get[*NylonTrace](s)
go func() {
_, _ = rw.ReadByte() // wait for EOF
cancel()
}()
ch := make(chan interface{})
t.Register(ch)
defer t.Unregister(ch)
for {
select {
case <-ctx.Done():
return nil
case msg := <-ch:
if str, ok := msg.(string); ok {
_, err := rw.WriteString(str)
if err != nil {
return err
}
err = rw.Flush()
if err != nil {
return err
}
}
}
}
default:
return fmt.Errorf("unknown command %s", cmd)
}
Expand Down
13 changes: 9 additions & 4 deletions core/nylon_tc.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package core

import (
"fmt"
"net/netip"

"github.com/encodeous/nylon/polyamide/conn"
Expand All @@ -18,6 +19,7 @@ const (

func (n *Nylon) InstallTC(s *state.State) {
r := Get[*NylonRouter](s)
t := Get[*NylonTrace](s)

if state.DBG_trace_tc {
n.Device.InstallFilter(func(dev *device.Device, packet *device.TCElement) (device.TCAction, error) {
Expand All @@ -33,7 +35,7 @@ func (n *Nylon) InstallTC(s *state.State) {
peer != nil &&
src != netip.IPv4Unspecified() && src != netip.IPv6Unspecified() &&
dst != netip.IPv4Unspecified() && dst != netip.IPv6Unspecified() {
dev.Log.Verbosef("Unhandled TC packet: %v -> %v, peer %s", packet.GetSrc(), packet.GetDst(), peer)
t.Submit(fmt.Sprintf("Unhandled TC packet: %v -> %v, peer %s\n", packet.GetSrc(), packet.GetDst(), peer))
}
}
return device.TcPass, nil
Expand All @@ -56,7 +58,7 @@ func (n *Nylon) InstallTC(s *state.State) {
if ok && !packet.Incoming() {
packet.ToPeer = entry.Peer
if state.DBG_trace_tc {
dev.Log.Verbosef("Fwd packet: %v -> %v, via %s", packet.GetSrc(), packet.GetDst(), entry.Nh)
t.Submit(fmt.Sprintf("Fwd packet: %v -> %v, via %s\n", packet.GetSrc(), packet.GetDst(), entry.Nh))
}
return device.TcForward, nil
}
Expand All @@ -69,7 +71,7 @@ func (n *Nylon) InstallTC(s *state.State) {
if ok {
packet.ToPeer = entry.Peer
if state.DBG_trace_tc {
dev.Log.Verbosef("Fwd packet: %v -> %v, via %s", packet.GetSrc(), packet.GetDst(), entry.Nh)
t.Submit(fmt.Sprintf("Fwd packet: %v -> %v, via %s\n", packet.GetSrc(), packet.GetDst(), entry.Nh))
}
return device.TcForward, nil
}
Expand All @@ -87,7 +89,7 @@ func (n *Nylon) InstallTC(s *state.State) {
}
if ttl == 0 {
if state.DBG_trace_tc {
dev.Log.Verbosef("TTL Expired: %v -> %v, via %s", packet.GetSrc(), packet.GetDst())
t.Submit(fmt.Sprintf("TTL Expired: %v -> %v\n", packet.GetSrc(), packet.GetDst()))
}
return device.TcBounce, nil
}
Expand All @@ -103,6 +105,9 @@ func (n *Nylon) InstallTC(s *state.State) {
entry, ok := r.ExitTable.Lookup(packet.GetDst())
// we should only accept packets destined to us, but not our passive clients
if ok && entry.Nh == s.Id {
if state.DBG_trace_tc {
t.Submit(fmt.Sprintf("Exit: %v -> %v\n", packet.GetSrc(), packet.GetDst()))
}
//dev.Log.Verbosef("BounceCur packet: %v -> %v", packet.GetSrc(), packet.GetDst())
return device.TcBounce, nil
}
Expand Down
19 changes: 19 additions & 0 deletions core/nylon_trace.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package core

import (
"github.com/dustin/go-broadcast"
"github.com/encodeous/nylon/state"
)

type NylonTrace struct {
broadcast.Broadcaster
}

func (n *NylonTrace) Init(s *state.State) error {
n.Broadcaster = broadcast.NewBroadcaster(1024)
return nil
}

func (n *NylonTrace) Cleanup(s *state.State) error {
return n.Broadcaster.Close()
}
3 changes: 3 additions & 0 deletions core/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,9 @@ func (r *NylonRouter) BroadcastRequestSeqno(src state.Source, seqno uint16, hopC
}

func (r *NylonRouter) Log(event RouterEvent, desc string, args ...any) {
if event == NoEpToNeighbour {
return // ignored
}
r.Env.Log.Debug(fmt.Sprintf("%s %s", event.String(), desc), args...)
}

Expand Down
Loading