2014-07-08 12:20:10 +00:00
|
|
|
// Copyright 2011 Miek Gieben. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
2014-07-07 15:16:42 +00:00
|
|
|
package dns
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
2014-07-08 12:18:33 +00:00
|
|
|
"syscall"
|
2014-07-07 15:16:42 +00:00
|
|
|
)
|
|
|
|
|
2014-07-09 20:02:21 +00:00
|
|
|
type sessionUDP struct {
|
2014-07-07 15:16:42 +00:00
|
|
|
raddr *net.UDPAddr
|
|
|
|
context []byte
|
|
|
|
}
|
|
|
|
|
2014-07-09 20:02:21 +00:00
|
|
|
func (s *sessionUDP) RemoteAddr() net.Addr { return s.raddr }
|
2014-07-07 15:16:42 +00:00
|
|
|
|
2014-07-09 20:02:21 +00:00
|
|
|
// setUDPSocketOptions sets the UDP socket options.
|
|
|
|
// This function is implemented on a per platform basis. See udp_*.go for more details
|
|
|
|
func setUDPSocketOptions(conn *net.UDPConn) error {
|
2014-07-11 08:47:49 +00:00
|
|
|
sa, err := getUDPSocketName(conn)
|
2014-07-08 12:18:33 +00:00
|
|
|
if err != nil {
|
2014-07-09 20:02:21 +00:00
|
|
|
return err
|
2014-07-08 12:18:33 +00:00
|
|
|
}
|
|
|
|
switch sa.(type) {
|
|
|
|
case *syscall.SockaddrInet6:
|
2014-07-11 08:47:49 +00:00
|
|
|
v6only, err := getUDPSocketOptions6Only(conn)
|
2014-07-08 12:18:33 +00:00
|
|
|
if err != nil {
|
2014-07-09 20:02:21 +00:00
|
|
|
return err
|
2014-07-08 12:18:33 +00:00
|
|
|
}
|
2014-07-09 20:02:21 +00:00
|
|
|
setUDPSocketOptions6(conn)
|
2014-07-11 07:13:05 +00:00
|
|
|
if !v6only {
|
2014-07-09 20:02:21 +00:00
|
|
|
setUDPSocketOptions4(conn)
|
2014-07-08 12:18:33 +00:00
|
|
|
}
|
|
|
|
case *syscall.SockaddrInet4:
|
2014-07-09 20:02:21 +00:00
|
|
|
setUDPSocketOptions4(conn)
|
2014-07-09 19:07:23 +00:00
|
|
|
}
|
2014-07-09 20:02:21 +00:00
|
|
|
return nil
|
2014-07-09 19:07:23 +00:00
|
|
|
}
|