1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- package vnet
- import (
- "fmt"
- "net"
- )
- // Deliver directly send packet to vnet or real-server.
- // For example, we can use this API to simulate the REPLAY ATTACK.
- func (v *UDPProxy) Deliver(sourceAddr, destAddr net.Addr, b []byte) (nn int, err error) {
- v.workers.Range(func(key, value interface{}) bool {
- if nn, err = value.(*aUDPProxyWorker).Deliver(sourceAddr, destAddr, b); err != nil {
- return false // Fail, abort.
- } else if nn == len(b) {
- return false // Done.
- }
- return true // Deliver by next worker.
- })
- return
- }
- func (v *aUDPProxyWorker) Deliver(sourceAddr, destAddr net.Addr, b []byte) (nn int, err error) {
- addr, ok := sourceAddr.(*net.UDPAddr)
- if !ok {
- return 0, fmt.Errorf("invalid addr %v", sourceAddr) // nolint:goerr113
- }
- // nolint:godox // TODO: Support deliver packet from real server to vnet.
- // If packet is from vnet, proxy to real server.
- var realSocket *net.UDPConn
- if value, ok := v.endpoints.Load(addr.String()); !ok {
- return 0, nil
- } else { // nolint:golint
- realSocket = value.(*net.UDPConn)
- }
- // Send to real server.
- if _, err := realSocket.Write(b); err != nil {
- return 0, err
- }
- return len(b), nil
- }
|