dissertation-2-code/udp/listener.go

121 lines
2.2 KiB
Go
Raw Normal View History

2020-11-25 19:35:31 +00:00
package udp
import (
2021-03-30 20:57:53 +01:00
"context"
2020-11-25 19:35:31 +00:00
"log"
"mpbl3p/proxy"
"net"
2021-03-31 18:45:41 +01:00
"time"
2020-11-25 19:35:31 +00:00
)
type ComparableUdpAddress struct {
IP [16]byte
Port int
Zone string
}
func fromUdpAddress(address net.UDPAddr) ComparableUdpAddress {
var ip [16]byte
2021-04-15 16:15:24 +01:00
copy(ip[:], address.IP)
2020-11-25 19:35:31 +00:00
return ComparableUdpAddress{
IP: ip,
Port: address.Port,
Zone: address.Zone,
}
}
func NewListener(
ctx context.Context,
p *proxy.Proxy,
local string,
vs []func() proxy.MacVerifier,
gs []func() proxy.MacGenerator,
c func() Congestion,
enableConsumers bool,
enableProducers bool,
) error {
2020-11-25 19:35:31 +00:00
laddr, err := net.ResolveUDPAddr("udp", local)
if err != nil {
return err
}
pconn, err := net.ListenUDP("udp", laddr)
if err != nil {
return err
}
2021-04-15 15:35:46 +01:00
receivedConnections := make(map[ComparableUdpAddress]*InboundFlow)
2020-11-25 19:35:31 +00:00
go func() {
2021-03-31 18:45:41 +01:00
for ctx.Err() == nil {
2020-11-27 17:31:32 +00:00
buf := make([]byte, 6000)
2020-11-25 19:35:31 +00:00
2021-03-31 18:45:41 +01:00
if err := pconn.SetReadDeadline(time.Now().Add(time.Second)); err != nil {
panic(err)
}
2020-11-27 17:31:32 +00:00
n, addr, err := pconn.ReadFromUDP(buf)
2020-11-25 19:35:31 +00:00
if err != nil {
2021-03-31 18:45:41 +01:00
if e, ok := err.(net.Error); ok && e.Timeout() {
continue
}
2020-11-25 19:35:31 +00:00
panic(err)
}
raddr := fromUdpAddress(*addr)
2021-04-15 16:15:24 +01:00
if fi, exists := receivedConnections[raddr]; exists {
2021-03-30 20:57:53 +01:00
log.Println("existing flow. queuing...")
2021-04-15 16:15:24 +01:00
if err := fi.queueDatagram(ctx, buf[:n]); err != nil {
2021-04-15 15:28:50 +01:00
log.Println("error")
continue
2021-03-30 20:57:53 +01:00
}
log.Println("queued")
2020-11-25 19:35:31 +00:00
continue
}
var verifiers = make([]proxy.MacVerifier, len(vs))
for i, v := range vs {
verifiers[i] = v()
}
var generators = make([]proxy.MacGenerator, len(gs))
for i, g := range gs {
generators[i] = g()
}
2020-11-29 22:06:38 +00:00
f := newFlow(c(), verifiers, generators)
2020-11-26 22:10:37 +00:00
f.writer = pconn
2020-11-26 22:46:37 +00:00
f.raddr = addr
2020-11-26 22:10:37 +00:00
f.isAlive = true
2021-05-13 22:48:47 +01:00
fi, err := newInboundFlow(f)
2021-04-15 15:35:46 +01:00
if err != nil {
log.Println(err)
continue
}
2020-11-27 17:31:32 +00:00
log.Printf("received new udp connection: %v\n", f)
2020-11-25 19:35:31 +00:00
2021-04-15 15:35:46 +01:00
go fi.processPackets(ctx)
go fi.earlyUpdateLoop(ctx, 0)
2020-11-25 19:35:31 +00:00
2021-04-15 15:35:46 +01:00
receivedConnections[raddr] = fi
2020-11-25 19:35:31 +00:00
2021-04-09 19:00:35 +01:00
if enableConsumers {
p.AddConsumer(ctx, fi)
2021-04-09 19:00:35 +01:00
}
if enableProducers {
p.AddProducer(ctx, fi)
2021-04-09 19:00:35 +01:00
}
2020-11-27 17:31:32 +00:00
log.Println("handling...")
2021-04-15 16:15:24 +01:00
if err := fi.queueDatagram(ctx, buf[:n]); err != nil {
2021-03-31 18:45:41 +01:00
return
}
2020-11-27 17:31:32 +00:00
log.Println("handled")
2020-11-25 19:35:31 +00:00
}
}()
return nil
}