MCPcopy Create free account
hub / github.com/encodeous/nylon / Open

Method Open

polyamide/conn/bind_std.go:145–204  ·  view source on GitHub ↗
(uport uint16)

Source from the content-addressed store, hash-verified

143}
144
145func (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.
158again:
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

Callers

nothing calls this directly

Calls 5

makeReceiveIPv4Method · 0.95
makeReceiveIPv6Method · 0.95
listenNetFunction · 0.85
supportsUDPOffloadFunction · 0.70
CloseMethod · 0.65

Tested by

no test coverage detected