summaryrefslogtreecommitdiffhomepage
path: root/src/conn_default.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/conn_default.go')
-rw-r--r--src/conn_default.go70
1 files changed, 52 insertions, 18 deletions
diff --git a/src/conn_default.go b/src/conn_default.go
index 34168c6..5b73c90 100644
--- a/src/conn_default.go
+++ b/src/conn_default.go
@@ -25,7 +25,7 @@ var _ Endpoint = (*NativeEndpoint)(nil)
func CreateEndpoint(s string) (Endpoint, error) {
addr, err := parseEndpoint(s)
- return (addr).(*NativeEndpoint), err
+ return (*NativeEndpoint)(addr), err
}
func (_ *NativeEndpoint) ClearSrc() {}
@@ -40,7 +40,7 @@ func (e *NativeEndpoint) SrcIP() net.IP {
func (e *NativeEndpoint) DstToBytes() []byte {
addr := (*net.UDPAddr)(e)
- out := addr.IP.([]byte)
+ out := addr.IP
out = append(out, byte(addr.Port&0xff))
out = append(out, byte((addr.Port>>8)&0xff))
return out
@@ -54,11 +54,11 @@ func (e *NativeEndpoint) SrcToString() string {
return ""
}
-func listenNet(net string, port int) (*net.UDPConn, int, error) {
+func listenNet(network string, port int) (*net.UDPConn, int, error) {
// listen
- conn, err := net.ListenUDP("udp", &UDPAddr{Port: port})
+ conn, err := net.ListenUDP(network, &net.UDPAddr{Port: port})
if err != nil {
return nil, 0, err
}
@@ -66,32 +66,66 @@ func listenNet(net string, port int) (*net.UDPConn, int, error) {
// retrieve port
laddr := conn.LocalAddr()
- uaddr, _ = net.ResolveUDPAddr(
+ uaddr, err := net.ResolveUDPAddr(
laddr.Network(),
laddr.String(),
)
-
+ if err != nil {
+ return nil, 0, err
+ }
return conn, uaddr.Port, nil
}
-func CreateBind(port uint16) (Bind, uint16, error) {
+func CreateBind(uport uint16) (Bind, uint16, error) {
+ var err error
+ var bind NativeBind
- // listen
+ port := int(uport)
- addr := UDPAddr{
- Port: int(port),
+ bind.ipv4, port, err = listenNet("udp4", port)
+ if err != nil {
+ return nil, 0, err
}
- conn, err := net.ListenUDP("udp", &addr)
+
+ bind.ipv6, port, err = listenNet("udp6", port)
if err != nil {
+ bind.ipv4.Close()
return nil, 0, err
}
- // retrieve port
+ return &bind, uint16(port), nil
+}
- laddr := conn.LocalAddr()
- uaddr, _ = net.ResolveUDPAddr(
- laddr.Network(),
- laddr.String(),
- )
- return uaddr.Port
+func (bind *NativeBind) Close() error {
+ err1 := bind.ipv4.Close()
+ err2 := bind.ipv6.Close()
+ if err1 != nil {
+ return err1
+ }
+ return err2
+}
+
+func (bind *NativeBind) ReceiveIPv4(buff []byte) (int, Endpoint, error) {
+ n, endpoint, err := bind.ipv4.ReadFromUDP(buff)
+ return n, (*NativeEndpoint)(endpoint), err
+}
+
+func (bind *NativeBind) ReceiveIPv6(buff []byte) (int, Endpoint, error) {
+ n, endpoint, err := bind.ipv6.ReadFromUDP(buff)
+ return n, (*NativeEndpoint)(endpoint), err
+}
+
+func (bind *NativeBind) Send(buff []byte, endpoint Endpoint) error {
+ var err error
+ nend := endpoint.(*NativeEndpoint)
+ if nend.IP.To16() != nil {
+ _, err = bind.ipv6.WriteToUDP(buff, (*net.UDPAddr)(nend))
+ } else {
+ _, err = bind.ipv4.WriteToUDP(buff, (*net.UDPAddr)(nend))
+ }
+ return err
+}
+
+func (bind *NativeBind) SetMark(_ uint32) error {
+ return nil
}