(r *udp.ForwarderRequest)
| 1907 | } |
| 1908 | |
| 1909 | func (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 |
no test coverage detected