MCPcopy Index your code
hub / github.com/tailscale/tailscale / acceptUDP

Method acceptUDP

wgengine/netstack/netstack.go:1909–1964  ·  view source on GitHub ↗
(r *udp.ForwarderRequest)

Source from the content-addressed store, hash-verified

1907}
1908
1909func (ns *Impl) acceptUDP(r *udp.ForwarderRequest) {
1910 sess := r.ID()
1911 if debugNetstack() {
1912 ns.logf("[v2] UDP ForwarderRequest: %v", stringifyTEI(sess))
1913 }
1914 var wq waiter.Queue
1915 ep, err := r.CreateEndpoint(&wq)
1916 if err != nil {
1917 ns.logf("acceptUDP: could not create endpoint: %v", err)
1918 return
1919 }
1920 dstAddr, ok := ipPortOfNetstackAddr(sess.LocalAddress, sess.LocalPort)
1921 if !ok {
1922 ep.Close()
1923 return
1924 }
1925 srcAddr, ok := ipPortOfNetstackAddr(sess.RemoteAddress, sess.RemotePort)
1926 if !ok {
1927 ep.Close()
1928 return
1929 }
1930
1931 // Handle magicDNS and loopback traffic (via UDP) here.
1932 if dst := dstAddr.Addr(); dst == serviceIP || dst == serviceIPv6 {
1933 switch {
1934 case dstAddr.Port() == 53:
1935 c := gonet.NewUDPConn(&wq, ep)
1936 go ns.handleMagicDNSUDP(srcAddr, c)
1937 return
1938 case ns.isLoopbackPort(dstAddr.Port()):
1939 if dst == serviceIPv6 {
1940 dstAddr = netip.AddrPortFrom(ipv6Loopback, dstAddr.Port())
1941 } else {
1942 dstAddr = netip.AddrPortFrom(ipv4Loopback, dstAddr.Port())
1943 }
1944 default:
1945 ep.Close()
1946 return // Only MagicDNS and loopback traffic runs on the service IPs for now.
1947 }
1948 }
1949
1950 if get := ns.GetUDPHandlerForFlow; get != nil {
1951 h, intercept := get(srcAddr, dstAddr)
1952 if intercept {
1953 if h == nil {
1954 ep.Close()
1955 return
1956 }
1957 go h(gonet.NewUDPConn(&wq, ep))
1958 return
1959 }
1960 }
1961
1962 c := gonet.NewUDPConn(&wq, ep)
1963 go ns.forwardUDP(c, srcAddr, dstAddr)
1964}
1965
1966// Buffer pool for forwarding UDP packets. Implementations are advised not to

Callers 1

acceptUDPNoICMPMethod · 0.95

Calls 11

handleMagicDNSUDPMethod · 0.95
isLoopbackPortMethod · 0.95
forwardUDPMethod · 0.95
ipPortOfNetstackAddrFunction · 0.85
stringifyTEIFunction · 0.70
CloseMethod · 0.65
getFunction · 0.50
IDMethod · 0.45
logfMethod · 0.45
AddrMethod · 0.45
PortMethod · 0.45

Tested by

no test coverage detected