(uport uint16)
| 143 | } |
| 144 | |
| 145 | func (s *StdNetBind) Open(uport uint16) ([]ReceiveFunc, uint16, error) { |
| 146 | s.mu.Lock() |
| 147 | defer s.mu.Unlock() |
| 148 | |
| 149 | var err error |
| 150 | var tries int |
| 151 | |
| 152 | if s.ipv4 != nil || s.ipv6 != nil { |
| 153 | return nil, 0, ErrBindAlreadyOpen |
| 154 | } |
| 155 | |
| 156 | // Attempt to open ipv4 and ipv6 listeners on the same port. |
| 157 | // If uport is 0, we can retry on failure. |
| 158 | again: |
| 159 | port := int(uport) |
| 160 | var v4conn, v6conn *net.UDPConn |
| 161 | var v4pc *ipv4.PacketConn |
| 162 | var v6pc *ipv6.PacketConn |
| 163 | |
| 164 | v4conn, port, err = listenNet("udp4", port) |
| 165 | if err != nil && !errors.Is(err, syscall.EAFNOSUPPORT) { |
| 166 | return nil, 0, err |
| 167 | } |
| 168 | |
| 169 | // Listen on the same port as we're using for ipv4. |
| 170 | v6conn, port, err = listenNet("udp6", port) |
| 171 | if uport == 0 && errors.Is(err, syscall.EADDRINUSE) && tries < 100 { |
| 172 | v4conn.Close() |
| 173 | tries++ |
| 174 | goto again |
| 175 | } |
| 176 | if err != nil && !errors.Is(err, syscall.EAFNOSUPPORT) { |
| 177 | v4conn.Close() |
| 178 | return nil, 0, err |
| 179 | } |
| 180 | var fns []ReceiveFunc |
| 181 | if v4conn != nil { |
| 182 | s.ipv4TxOffload, s.ipv4RxOffload = supportsUDPOffload(v4conn) |
| 183 | if runtime.GOOS == "linux" || runtime.GOOS == "android" { |
| 184 | v4pc = ipv4.NewPacketConn(v4conn) |
| 185 | s.ipv4PC = v4pc |
| 186 | } |
| 187 | fns = append(fns, s.makeReceiveIPv4(v4pc, v4conn, s.ipv4RxOffload)) |
| 188 | s.ipv4 = v4conn |
| 189 | } |
| 190 | if v6conn != nil { |
| 191 | s.ipv6TxOffload, s.ipv6RxOffload = supportsUDPOffload(v6conn) |
| 192 | if runtime.GOOS == "linux" || runtime.GOOS == "android" { |
| 193 | v6pc = ipv6.NewPacketConn(v6conn) |
| 194 | s.ipv6PC = v6pc |
| 195 | } |
| 196 | fns = append(fns, s.makeReceiveIPv6(v6pc, v6conn, s.ipv6RxOffload)) |
| 197 | s.ipv6 = v6conn |
| 198 | } |
| 199 | if len(fns) == 0 { |
| 200 | return nil, 0, syscall.EAFNOSUPPORT |
| 201 | } |
| 202 |
nothing calls this directly
no test coverage detected