router

package
v0.0.0-...-8ce8f52 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 4, 2024 License: Apache-2.0 Imports: 27 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AARPMachine

type AARPMachine struct {
	// contains filtered or unexported fields
}

AARPMachine maintains both an Address Mapping Table and handles AARP packets (sending and receiving requests, responses, and probes). This process assumes a particular network range rather than using the startup range, since this program is a seed router.

func NewAARPMachine

func NewAARPMachine(cfg *Config, pcapHandle *pcap.Handle, myHWAddr ethernet.Addr) *AARPMachine

NewAARPMachine creates a new AARPMachine.

func (*AARPMachine) Address

func (a *AARPMachine) Address() (aarp.AddrPair, bool)

Address returns the address of this node, and reports if the address is valid (i.e. not tentative).

func (*AARPMachine) Assigned

func (a *AARPMachine) Assigned() <-chan struct{}

Assigned returns a channel that is closed when the local address is valid.

func (AARPMachine) Dump

func (t AARPMachine) Dump() map[ddp.Addr]AMTEntry

Dump returns a copy of the table at a point in time.

func (*AARPMachine) Handle

func (a *AARPMachine) Handle(ctx context.Context, pkt *ethertalk.Packet)

Handle handles a packet.

func (AARPMachine) Learn

func (t AARPMachine) Learn(ddpAddr ddp.Addr, hwAddr ethernet.Addr)

Learn adds or updates an AMT entry.

func (*AARPMachine) Resolve

func (a *AARPMachine) Resolve(ctx context.Context, ddpAddr ddp.Addr) (ethernet.Addr, error)

Resolve resolves an AppleTalk node address to an Ethernet address. If the address is in the cache (AMT) and is still valid, that is used. Otherwise, the address is resolved using AARP.

func (*AARPMachine) Run

func (a *AARPMachine) Run(ctx context.Context) error

Run executes the machine.

type AMTEntry

type AMTEntry struct {
	// The hardware address that the entry maps to.
	HWAddr ethernet.Addr

	// The last time this entry was updated.
	LastUpdated time.Time

	// Whether the address is being resolved.
	Resolving bool
	// contains filtered or unexported fields
}

AMTEntry is an entry in an address mapping table.

func (AMTEntry) LastUpdatedAgo

func (e AMTEntry) LastUpdatedAgo() string

LastUpdatedAgo is a friendly string reporting how long ago the entry was updated/resolved.

func (AMTEntry) Valid

func (e AMTEntry) Valid() bool

Valid reports if the entry is valid.

type AURPPeer

type AURPPeer struct {
	// Whole router config.
	Config *Config

	// AURP-Tr state for producing packets.
	Transport *aurp.Transport

	// Connection to reply to packets on.
	UDPConn *net.UDPConn

	// The string that appeared in the config file / peer list file (with a
	// ":387" appended as necessary).
	// May be empty if this peer was not configured (it connected to us).
	ConfiguredAddr string

	// The resolved address of the peer.
	RemoteAddr *net.UDPAddr

	// Incoming packet channel.
	ReceiveCh chan aurp.Packet

	// Routing table (the peer will add/remove/update routes)
	RoutingTable *RouteTable

	// Zone table (the peer will add/remove/update zones)
	ZoneTable *ZoneTable
	// contains filtered or unexported fields
}

AURPPeer handles the peering with a peer AURP router.

func (*AURPPeer) Forward

func (p *AURPPeer) Forward(ddpkt *ddp.ExtPacket) error

func (*AURPPeer) Handle

func (p *AURPPeer) Handle(ctx context.Context) error

func (*AURPPeer) ReceiverState

func (p *AURPPeer) ReceiverState() ReceiverState

func (*AURPPeer) Send

func (p *AURPPeer) Send(pkt aurp.Packet) (int, error)

Send encodes and sends pkt to the remote host.

func (*AURPPeer) SenderState

func (p *AURPPeer) SenderState() SenderState

type Config

type Config struct {
	// Optional: default is 387.
	ListenPort uint16 `yaml:"listen_port"`

	// Sets the Domain Identifier used by this router.
	// Note: this does not "bind" the IP side of the router to a particular
	// interface; it will listen on all interfaces with IP addresses.
	// Optional: defaults to the first global unicast address on any local
	// network interface.
	LocalIP string `yaml:"local_ip"`

	// Required for routing a local EtherTalk network.
	EtherTalk struct {
		EthAddr  string      `yaml:"ethernet_addr"`
		Device   string      `yaml:"device"`
		ZoneName string      `yaml:"zone_name"`
		NetStart ddp.Network `yaml:"net_start"`
		NetEnd   ddp.Network `yaml:"net_end"`
	} `yaml:"ethertalk"`

	// Allow routers other than those listed under peers?
	OpenPeering bool `yaml:"open_peering"`

	// List of peer routers.
	Peers []string `yaml:"peers"`

	// Or a URL to fetch a list of peers from.
	PeerListURL string `yaml:"peerlist_url"`
}

func LoadConfig

func LoadConfig(cfgPath string) (*Config, error)

type EtherTalkPeer

type EtherTalkPeer struct {
	Port     *EtherTalkPort
	PeerAddr ddp.Addr
}

EtherTalkPeer holds data needed to forward packets to another router on the EtherTalk network.

func (*EtherTalkPeer) Forward

func (p *EtherTalkPeer) Forward(ctx context.Context, pkt *ddp.ExtPacket) error

Forward forwards a DDP packet to the next router.

type EtherTalkPort

type EtherTalkPort struct {
	Device          string
	EthernetAddr    ethernet.Addr
	NetStart        ddp.Network
	NetEnd          ddp.Network
	MyAddr          ddp.Addr
	DefaultZoneName string
	AvailableZones  []string
	PcapHandle      *pcap.Handle
	AARPMachine     *AARPMachine
	Router          *Router
}

EtherTalkPort is all the data and helpers needed for EtherTalk on one port.

func (*EtherTalkPort) Broadcast

func (port *EtherTalkPort) Broadcast(pkt *ddp.ExtPacket) error

func (*EtherTalkPort) HandleNBP

func (port *EtherTalkPort) HandleNBP(ctx context.Context, ddpkt *ddp.ExtPacket) error

func (*EtherTalkPort) HandleRTMP

func (port *EtherTalkPort) HandleRTMP(ctx context.Context, pkt *ddp.ExtPacket) error

RTMPMachine implements RTMP on an AppleTalk network attached to the router.

func (*EtherTalkPort) HandleZIP

func (port *EtherTalkPort) HandleZIP(ctx context.Context, ddpkt *ddp.ExtPacket) error

func (*EtherTalkPort) RunRTMP

func (port *EtherTalkPort) RunRTMP(ctx context.Context) (err error)

RunRTMP makes periodic RTMP Data broadcasts on this port.

func (*EtherTalkPort) Send

func (port *EtherTalkPort) Send(ctx context.Context, pkt *ddp.ExtPacket) error

func (*EtherTalkPort) Serve

func (port *EtherTalkPort) Serve(ctx context.Context)

func (*EtherTalkPort) ZoneMulticast

func (port *EtherTalkPort) ZoneMulticast(zone string, pkt *ddp.ExtPacket) error

type ReceiverState

type ReceiverState int
const (
	ReceiverUnconnected ReceiverState = iota
	ReceiverConnected
	ReceiverWaitForOpenRsp
	ReceiverWaitForRIRsp
	ReceiverWaitForTickleAck
)

func (ReceiverState) String

func (rs ReceiverState) String() string

type Route

type Route struct {
	Extended bool
	NetStart ddp.Network
	NetEnd   ddp.Network
	Distance uint8

	LastSeen time.Time

	// Exactly one of the following should be set
	AURPPeer        *AURPPeer      // Next hop is this peer router (over AURP)
	EtherTalkPeer   *EtherTalkPeer // Next hop is this peer router (over EtherTalk)
	EtherTalkDirect *EtherTalkPort // Directly connected to this network (via EtherTalk)
}

func (Route) LastSeenAgo

func (r Route) LastSeenAgo() string

type RouteTable

type RouteTable struct {
	// contains filtered or unexported fields
}

func NewRouteTable

func NewRouteTable() *RouteTable

func (*RouteTable) DeleteAURPPeer

func (rt *RouteTable) DeleteAURPPeer(peer *AURPPeer)

func (*RouteTable) DeleteAURPPeerNetwork

func (rt *RouteTable) DeleteAURPPeerNetwork(peer *AURPPeer, network ddp.Network)

func (*RouteTable) Dump

func (rt *RouteTable) Dump() []Route

func (*RouteTable) InsertAURPRoute

func (rt *RouteTable) InsertAURPRoute(peer *AURPPeer, extended bool, netStart, netEnd ddp.Network, metric uint8) error

func (*RouteTable) InsertEtherTalkDirect

func (rt *RouteTable) InsertEtherTalkDirect(port *EtherTalkPort)

func (*RouteTable) LookupRoute

func (rt *RouteTable) LookupRoute(network ddp.Network) *Route

func (*RouteTable) UpdateAURPRouteDistance

func (rt *RouteTable) UpdateAURPRouteDistance(peer *AURPPeer, network ddp.Network, distance uint8)

func (*RouteTable) UpsertEtherTalkRoute

func (rt *RouteTable) UpsertEtherTalkRoute(peer *EtherTalkPeer, extended bool, netStart, netEnd ddp.Network, metric uint8) error

func (*RouteTable) ValidRoutes

func (rt *RouteTable) ValidRoutes() []*Route

type Router

type Router struct {
	Config     *Config
	RouteTable *RouteTable
	ZoneTable  *ZoneTable
	Ports      []*EtherTalkPort
}

func (*Router) Forward

func (rtr *Router) Forward(ctx context.Context, ddpkt *ddp.ExtPacket) error

Forward increments the hop count, then outputs the packet in the direction of the destination.

func (*Router) HandleAEP

func (rtr *Router) HandleAEP(ctx context.Context, ddpkt *ddp.ExtPacket) error

func (*Router) HandleNBPFromAURP

func (rtr *Router) HandleNBPFromAURP(ctx context.Context, ddpkt *ddp.ExtPacket) error

func (*Router) Output

func (rtr *Router) Output(ctx context.Context, ddpkt *ddp.ExtPacket) error

Output outputs the packet in the direction of the destination. (It does not check or adjust the hop count.)

type SenderState

type SenderState int
const (
	SenderUnconnected SenderState = iota
	SenderConnected
	SenderWaitForRIRspAck
	SenderWaitForRIUpdAck
	SenderWaitForRDAck
)

func (SenderState) String

func (ss SenderState) String() string

type Zone

type Zone struct {
	Network   ddp.Network
	Name      string
	LocalPort *EtherTalkPort // nil if remote (local to another router)
	LastSeen  time.Time
}

func (Zone) LastSeenAgo

func (z Zone) LastSeenAgo() string

type ZoneTable

type ZoneTable struct {
	// contains filtered or unexported fields
}

func NewZoneTable

func NewZoneTable() *ZoneTable

func (*ZoneTable) AllNames

func (zt *ZoneTable) AllNames() []string

func (*ZoneTable) Dump

func (zt *ZoneTable) Dump() []Zone

func (*ZoneTable) LookupName

func (zt *ZoneTable) LookupName(name string) []*Zone

func (*ZoneTable) Query

func (zt *ZoneTable) Query(ns []ddp.Network) map[ddp.Network][]string

func (*ZoneTable) Upsert

func (zt *ZoneTable) Upsert(network ddp.Network, name string, localPort *EtherTalkPort)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL