Add more logging

This commit is contained in:
braginini 2022-09-07 19:02:17 +02:00
parent dded91235e
commit 2cffe6526a
2 changed files with 9 additions and 5 deletions

View File

@ -96,7 +96,7 @@ func listenNet(network string, port int) (*net.UDPConn, int, error) {
return conn, uaddr.Port, nil return conn, uaddr.Port, nil
} }
func parseStunMessage(raw []byte) (*stun.Message, error) { func parseSTUNMessage(raw []byte) (*stun.Message, error) {
msg := &stun.Message{ msg := &stun.Message{
Raw: append([]byte{}, raw...), Raw: append([]byte{}, raw...),
} }
@ -126,7 +126,7 @@ func (b *ICEBind) makeReceiveIPv4(c net.PacketConn) conn.ReceiveFunc {
}), nil }), nil
} }
msg, err := parseStunMessage(buff[:n]) msg, err := parseSTUNMessage(buff[:n])
if err != nil { if err != nil {
return 0, nil, err return 0, nil, err
} }

View File

@ -74,12 +74,15 @@ func (m *UDPMuxDefault) Type() string {
func (m *UDPMuxDefault) HandleSTUNMessage(msg *stun.Message, addr net.Addr) error { func (m *UDPMuxDefault) HandleSTUNMessage(msg *stun.Message, addr net.Addr) error {
udpAddr, ok := addr.(*net.UDPAddr) remoteAddr, ok := addr.(*net.UDPAddr)
if !ok { if !ok {
return fmt.Errorf("underlying PacketConn did not return a UDPAddr") return fmt.Errorf("underlying PacketConn did not return a UDPAddr")
} }
// If we have already seen this address dispatch to the appropriate destination // If we have already seen this address dispatch to the appropriate destination
// If you are using the same socket for the Host and SRFLX candidates, it might be that there are more than one
// muxed connection - one for the SRFLX candidate and the other one for the HOST one.
// We will then forward STUN packets to each of these connections.
m.addressMapMu.Lock() m.addressMapMu.Lock()
var destinationConnList []*udpMuxedConn var destinationConnList []*udpMuxedConn
if storedConns, ok := m.addressMap[addr.String()]; ok { if storedConns, ok := m.addressMap[addr.String()]; ok {
@ -92,7 +95,6 @@ func (m *UDPMuxDefault) HandleSTUNMessage(msg *stun.Message, addr net.Addr) erro
// This block is needed to discover Peer Reflexive Candidates for which we don't know the Endpoint upfront. // This block is needed to discover Peer Reflexive Candidates for which we don't know the Endpoint upfront.
// However, we can take a username attribute from the STUN message which contains ufrag. // However, we can take a username attribute from the STUN message which contains ufrag.
// We can use ufrag to identify the destination conn to route packet to. // We can use ufrag to identify the destination conn to route packet to.
attr, stunAttrErr := msg.Get(stun.AttrUsername) attr, stunAttrErr := msg.Get(stun.AttrUsername)
if stunAttrErr == nil { if stunAttrErr == nil {
ufrag := strings.Split(string(attr), ":")[0] ufrag := strings.Split(string(attr), ":")[0]
@ -113,8 +115,10 @@ func (m *UDPMuxDefault) HandleSTUNMessage(msg *stun.Message, addr net.Addr) erro
m.mu.Unlock() m.mu.Unlock()
} }
// Forward STUN packets to each destination connections even thought the STUN packet might not belong there.
// It will be discarded by the further ICE candidate logic if so.
for _, conn := range destinationConnList { for _, conn := range destinationConnList {
if err := conn.writePacket(msg.Raw, udpAddr); err != nil { if err := conn.writePacket(msg.Raw, remoteAddr); err != nil {
log.Errorf("could not write packet: %v", err) log.Errorf("could not write packet: %v", err)
} }
} }