1 /*-
2 * Copyright (c) 2010-2012 Citrix Inc.
3 * Copyright (c) 2009-2012,2016-2017 Microsoft Corp.
4 * Copyright (c) 2012 NetApp Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice unmodified, this list of conditions, and the following
12 * disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 /*-
30 * Copyright (c) 2004-2006 Kip Macy
31 * All rights reserved.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions
35 * are met:
36 * 1. Redistributions of source code must retain the above copyright
37 * notice, this list of conditions and the following disclaimer.
38 * 2. Redistributions in binary form must reproduce the above copyright
39 * notice, this list of conditions and the following disclaimer in the
40 * documentation and/or other materials provided with the distribution.
41 *
42 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
46 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52 * SUCH DAMAGE.
53 */
54
55 #include <sys/cdefs.h>
56 __FBSDID("$FreeBSD$");
57
58 #include "opt_hn.h"
59 #include "opt_inet6.h"
60 #include "opt_inet.h"
61 #include "opt_rss.h"
62
63 #include <sys/param.h>
64 #include <sys/systm.h>
65 #include <sys/bus.h>
66 #include <sys/counter.h>
67 #include <sys/kernel.h>
68 #include <sys/limits.h>
69 #include <sys/malloc.h>
70 #include <sys/mbuf.h>
71 #include <sys/module.h>
72 #include <sys/queue.h>
73 #include <sys/lock.h>
74 #include <sys/rmlock.h>
75 #include <sys/sbuf.h>
76 #include <sys/smp.h>
77 #include <sys/socket.h>
78 #include <sys/sockio.h>
79 #include <sys/sx.h>
80 #include <sys/sysctl.h>
81 #include <sys/taskqueue.h>
82 #include <sys/buf_ring.h>
83 #include <sys/eventhandler.h>
84
85 #include <machine/atomic.h>
86 #include <machine/in_cksum.h>
87
88 #include <net/bpf.h>
89 #include <net/ethernet.h>
90 #include <net/if.h>
91 #include <net/if_dl.h>
92 #include <net/if_media.h>
93 #include <net/if_types.h>
94 #include <net/if_var.h>
95 #include <net/rndis.h>
96 #ifdef RSS
97 #include <net/rss_config.h>
98 #endif
99
100 #include <netinet/in_systm.h>
101 #include <netinet/in.h>
102 #include <netinet/ip.h>
103 #include <netinet/ip6.h>
104 #include <netinet/tcp.h>
105 #include <netinet/tcp_lro.h>
106 #include <netinet/udp.h>
107
108 #include <dev/hyperv/include/hyperv.h>
109 #include <dev/hyperv/include/hyperv_busdma.h>
110 #include <dev/hyperv/include/vmbus.h>
111 #include <dev/hyperv/include/vmbus_xact.h>
112
113 #include <dev/hyperv/netvsc/ndis.h>
114 #include <dev/hyperv/netvsc/if_hnreg.h>
115 #include <dev/hyperv/netvsc/if_hnvar.h>
116 #include <dev/hyperv/netvsc/hn_nvs.h>
117 #include <dev/hyperv/netvsc/hn_rndis.h>
118
119 #include "vmbus_if.h"
120
121 #define HN_IFSTART_SUPPORT
122
123 #define HN_RING_CNT_DEF_MAX 8
124
125 #define HN_VFMAP_SIZE_DEF 8
126
127 #define HN_XPNT_VF_ATTWAIT_MIN 2 /* seconds */
128
129 /* YYY should get it from the underlying channel */
130 #define HN_TX_DESC_CNT 512
131
132 #define HN_RNDIS_PKT_LEN \
133 (sizeof(struct rndis_packet_msg) + \
134 HN_RNDIS_PKTINFO_SIZE(HN_NDIS_HASH_VALUE_SIZE) + \
135 HN_RNDIS_PKTINFO_SIZE(NDIS_VLAN_INFO_SIZE) + \
136 HN_RNDIS_PKTINFO_SIZE(NDIS_LSO2_INFO_SIZE) + \
137 HN_RNDIS_PKTINFO_SIZE(NDIS_TXCSUM_INFO_SIZE))
138 #define HN_RNDIS_PKT_BOUNDARY PAGE_SIZE
139 #define HN_RNDIS_PKT_ALIGN CACHE_LINE_SIZE
140
141 #define HN_TX_DATA_BOUNDARY PAGE_SIZE
142 #define HN_TX_DATA_MAXSIZE IP_MAXPACKET
143 #define HN_TX_DATA_SEGSIZE PAGE_SIZE
144 /* -1 for RNDIS packet message */
145 #define HN_TX_DATA_SEGCNT_MAX (HN_GPACNT_MAX - 1)
146
147 #define HN_DIRECT_TX_SIZE_DEF 128
148
149 #define HN_EARLY_TXEOF_THRESH 8
150
151 #define HN_PKTBUF_LEN_DEF (16 * 1024)
152
153 #define HN_LROENT_CNT_DEF 128
154
155 #define HN_LRO_LENLIM_MULTIRX_DEF (12 * ETHERMTU)
156 #define HN_LRO_LENLIM_DEF (25 * ETHERMTU)
157 /* YYY 2*MTU is a bit rough, but should be good enough. */
158 #define HN_LRO_LENLIM_MIN(ifp) (2 * (ifp)->if_mtu)
159
160 #define HN_LRO_ACKCNT_DEF 1
161
162 #define HN_LOCK_INIT(sc) \
163 sx_init(&(sc)->hn_lock, device_get_nameunit((sc)->hn_dev))
164 #define HN_LOCK_DESTROY(sc) sx_destroy(&(sc)->hn_lock)
165 #define HN_LOCK_ASSERT(sc) sx_assert(&(sc)->hn_lock, SA_XLOCKED)
166 #define HN_LOCK(sc) \
167 do { \
168 while (sx_try_xlock(&(sc)->hn_lock) == 0) \
169 DELAY(1000); \
170 } while (0)
171 #define HN_UNLOCK(sc) sx_xunlock(&(sc)->hn_lock)
172
173 #define HN_CSUM_IP_MASK (CSUM_IP | CSUM_IP_TCP | CSUM_IP_UDP)
174 #define HN_CSUM_IP6_MASK (CSUM_IP6_TCP | CSUM_IP6_UDP)
175 #define HN_CSUM_IP_HWASSIST(sc) \
176 ((sc)->hn_tx_ring[0].hn_csum_assist & HN_CSUM_IP_MASK)
177 #define HN_CSUM_IP6_HWASSIST(sc) \
178 ((sc)->hn_tx_ring[0].hn_csum_assist & HN_CSUM_IP6_MASK)
179
180 #define HN_PKTSIZE_MIN(align) \
181 roundup2(ETHER_MIN_LEN + ETHER_VLAN_ENCAP_LEN - ETHER_CRC_LEN + \
182 HN_RNDIS_PKT_LEN, (align))
183 #define HN_PKTSIZE(m, align) \
184 roundup2((m)->m_pkthdr.len + HN_RNDIS_PKT_LEN, (align))
185
186 #ifdef RSS
187 #define HN_RING_IDX2CPU(sc, idx) rss_getcpu((idx) % rss_getnumbuckets())
188 #else
189 #define HN_RING_IDX2CPU(sc, idx) (((sc)->hn_cpu + (idx)) % mp_ncpus)
190 #endif
191
192 struct hn_txdesc {
193 #ifndef HN_USE_TXDESC_BUFRING
194 SLIST_ENTRY(hn_txdesc) link;
195 #endif
196 STAILQ_ENTRY(hn_txdesc) agg_link;
197
198 /* Aggregated txdescs, in sending order. */
199 STAILQ_HEAD(, hn_txdesc) agg_list;
200
201 /* The oldest packet, if transmission aggregation happens. */
202 struct mbuf *m;
203 struct hn_tx_ring *txr;
204 int refs;
205 uint32_t flags; /* HN_TXD_FLAG_ */
206 struct hn_nvs_sendctx send_ctx;
207 uint32_t chim_index;
208 int chim_size;
209
210 bus_dmamap_t data_dmap;
211
212 bus_addr_t rndis_pkt_paddr;
213 struct rndis_packet_msg *rndis_pkt;
214 bus_dmamap_t rndis_pkt_dmap;
215 };
216
217 #define HN_TXD_FLAG_ONLIST 0x0001
218 #define HN_TXD_FLAG_DMAMAP 0x0002
219 #define HN_TXD_FLAG_ONAGG 0x0004
220
221 struct hn_rxinfo {
222 uint32_t vlan_info;
223 uint32_t csum_info;
224 uint32_t hash_info;
225 uint32_t hash_value;
226 };
227
228 struct hn_rxvf_setarg {
229 struct hn_rx_ring *rxr;
230 struct ifnet *vf_ifp;
231 };
232
233 #define HN_RXINFO_VLAN 0x0001
234 #define HN_RXINFO_CSUM 0x0002
235 #define HN_RXINFO_HASHINF 0x0004
236 #define HN_RXINFO_HASHVAL 0x0008
237 #define HN_RXINFO_ALL \
238 (HN_RXINFO_VLAN | \
239 HN_RXINFO_CSUM | \
240 HN_RXINFO_HASHINF | \
241 HN_RXINFO_HASHVAL)
242
243 #define HN_NDIS_VLAN_INFO_INVALID 0xffffffff
244 #define HN_NDIS_RXCSUM_INFO_INVALID 0
245 #define HN_NDIS_HASH_INFO_INVALID 0
246
247 static int hn_probe(device_t);
248 static int hn_attach(device_t);
249 static int hn_detach(device_t);
250 static int hn_shutdown(device_t);
251 static void hn_chan_callback(struct vmbus_channel *,
252 void *);
253
254 static void hn_init(void *);
255 static int hn_ioctl(struct ifnet *, u_long, caddr_t);
256 #ifdef HN_IFSTART_SUPPORT
257 static void hn_start(struct ifnet *);
258 #endif
259 static int hn_transmit(struct ifnet *, struct mbuf *);
260 static void hn_xmit_qflush(struct ifnet *);
261 static int hn_ifmedia_upd(struct ifnet *);
262 static void hn_ifmedia_sts(struct ifnet *,
263 struct ifmediareq *);
264
265 static void hn_ifnet_event(void *, struct ifnet *, int);
266 static void hn_ifaddr_event(void *, struct ifnet *);
267 static void hn_ifnet_attevent(void *, struct ifnet *);
268 static void hn_ifnet_detevent(void *, struct ifnet *);
269 static void hn_ifnet_lnkevent(void *, struct ifnet *, int);
270
271 static bool hn_ismyvf(const struct hn_softc *,
272 const struct ifnet *);
273 static void hn_rxvf_change(struct hn_softc *,
274 struct ifnet *, bool);
275 static void hn_rxvf_set(struct hn_softc *, struct ifnet *);
276 static void hn_rxvf_set_task(void *, int);
277 static void hn_xpnt_vf_input(struct ifnet *, struct mbuf *);
278 static int hn_xpnt_vf_iocsetflags(struct hn_softc *);
279 static int hn_xpnt_vf_iocsetcaps(struct hn_softc *,
280 struct ifreq *);
281 static void hn_xpnt_vf_saveifflags(struct hn_softc *);
282 static bool hn_xpnt_vf_isready(struct hn_softc *);
283 static void hn_xpnt_vf_setready(struct hn_softc *);
284 static void hn_xpnt_vf_init_taskfunc(void *, int);
285 static void hn_xpnt_vf_init(struct hn_softc *);
286 static void hn_xpnt_vf_setenable(struct hn_softc *);
287 static void hn_xpnt_vf_setdisable(struct hn_softc *, bool);
288 static void hn_vf_rss_fixup(struct hn_softc *, bool);
289 static void hn_vf_rss_restore(struct hn_softc *);
290
291 static int hn_rndis_rxinfo(const void *, int,
292 struct hn_rxinfo *);
293 static void hn_rndis_rx_data(struct hn_rx_ring *,
294 const void *, int);
295 static void hn_rndis_rx_status(struct hn_softc *,
296 const void *, int);
297 static void hn_rndis_init_fixat(struct hn_softc *, int);
298
299 static void hn_nvs_handle_notify(struct hn_softc *,
300 const struct vmbus_chanpkt_hdr *);
301 static void hn_nvs_handle_comp(struct hn_softc *,
302 struct vmbus_channel *,
303 const struct vmbus_chanpkt_hdr *);
304 static void hn_nvs_handle_rxbuf(struct hn_rx_ring *,
305 struct vmbus_channel *,
306 const struct vmbus_chanpkt_hdr *);
307 static void hn_nvs_ack_rxbuf(struct hn_rx_ring *,
308 struct vmbus_channel *, uint64_t);
309
310 #if __FreeBSD_version >= 1100099
311 static int hn_lro_lenlim_sysctl(SYSCTL_HANDLER_ARGS);
312 static int hn_lro_ackcnt_sysctl(SYSCTL_HANDLER_ARGS);
313 #endif
314 static int hn_trust_hcsum_sysctl(SYSCTL_HANDLER_ARGS);
315 static int hn_chim_size_sysctl(SYSCTL_HANDLER_ARGS);
316 #if __FreeBSD_version < 1100095
317 static int hn_rx_stat_int_sysctl(SYSCTL_HANDLER_ARGS);
318 #else
319 static int hn_rx_stat_u64_sysctl(SYSCTL_HANDLER_ARGS);
320 #endif
321 static int hn_rx_stat_ulong_sysctl(SYSCTL_HANDLER_ARGS);
322 static int hn_tx_stat_ulong_sysctl(SYSCTL_HANDLER_ARGS);
323 static int hn_tx_conf_int_sysctl(SYSCTL_HANDLER_ARGS);
324 static int hn_ndis_version_sysctl(SYSCTL_HANDLER_ARGS);
325 static int hn_caps_sysctl(SYSCTL_HANDLER_ARGS);
326 static int hn_hwassist_sysctl(SYSCTL_HANDLER_ARGS);
327 static int hn_rxfilter_sysctl(SYSCTL_HANDLER_ARGS);
328 #ifndef RSS
329 static int hn_rss_key_sysctl(SYSCTL_HANDLER_ARGS);
330 static int hn_rss_ind_sysctl(SYSCTL_HANDLER_ARGS);
331 #endif
332 static int hn_rss_hash_sysctl(SYSCTL_HANDLER_ARGS);
333 static int hn_rss_hcap_sysctl(SYSCTL_HANDLER_ARGS);
334 static int hn_rss_mbuf_sysctl(SYSCTL_HANDLER_ARGS);
335 static int hn_txagg_size_sysctl(SYSCTL_HANDLER_ARGS);
336 static int hn_txagg_pkts_sysctl(SYSCTL_HANDLER_ARGS);
337 static int hn_txagg_pktmax_sysctl(SYSCTL_HANDLER_ARGS);
338 static int hn_txagg_align_sysctl(SYSCTL_HANDLER_ARGS);
339 static int hn_polling_sysctl(SYSCTL_HANDLER_ARGS);
340 static int hn_vf_sysctl(SYSCTL_HANDLER_ARGS);
341 static int hn_rxvf_sysctl(SYSCTL_HANDLER_ARGS);
342 static int hn_vflist_sysctl(SYSCTL_HANDLER_ARGS);
343 static int hn_vfmap_sysctl(SYSCTL_HANDLER_ARGS);
344 static int hn_xpnt_vf_accbpf_sysctl(SYSCTL_HANDLER_ARGS);
345 static int hn_xpnt_vf_enabled_sysctl(SYSCTL_HANDLER_ARGS);
346
347 static void hn_stop(struct hn_softc *, bool);
348 static void hn_init_locked(struct hn_softc *);
349 static int hn_chan_attach(struct hn_softc *,
350 struct vmbus_channel *);
351 static void hn_chan_detach(struct hn_softc *,
352 struct vmbus_channel *);
353 static int hn_attach_subchans(struct hn_softc *);
354 static void hn_detach_allchans(struct hn_softc *);
355 static void hn_chan_rollup(struct hn_rx_ring *,
356 struct hn_tx_ring *);
357 static void hn_set_ring_inuse(struct hn_softc *, int);
358 static int hn_synth_attach(struct hn_softc *, int);
359 static void hn_synth_detach(struct hn_softc *);
360 static int hn_synth_alloc_subchans(struct hn_softc *,
361 int *);
362 static bool hn_synth_attachable(const struct hn_softc *);
363 static void hn_suspend(struct hn_softc *);
364 static void hn_suspend_data(struct hn_softc *);
365 static void hn_suspend_mgmt(struct hn_softc *);
366 static void hn_resume(struct hn_softc *);
367 static void hn_resume_data(struct hn_softc *);
368 static void hn_resume_mgmt(struct hn_softc *);
369 static void hn_suspend_mgmt_taskfunc(void *, int);
370 static void hn_chan_drain(struct hn_softc *,
371 struct vmbus_channel *);
372 static void hn_disable_rx(struct hn_softc *);
373 static void hn_drain_rxtx(struct hn_softc *, int);
374 static void hn_polling(struct hn_softc *, u_int);
375 static void hn_chan_polling(struct vmbus_channel *, u_int);
376 static void hn_mtu_change_fixup(struct hn_softc *);
377
378 static void hn_update_link_status(struct hn_softc *);
379 static void hn_change_network(struct hn_softc *);
380 static void hn_link_taskfunc(void *, int);
381 static void hn_netchg_init_taskfunc(void *, int);
382 static void hn_netchg_status_taskfunc(void *, int);
383 static void hn_link_status(struct hn_softc *);
384
385 static int hn_create_rx_data(struct hn_softc *, int);
386 static void hn_destroy_rx_data(struct hn_softc *);
387 static int hn_check_iplen(const struct mbuf *, int);
388 static void hn_rxpkt_proto(const struct mbuf *, int *, int *);
389 static int hn_set_rxfilter(struct hn_softc *, uint32_t);
390 static int hn_rxfilter_config(struct hn_softc *);
391 static int hn_rss_reconfig(struct hn_softc *);
392 static void hn_rss_ind_fixup(struct hn_softc *);
393 static void hn_rss_mbuf_hash(struct hn_softc *, uint32_t);
394 static int hn_rxpkt(struct hn_rx_ring *, const void *,
395 int, const struct hn_rxinfo *);
396 static uint32_t hn_rss_type_fromndis(uint32_t);
397 static uint32_t hn_rss_type_tondis(uint32_t);
398
399 static int hn_tx_ring_create(struct hn_softc *, int);
400 static void hn_tx_ring_destroy(struct hn_tx_ring *);
401 static int hn_create_tx_data(struct hn_softc *, int);
402 static void hn_fixup_tx_data(struct hn_softc *);
403 static void hn_fixup_rx_data(struct hn_softc *);
404 static void hn_destroy_tx_data(struct hn_softc *);
405 static void hn_txdesc_dmamap_destroy(struct hn_txdesc *);
406 static void hn_txdesc_gc(struct hn_tx_ring *,
407 struct hn_txdesc *);
408 static int hn_encap(struct ifnet *, struct hn_tx_ring *,
409 struct hn_txdesc *, struct mbuf **);
410 static int hn_txpkt(struct ifnet *, struct hn_tx_ring *,
411 struct hn_txdesc *);
412 static void hn_set_chim_size(struct hn_softc *, int);
413 static void hn_set_tso_maxsize(struct hn_softc *, int, int);
414 static bool hn_tx_ring_pending(struct hn_tx_ring *);
415 static void hn_tx_ring_qflush(struct hn_tx_ring *);
416 static void hn_resume_tx(struct hn_softc *, int);
417 static void hn_set_txagg(struct hn_softc *);
418 static void *hn_try_txagg(struct ifnet *,
419 struct hn_tx_ring *, struct hn_txdesc *,
420 int);
421 static int hn_get_txswq_depth(const struct hn_tx_ring *);
422 static void hn_txpkt_done(struct hn_nvs_sendctx *,
423 struct hn_softc *, struct vmbus_channel *,
424 const void *, int);
425 static int hn_txpkt_sglist(struct hn_tx_ring *,
426 struct hn_txdesc *);
427 static int hn_txpkt_chim(struct hn_tx_ring *,
428 struct hn_txdesc *);
429 static int hn_xmit(struct hn_tx_ring *, int);
430 static void hn_xmit_taskfunc(void *, int);
431 static void hn_xmit_txeof(struct hn_tx_ring *);
432 static void hn_xmit_txeof_taskfunc(void *, int);
433 #ifdef HN_IFSTART_SUPPORT
434 static int hn_start_locked(struct hn_tx_ring *, int);
435 static void hn_start_taskfunc(void *, int);
436 static void hn_start_txeof(struct hn_tx_ring *);
437 static void hn_start_txeof_taskfunc(void *, int);
438 #endif
439
440 SYSCTL_NODE(_hw, OID_AUTO, hn, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL,
441 "Hyper-V network interface");
442
443 /* Trust tcp segements verification on host side. */
444 static int hn_trust_hosttcp = 1;
445 SYSCTL_INT(_hw_hn, OID_AUTO, trust_hosttcp, CTLFLAG_RDTUN,
446 &hn_trust_hosttcp, 0,
447 "Trust tcp segement verification on host side, "
448 "when csum info is missing (global setting)");
449
450 /* Trust udp datagrams verification on host side. */
451 static int hn_trust_hostudp = 1;
452 SYSCTL_INT(_hw_hn, OID_AUTO, trust_hostudp, CTLFLAG_RDTUN,
453 &hn_trust_hostudp, 0,
454 "Trust udp datagram verification on host side, "
455 "when csum info is missing (global setting)");
456
457 /* Trust ip packets verification on host side. */
458 static int hn_trust_hostip = 1;
459 SYSCTL_INT(_hw_hn, OID_AUTO, trust_hostip, CTLFLAG_RDTUN,
460 &hn_trust_hostip, 0,
461 "Trust ip packet verification on host side, "
462 "when csum info is missing (global setting)");
463
464 /*
465 * Offload UDP/IPv4 checksum.
466 */
467 static int hn_enable_udp4cs = 1;
468 SYSCTL_INT(_hw_hn, OID_AUTO, enable_udp4cs, CTLFLAG_RDTUN,
469 &hn_enable_udp4cs, 0, "Offload UDP/IPv4 checksum");
470
471 /*
472 * Offload UDP/IPv6 checksum.
473 */
474 static int hn_enable_udp6cs = 1;
475 SYSCTL_INT(_hw_hn, OID_AUTO, enable_udp6cs, CTLFLAG_RDTUN,
476 &hn_enable_udp6cs, 0, "Offload UDP/IPv6 checksum");
477
478 /* Stats. */
479 static counter_u64_t hn_udpcs_fixup;
480 SYSCTL_COUNTER_U64(_hw_hn, OID_AUTO, udpcs_fixup, CTLFLAG_RW,
481 &hn_udpcs_fixup, "# of UDP checksum fixup");
482
483 /*
484 * See hn_set_hlen().
485 *
486 * This value is for Azure. For Hyper-V, set this above
487 * 65536 to disable UDP datagram checksum fixup.
488 */
489 static int hn_udpcs_fixup_mtu = 1420;
490 SYSCTL_INT(_hw_hn, OID_AUTO, udpcs_fixup_mtu, CTLFLAG_RWTUN,
491 &hn_udpcs_fixup_mtu, 0, "UDP checksum fixup MTU threshold");
492
493 /* Limit TSO burst size */
494 static int hn_tso_maxlen = IP_MAXPACKET;
495 SYSCTL_INT(_hw_hn, OID_AUTO, tso_maxlen, CTLFLAG_RDTUN,
496 &hn_tso_maxlen, 0, "TSO burst limit");
497
498 /* Limit chimney send size */
499 static int hn_tx_chimney_size = 0;
500 SYSCTL_INT(_hw_hn, OID_AUTO, tx_chimney_size, CTLFLAG_RDTUN,
501 &hn_tx_chimney_size, 0, "Chimney send packet size limit");
502
503 /* Limit the size of packet for direct transmission */
504 static int hn_direct_tx_size = HN_DIRECT_TX_SIZE_DEF;
505 SYSCTL_INT(_hw_hn, OID_AUTO, direct_tx_size, CTLFLAG_RDTUN,
506 &hn_direct_tx_size, 0, "Size of the packet for direct transmission");
507
508 /* # of LRO entries per RX ring */
509 #if defined(INET) || defined(INET6)
510 #if __FreeBSD_version >= 1100095
511 static int hn_lro_entry_count = HN_LROENT_CNT_DEF;
512 SYSCTL_INT(_hw_hn, OID_AUTO, lro_entry_count, CTLFLAG_RDTUN,
513 &hn_lro_entry_count, 0, "LRO entry count");
514 #endif
515 #endif
516
517 static int hn_tx_taskq_cnt = 1;
518 SYSCTL_INT(_hw_hn, OID_AUTO, tx_taskq_cnt, CTLFLAG_RDTUN,
519 &hn_tx_taskq_cnt, 0, "# of TX taskqueues");
520
521 #define HN_TX_TASKQ_M_INDEP 0
522 #define HN_TX_TASKQ_M_GLOBAL 1
523 #define HN_TX_TASKQ_M_EVTTQ 2
524
525 static int hn_tx_taskq_mode = HN_TX_TASKQ_M_INDEP;
526 SYSCTL_INT(_hw_hn, OID_AUTO, tx_taskq_mode, CTLFLAG_RDTUN,
527 &hn_tx_taskq_mode, 0, "TX taskqueue modes: "
528 "0 - independent, 1 - share global tx taskqs, 2 - share event taskqs");
529
530 #ifndef HN_USE_TXDESC_BUFRING
531 static int hn_use_txdesc_bufring = 0;
532 #else
533 static int hn_use_txdesc_bufring = 1;
534 #endif
535 SYSCTL_INT(_hw_hn, OID_AUTO, use_txdesc_bufring, CTLFLAG_RD,
536 &hn_use_txdesc_bufring, 0, "Use buf_ring for TX descriptors");
537
538 #ifdef HN_IFSTART_SUPPORT
539 /* Use ifnet.if_start instead of ifnet.if_transmit */
540 static int hn_use_if_start = 0;
541 SYSCTL_INT(_hw_hn, OID_AUTO, use_if_start, CTLFLAG_RDTUN,
542 &hn_use_if_start, 0, "Use if_start TX method");
543 #endif
544
545 /* # of channels to use */
546 static int hn_chan_cnt = 0;
547 SYSCTL_INT(_hw_hn, OID_AUTO, chan_cnt, CTLFLAG_RDTUN,
548 &hn_chan_cnt, 0,
549 "# of channels to use; each channel has one RX ring and one TX ring");
550
551 /* # of transmit rings to use */
552 static int hn_tx_ring_cnt = 0;
553 SYSCTL_INT(_hw_hn, OID_AUTO, tx_ring_cnt, CTLFLAG_RDTUN,
554 &hn_tx_ring_cnt, 0, "# of TX rings to use");
555
556 /* Software TX ring deptch */
557 static int hn_tx_swq_depth = 0;
558 SYSCTL_INT(_hw_hn, OID_AUTO, tx_swq_depth, CTLFLAG_RDTUN,
559 &hn_tx_swq_depth, 0, "Depth of IFQ or BUFRING");
560
561 /* Enable sorted LRO, and the depth of the per-channel mbuf queue */
562 #if __FreeBSD_version >= 1100095
563 static u_int hn_lro_mbufq_depth = 0;
564 SYSCTL_UINT(_hw_hn, OID_AUTO, lro_mbufq_depth, CTLFLAG_RDTUN,
565 &hn_lro_mbufq_depth, 0, "Depth of LRO mbuf queue");
566 #endif
567
568 /* Packet transmission aggregation size limit */
569 static int hn_tx_agg_size = -1;
570 SYSCTL_INT(_hw_hn, OID_AUTO, tx_agg_size, CTLFLAG_RDTUN,
571 &hn_tx_agg_size, 0, "Packet transmission aggregation size limit");
572
573 /* Packet transmission aggregation count limit */
574 static int hn_tx_agg_pkts = -1;
575 SYSCTL_INT(_hw_hn, OID_AUTO, tx_agg_pkts, CTLFLAG_RDTUN,
576 &hn_tx_agg_pkts, 0, "Packet transmission aggregation packet limit");
577
578 /* VF list */
579 SYSCTL_PROC(_hw_hn, OID_AUTO, vflist, CTLFLAG_RD | CTLTYPE_STRING,
580 0, 0, hn_vflist_sysctl, "A", "VF list");
581
582 /* VF mapping */
583 SYSCTL_PROC(_hw_hn, OID_AUTO, vfmap, CTLFLAG_RD | CTLTYPE_STRING,
584 0, 0, hn_vfmap_sysctl, "A", "VF mapping");
585
586 /* Transparent VF */
587 static int hn_xpnt_vf = 1;
588 SYSCTL_INT(_hw_hn, OID_AUTO, vf_transparent, CTLFLAG_RDTUN,
589 &hn_xpnt_vf, 0, "Transparent VF mod");
590
591 /* Accurate BPF support for Transparent VF */
592 static int hn_xpnt_vf_accbpf = 0;
593 SYSCTL_INT(_hw_hn, OID_AUTO, vf_xpnt_accbpf, CTLFLAG_RDTUN,
594 &hn_xpnt_vf_accbpf, 0, "Accurate BPF for transparent VF");
595
596 /* Extra wait for transparent VF attach routing; unit seconds. */
597 static int hn_xpnt_vf_attwait = HN_XPNT_VF_ATTWAIT_MIN;
598 SYSCTL_INT(_hw_hn, OID_AUTO, vf_xpnt_attwait, CTLFLAG_RWTUN,
599 &hn_xpnt_vf_attwait, 0,
600 "Extra wait for transparent VF attach routing; unit: seconds");
601
602 static u_int hn_cpu_index; /* next CPU for channel */
603 static struct taskqueue **hn_tx_taskque;/* shared TX taskqueues */
604
605 static struct rmlock hn_vfmap_lock;
606 static int hn_vfmap_size;
607 static struct ifnet **hn_vfmap;
608
609 #ifndef RSS
610 static const uint8_t
611 hn_rss_key_default[NDIS_HASH_KEYSIZE_TOEPLITZ] = {
612 0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
613 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
614 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
615 0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
616 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa
617 };
618 #endif /* !RSS */
619
620 static const struct hyperv_guid hn_guid = {
621 .hv_guid = {
622 0x63, 0x51, 0x61, 0xf8, 0x3e, 0xdf, 0xc5, 0x46,
623 0x91, 0x3f, 0xf2, 0xd2, 0xf9, 0x65, 0xed, 0x0e }
624 };
625
626 static device_method_t hn_methods[] = {
627 /* Device interface */
628 DEVMETHOD(device_probe, hn_probe),
629 DEVMETHOD(device_attach, hn_attach),
630 DEVMETHOD(device_detach, hn_detach),
631 DEVMETHOD(device_shutdown, hn_shutdown),
632 DEVMETHOD_END
633 };
634
635 static driver_t hn_driver = {
636 "hn",
637 hn_methods,
638 sizeof(struct hn_softc)
639 };
640
641 static devclass_t hn_devclass;
642
643 DRIVER_MODULE(hn, vmbus, hn_driver, hn_devclass, 0, 0);
644 MODULE_VERSION(hn, 1);
645 MODULE_DEPEND(hn, vmbus, 1, 1, 1);
646
647 #if __FreeBSD_version >= 1100099
648 static void
hn_set_lro_lenlim(struct hn_softc * sc,int lenlim)649 hn_set_lro_lenlim(struct hn_softc *sc, int lenlim)
650 {
651 int i;
652
653 for (i = 0; i < sc->hn_rx_ring_cnt; ++i)
654 sc->hn_rx_ring[i].hn_lro.lro_length_lim = lenlim;
655 }
656 #endif
657
658 static int
hn_txpkt_sglist(struct hn_tx_ring * txr,struct hn_txdesc * txd)659 hn_txpkt_sglist(struct hn_tx_ring *txr, struct hn_txdesc *txd)
660 {
661
662 KASSERT(txd->chim_index == HN_NVS_CHIM_IDX_INVALID &&
663 txd->chim_size == 0, ("invalid rndis sglist txd"));
664 return (hn_nvs_send_rndis_sglist(txr->hn_chan, HN_NVS_RNDIS_MTYPE_DATA,
665 &txd->send_ctx, txr->hn_gpa, txr->hn_gpa_cnt));
666 }
667
668 static int
hn_txpkt_chim(struct hn_tx_ring * txr,struct hn_txdesc * txd)669 hn_txpkt_chim(struct hn_tx_ring *txr, struct hn_txdesc *txd)
670 {
671 struct hn_nvs_rndis rndis;
672
673 KASSERT(txd->chim_index != HN_NVS_CHIM_IDX_INVALID &&
674 txd->chim_size > 0, ("invalid rndis chim txd"));
675
676 rndis.nvs_type = HN_NVS_TYPE_RNDIS;
677 rndis.nvs_rndis_mtype = HN_NVS_RNDIS_MTYPE_DATA;
678 rndis.nvs_chim_idx = txd->chim_index;
679 rndis.nvs_chim_sz = txd->chim_size;
680
681 return (hn_nvs_send(txr->hn_chan, VMBUS_CHANPKT_FLAG_RC,
682 &rndis, sizeof(rndis), &txd->send_ctx));
683 }
684
685 static __inline uint32_t
hn_chim_alloc(struct hn_softc * sc)686 hn_chim_alloc(struct hn_softc *sc)
687 {
688 int i, bmap_cnt = sc->hn_chim_bmap_cnt;
689 u_long *bmap = sc->hn_chim_bmap;
690 uint32_t ret = HN_NVS_CHIM_IDX_INVALID;
691
692 for (i = 0; i < bmap_cnt; ++i) {
693 int idx;
694
695 idx = ffsl(~bmap[i]);
696 if (idx == 0)
697 continue;
698
699 --idx; /* ffsl is 1-based */
700 KASSERT(i * LONG_BIT + idx < sc->hn_chim_cnt,
701 ("invalid i %d and idx %d", i, idx));
702
703 if (atomic_testandset_long(&bmap[i], idx))
704 continue;
705
706 ret = i * LONG_BIT + idx;
707 break;
708 }
709 return (ret);
710 }
711
712 static __inline void
hn_chim_free(struct hn_softc * sc,uint32_t chim_idx)713 hn_chim_free(struct hn_softc *sc, uint32_t chim_idx)
714 {
715 u_long mask;
716 uint32_t idx;
717
718 idx = chim_idx / LONG_BIT;
719 KASSERT(idx < sc->hn_chim_bmap_cnt,
720 ("invalid chimney index 0x%x", chim_idx));
721
722 mask = 1UL << (chim_idx % LONG_BIT);
723 KASSERT(sc->hn_chim_bmap[idx] & mask,
724 ("index bitmap 0x%lx, chimney index %u, "
725 "bitmap idx %d, bitmask 0x%lx",
726 sc->hn_chim_bmap[idx], chim_idx, idx, mask));
727
728 atomic_clear_long(&sc->hn_chim_bmap[idx], mask);
729 }
730
731 #if defined(INET6) || defined(INET)
732
733 #define PULLUP_HDR(m, len) \
734 do { \
735 if (__predict_false((m)->m_len < (len))) { \
736 (m) = m_pullup((m), (len)); \
737 if ((m) == NULL) \
738 return (NULL); \
739 } \
740 } while (0)
741
742 /*
743 * NOTE: If this function failed, the m_head would be freed.
744 */
745 static __inline struct mbuf *
hn_tso_fixup(struct mbuf * m_head)746 hn_tso_fixup(struct mbuf *m_head)
747 {
748 struct ether_vlan_header *evl;
749 struct tcphdr *th;
750 int ehlen;
751
752 KASSERT(M_WRITABLE(m_head), ("TSO mbuf not writable"));
753
754 PULLUP_HDR(m_head, sizeof(*evl));
755 evl = mtod(m_head, struct ether_vlan_header *);
756 if (evl->evl_encap_proto == ntohs(ETHERTYPE_VLAN))
757 ehlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
758 else
759 ehlen = ETHER_HDR_LEN;
760 m_head->m_pkthdr.l2hlen = ehlen;
761
762 #ifdef INET
763 if (m_head->m_pkthdr.csum_flags & CSUM_IP_TSO) {
764 struct ip *ip;
765 int iphlen;
766
767 PULLUP_HDR(m_head, ehlen + sizeof(*ip));
768 ip = mtodo(m_head, ehlen);
769 iphlen = ip->ip_hl << 2;
770 m_head->m_pkthdr.l3hlen = iphlen;
771
772 PULLUP_HDR(m_head, ehlen + iphlen + sizeof(*th));
773 th = mtodo(m_head, ehlen + iphlen);
774
775 ip->ip_len = 0;
776 ip->ip_sum = 0;
777 th->th_sum = in_pseudo(ip->ip_src.s_addr,
778 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
779 }
780 #endif
781 #if defined(INET6) && defined(INET)
782 else
783 #endif
784 #ifdef INET6
785 {
786 struct ip6_hdr *ip6;
787
788 PULLUP_HDR(m_head, ehlen + sizeof(*ip6));
789 ip6 = mtodo(m_head, ehlen);
790 if (ip6->ip6_nxt != IPPROTO_TCP) {
791 m_freem(m_head);
792 return (NULL);
793 }
794 m_head->m_pkthdr.l3hlen = sizeof(*ip6);
795
796 PULLUP_HDR(m_head, ehlen + sizeof(*ip6) + sizeof(*th));
797 th = mtodo(m_head, ehlen + sizeof(*ip6));
798
799 ip6->ip6_plen = 0;
800 th->th_sum = in6_cksum_pseudo(ip6, 0, IPPROTO_TCP, 0);
801 }
802 #endif
803 return (m_head);
804 }
805
806 /*
807 * NOTE: If this function failed, the m_head would be freed.
808 */
809 static __inline struct mbuf *
hn_set_hlen(struct mbuf * m_head)810 hn_set_hlen(struct mbuf *m_head)
811 {
812 const struct ether_vlan_header *evl;
813 int ehlen;
814
815 PULLUP_HDR(m_head, sizeof(*evl));
816 evl = mtod(m_head, const struct ether_vlan_header *);
817 if (evl->evl_encap_proto == ntohs(ETHERTYPE_VLAN))
818 ehlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
819 else
820 ehlen = ETHER_HDR_LEN;
821 m_head->m_pkthdr.l2hlen = ehlen;
822
823 #ifdef INET
824 if (m_head->m_pkthdr.csum_flags & (CSUM_IP_TCP | CSUM_IP_UDP)) {
825 const struct ip *ip;
826 int iphlen;
827
828 PULLUP_HDR(m_head, ehlen + sizeof(*ip));
829 ip = mtodo(m_head, ehlen);
830 iphlen = ip->ip_hl << 2;
831 m_head->m_pkthdr.l3hlen = iphlen;
832
833 /*
834 * UDP checksum offload does not work in Azure, if the
835 * following conditions meet:
836 * - sizeof(IP hdr + UDP hdr + payload) > 1420.
837 * - IP_DF is not set in the IP hdr.
838 *
839 * Fallback to software checksum for these UDP datagrams.
840 */
841 if ((m_head->m_pkthdr.csum_flags & CSUM_IP_UDP) &&
842 m_head->m_pkthdr.len > hn_udpcs_fixup_mtu + ehlen &&
843 (ntohs(ip->ip_off) & IP_DF) == 0) {
844 uint16_t off = ehlen + iphlen;
845
846 counter_u64_add(hn_udpcs_fixup, 1);
847 PULLUP_HDR(m_head, off + sizeof(struct udphdr));
848 *(uint16_t *)(m_head->m_data + off +
849 m_head->m_pkthdr.csum_data) = in_cksum_skip(
850 m_head, m_head->m_pkthdr.len, off);
851 m_head->m_pkthdr.csum_flags &= ~CSUM_IP_UDP;
852 }
853 }
854 #endif
855 #if defined(INET6) && defined(INET)
856 else
857 #endif
858 #ifdef INET6
859 {
860 const struct ip6_hdr *ip6;
861
862 PULLUP_HDR(m_head, ehlen + sizeof(*ip6));
863 ip6 = mtodo(m_head, ehlen);
864 if (ip6->ip6_nxt != IPPROTO_TCP &&
865 ip6->ip6_nxt != IPPROTO_UDP) {
866 m_freem(m_head);
867 return (NULL);
868 }
869 m_head->m_pkthdr.l3hlen = sizeof(*ip6);
870 }
871 #endif
872 return (m_head);
873 }
874
875 /*
876 * NOTE: If this function failed, the m_head would be freed.
877 */
878 static __inline struct mbuf *
hn_check_tcpsyn(struct mbuf * m_head,int * tcpsyn)879 hn_check_tcpsyn(struct mbuf *m_head, int *tcpsyn)
880 {
881 const struct tcphdr *th;
882 int ehlen, iphlen;
883
884 *tcpsyn = 0;
885 ehlen = m_head->m_pkthdr.l2hlen;
886 iphlen = m_head->m_pkthdr.l3hlen;
887
888 PULLUP_HDR(m_head, ehlen + iphlen + sizeof(*th));
889 th = mtodo(m_head, ehlen + iphlen);
890 if (th->th_flags & TH_SYN)
891 *tcpsyn = 1;
892 return (m_head);
893 }
894
895 #undef PULLUP_HDR
896
897 #endif /* INET6 || INET */
898
899 static int
hn_set_rxfilter(struct hn_softc * sc,uint32_t filter)900 hn_set_rxfilter(struct hn_softc *sc, uint32_t filter)
901 {
902 int error = 0;
903
904 HN_LOCK_ASSERT(sc);
905
906 if (sc->hn_rx_filter != filter) {
907 error = hn_rndis_set_rxfilter(sc, filter);
908 if (!error)
909 sc->hn_rx_filter = filter;
910 }
911 return (error);
912 }
913
914 static int
hn_rxfilter_config(struct hn_softc * sc)915 hn_rxfilter_config(struct hn_softc *sc)
916 {
917 struct ifnet *ifp = sc->hn_ifp;
918 uint32_t filter;
919
920 HN_LOCK_ASSERT(sc);
921
922 /*
923 * If the non-transparent mode VF is activated, we don't know how
924 * its RX filter is configured, so stick the synthetic device in
925 * the promiscous mode.
926 */
927 if ((ifp->if_flags & IFF_PROMISC) || (sc->hn_flags & HN_FLAG_RXVF)) {
928 filter = NDIS_PACKET_TYPE_PROMISCUOUS;
929 } else {
930 filter = NDIS_PACKET_TYPE_DIRECTED;
931 if (ifp->if_flags & IFF_BROADCAST)
932 filter |= NDIS_PACKET_TYPE_BROADCAST;
933 /* TODO: support multicast list */
934 if ((ifp->if_flags & IFF_ALLMULTI) ||
935 !CK_STAILQ_EMPTY(&ifp->if_multiaddrs))
936 filter |= NDIS_PACKET_TYPE_ALL_MULTICAST;
937 }
938 return (hn_set_rxfilter(sc, filter));
939 }
940
941 static void
hn_set_txagg(struct hn_softc * sc)942 hn_set_txagg(struct hn_softc *sc)
943 {
944 uint32_t size, pkts;
945 int i;
946
947 /*
948 * Setup aggregation size.
949 */
950 if (sc->hn_agg_size < 0)
951 size = UINT32_MAX;
952 else
953 size = sc->hn_agg_size;
954
955 if (sc->hn_rndis_agg_size < size)
956 size = sc->hn_rndis_agg_size;
957
958 /* NOTE: We only aggregate packets using chimney sending buffers. */
959 if (size > (uint32_t)sc->hn_chim_szmax)
960 size = sc->hn_chim_szmax;
961
962 if (size <= 2 * HN_PKTSIZE_MIN(sc->hn_rndis_agg_align)) {
963 /* Disable */
964 size = 0;
965 pkts = 0;
966 goto done;
967 }
968
969 /* NOTE: Type of the per TX ring setting is 'int'. */
970 if (size > INT_MAX)
971 size = INT_MAX;
972
973 /*
974 * Setup aggregation packet count.
975 */
976 if (sc->hn_agg_pkts < 0)
977 pkts = UINT32_MAX;
978 else
979 pkts = sc->hn_agg_pkts;
980
981 if (sc->hn_rndis_agg_pkts < pkts)
982 pkts = sc->hn_rndis_agg_pkts;
983
984 if (pkts <= 1) {
985 /* Disable */
986 size = 0;
987 pkts = 0;
988 goto done;
989 }
990
991 /* NOTE: Type of the per TX ring setting is 'short'. */
992 if (pkts > SHRT_MAX)
993 pkts = SHRT_MAX;
994
995 done:
996 /* NOTE: Type of the per TX ring setting is 'short'. */
997 if (sc->hn_rndis_agg_align > SHRT_MAX) {
998 /* Disable */
999 size = 0;
1000 pkts = 0;
1001 }
1002
1003 if (bootverbose) {
1004 if_printf(sc->hn_ifp, "TX agg size %u, pkts %u, align %u\n",
1005 size, pkts, sc->hn_rndis_agg_align);
1006 }
1007
1008 for (i = 0; i < sc->hn_tx_ring_cnt; ++i) {
1009 struct hn_tx_ring *txr = &sc->hn_tx_ring[i];
1010
1011 mtx_lock(&txr->hn_tx_lock);
1012 txr->hn_agg_szmax = size;
1013 txr->hn_agg_pktmax = pkts;
1014 txr->hn_agg_align = sc->hn_rndis_agg_align;
1015 mtx_unlock(&txr->hn_tx_lock);
1016 }
1017 }
1018
1019 static int
hn_get_txswq_depth(const struct hn_tx_ring * txr)1020 hn_get_txswq_depth(const struct hn_tx_ring *txr)
1021 {
1022
1023 KASSERT(txr->hn_txdesc_cnt > 0, ("tx ring is not setup yet"));
1024 if (hn_tx_swq_depth < txr->hn_txdesc_cnt)
1025 return txr->hn_txdesc_cnt;
1026 return hn_tx_swq_depth;
1027 }
1028
1029 static int
hn_rss_reconfig(struct hn_softc * sc)1030 hn_rss_reconfig(struct hn_softc *sc)
1031 {
1032 int error;
1033
1034 HN_LOCK_ASSERT(sc);
1035
1036 if ((sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) == 0)
1037 return (ENXIO);
1038
1039 /*
1040 * Disable RSS first.
1041 *
1042 * NOTE:
1043 * Direct reconfiguration by setting the UNCHG flags does
1044 * _not_ work properly.
1045 */
1046 if (bootverbose)
1047 if_printf(sc->hn_ifp, "disable RSS\n");
1048 error = hn_rndis_conf_rss(sc, NDIS_RSS_FLAG_DISABLE);
1049 if (error) {
1050 if_printf(sc->hn_ifp, "RSS disable failed\n");
1051 return (error);
1052 }
1053
1054 /*
1055 * Reenable the RSS w/ the updated RSS key or indirect
1056 * table.
1057 */
1058 if (bootverbose)
1059 if_printf(sc->hn_ifp, "reconfig RSS\n");
1060 error = hn_rndis_conf_rss(sc, NDIS_RSS_FLAG_NONE);
1061 if (error) {
1062 if_printf(sc->hn_ifp, "RSS reconfig failed\n");
1063 return (error);
1064 }
1065 return (0);
1066 }
1067
1068 static void
hn_rss_ind_fixup(struct hn_softc * sc)1069 hn_rss_ind_fixup(struct hn_softc *sc)
1070 {
1071 struct ndis_rssprm_toeplitz *rss = &sc->hn_rss;
1072 int i, nchan;
1073
1074 nchan = sc->hn_rx_ring_inuse;
1075 KASSERT(nchan > 1, ("invalid # of channels %d", nchan));
1076
1077 /*
1078 * Check indirect table to make sure that all channels in it
1079 * can be used.
1080 */
1081 for (i = 0; i < NDIS_HASH_INDCNT; ++i) {
1082 if (rss->rss_ind[i] >= nchan) {
1083 if_printf(sc->hn_ifp,
1084 "RSS indirect table %d fixup: %u -> %d\n",
1085 i, rss->rss_ind[i], nchan - 1);
1086 rss->rss_ind[i] = nchan - 1;
1087 }
1088 }
1089 }
1090
1091 static int
hn_ifmedia_upd(struct ifnet * ifp __unused)1092 hn_ifmedia_upd(struct ifnet *ifp __unused)
1093 {
1094
1095 return EOPNOTSUPP;
1096 }
1097
1098 static void
hn_ifmedia_sts(struct ifnet * ifp,struct ifmediareq * ifmr)1099 hn_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
1100 {
1101 struct hn_softc *sc = ifp->if_softc;
1102
1103 ifmr->ifm_status = IFM_AVALID;
1104 ifmr->ifm_active = IFM_ETHER;
1105
1106 if ((sc->hn_link_flags & HN_LINK_FLAG_LINKUP) == 0) {
1107 ifmr->ifm_active |= IFM_NONE;
1108 return;
1109 }
1110 ifmr->ifm_status |= IFM_ACTIVE;
1111 ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
1112 }
1113
1114 static void
hn_rxvf_set_task(void * xarg,int pending __unused)1115 hn_rxvf_set_task(void *xarg, int pending __unused)
1116 {
1117 struct hn_rxvf_setarg *arg = xarg;
1118
1119 arg->rxr->hn_rxvf_ifp = arg->vf_ifp;
1120 }
1121
1122 static void
hn_rxvf_set(struct hn_softc * sc,struct ifnet * vf_ifp)1123 hn_rxvf_set(struct hn_softc *sc, struct ifnet *vf_ifp)
1124 {
1125 struct hn_rx_ring *rxr;
1126 struct hn_rxvf_setarg arg;
1127 struct task task;
1128 int i;
1129
1130 HN_LOCK_ASSERT(sc);
1131
1132 TASK_INIT(&task, 0, hn_rxvf_set_task, &arg);
1133
1134 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
1135 rxr = &sc->hn_rx_ring[i];
1136
1137 if (i < sc->hn_rx_ring_inuse) {
1138 arg.rxr = rxr;
1139 arg.vf_ifp = vf_ifp;
1140 vmbus_chan_run_task(rxr->hn_chan, &task);
1141 } else {
1142 rxr->hn_rxvf_ifp = vf_ifp;
1143 }
1144 }
1145 }
1146
1147 static bool
hn_ismyvf(const struct hn_softc * sc,const struct ifnet * ifp)1148 hn_ismyvf(const struct hn_softc *sc, const struct ifnet *ifp)
1149 {
1150 const struct ifnet *hn_ifp;
1151
1152 hn_ifp = sc->hn_ifp;
1153
1154 if (ifp == hn_ifp)
1155 return (false);
1156
1157 if (ifp->if_alloctype != IFT_ETHER)
1158 return (false);
1159
1160 /* Ignore lagg/vlan interfaces */
1161 if (strcmp(ifp->if_dname, "lagg") == 0 ||
1162 strcmp(ifp->if_dname, "vlan") == 0)
1163 return (false);
1164
1165 /*
1166 * During detach events ifp->if_addr might be NULL.
1167 * Make sure the bcmp() below doesn't panic on that:
1168 */
1169 if (ifp->if_addr == NULL || hn_ifp->if_addr == NULL)
1170 return (false);
1171
1172 if (bcmp(IF_LLADDR(ifp), IF_LLADDR(hn_ifp), ETHER_ADDR_LEN) != 0)
1173 return (false);
1174
1175 return (true);
1176 }
1177
1178 static void
hn_rxvf_change(struct hn_softc * sc,struct ifnet * ifp,bool rxvf)1179 hn_rxvf_change(struct hn_softc *sc, struct ifnet *ifp, bool rxvf)
1180 {
1181 struct ifnet *hn_ifp;
1182
1183 HN_LOCK(sc);
1184
1185 if (!(sc->hn_flags & HN_FLAG_SYNTH_ATTACHED))
1186 goto out;
1187
1188 if (!hn_ismyvf(sc, ifp))
1189 goto out;
1190 hn_ifp = sc->hn_ifp;
1191
1192 if (rxvf) {
1193 if (sc->hn_flags & HN_FLAG_RXVF)
1194 goto out;
1195
1196 sc->hn_flags |= HN_FLAG_RXVF;
1197 hn_rxfilter_config(sc);
1198 } else {
1199 if (!(sc->hn_flags & HN_FLAG_RXVF))
1200 goto out;
1201
1202 sc->hn_flags &= ~HN_FLAG_RXVF;
1203 if (hn_ifp->if_drv_flags & IFF_DRV_RUNNING)
1204 hn_rxfilter_config(sc);
1205 else
1206 hn_set_rxfilter(sc, NDIS_PACKET_TYPE_NONE);
1207 }
1208
1209 hn_nvs_set_datapath(sc,
1210 rxvf ? HN_NVS_DATAPATH_VF : HN_NVS_DATAPATH_SYNTH);
1211
1212 hn_rxvf_set(sc, rxvf ? ifp : NULL);
1213
1214 if (rxvf) {
1215 hn_vf_rss_fixup(sc, true);
1216 hn_suspend_mgmt(sc);
1217 sc->hn_link_flags &=
1218 ~(HN_LINK_FLAG_LINKUP | HN_LINK_FLAG_NETCHG);
1219 if_link_state_change(hn_ifp, LINK_STATE_DOWN);
1220 } else {
1221 hn_vf_rss_restore(sc);
1222 hn_resume_mgmt(sc);
1223 }
1224
1225 devctl_notify("HYPERV_NIC_VF", hn_ifp->if_xname,
1226 rxvf ? "VF_UP" : "VF_DOWN", NULL);
1227
1228 if (bootverbose) {
1229 if_printf(hn_ifp, "datapath is switched %s %s\n",
1230 rxvf ? "to" : "from", ifp->if_xname);
1231 }
1232 out:
1233 HN_UNLOCK(sc);
1234 }
1235
1236 static void
hn_ifnet_event(void * arg,struct ifnet * ifp,int event)1237 hn_ifnet_event(void *arg, struct ifnet *ifp, int event)
1238 {
1239
1240 if (event != IFNET_EVENT_UP && event != IFNET_EVENT_DOWN)
1241 return;
1242 hn_rxvf_change(arg, ifp, event == IFNET_EVENT_UP);
1243 }
1244
1245 static void
hn_ifaddr_event(void * arg,struct ifnet * ifp)1246 hn_ifaddr_event(void *arg, struct ifnet *ifp)
1247 {
1248
1249 hn_rxvf_change(arg, ifp, ifp->if_flags & IFF_UP);
1250 }
1251
1252 static int
hn_xpnt_vf_iocsetcaps(struct hn_softc * sc,struct ifreq * ifr)1253 hn_xpnt_vf_iocsetcaps(struct hn_softc *sc, struct ifreq *ifr)
1254 {
1255 struct ifnet *ifp, *vf_ifp;
1256 uint64_t tmp;
1257 int error;
1258
1259 HN_LOCK_ASSERT(sc);
1260 ifp = sc->hn_ifp;
1261 vf_ifp = sc->hn_vf_ifp;
1262
1263 /*
1264 * Fix up requested capabilities w/ supported capabilities,
1265 * since the supported capabilities could have been changed.
1266 */
1267 ifr->ifr_reqcap &= ifp->if_capabilities;
1268 /* Pass SIOCSIFCAP to VF. */
1269 error = vf_ifp->if_ioctl(vf_ifp, SIOCSIFCAP, (caddr_t)ifr);
1270
1271 /*
1272 * NOTE:
1273 * The error will be propagated to the callers, however, it
1274 * is _not_ useful here.
1275 */
1276
1277 /*
1278 * Merge VF's enabled capabilities.
1279 */
1280 ifp->if_capenable = vf_ifp->if_capenable & ifp->if_capabilities;
1281
1282 tmp = vf_ifp->if_hwassist & HN_CSUM_IP_HWASSIST(sc);
1283 if (ifp->if_capenable & IFCAP_TXCSUM)
1284 ifp->if_hwassist |= tmp;
1285 else
1286 ifp->if_hwassist &= ~tmp;
1287
1288 tmp = vf_ifp->if_hwassist & HN_CSUM_IP6_HWASSIST(sc);
1289 if (ifp->if_capenable & IFCAP_TXCSUM_IPV6)
1290 ifp->if_hwassist |= tmp;
1291 else
1292 ifp->if_hwassist &= ~tmp;
1293
1294 tmp = vf_ifp->if_hwassist & CSUM_IP_TSO;
1295 if (ifp->if_capenable & IFCAP_TSO4)
1296 ifp->if_hwassist |= tmp;
1297 else
1298 ifp->if_hwassist &= ~tmp;
1299
1300 tmp = vf_ifp->if_hwassist & CSUM_IP6_TSO;
1301 if (ifp->if_capenable & IFCAP_TSO6)
1302 ifp->if_hwassist |= tmp;
1303 else
1304 ifp->if_hwassist &= ~tmp;
1305
1306 return (error);
1307 }
1308
1309 static int
hn_xpnt_vf_iocsetflags(struct hn_softc * sc)1310 hn_xpnt_vf_iocsetflags(struct hn_softc *sc)
1311 {
1312 struct ifnet *vf_ifp;
1313 struct ifreq ifr;
1314
1315 HN_LOCK_ASSERT(sc);
1316 vf_ifp = sc->hn_vf_ifp;
1317
1318 memset(&ifr, 0, sizeof(ifr));
1319 strlcpy(ifr.ifr_name, vf_ifp->if_xname, sizeof(ifr.ifr_name));
1320 ifr.ifr_flags = vf_ifp->if_flags & 0xffff;
1321 ifr.ifr_flagshigh = vf_ifp->if_flags >> 16;
1322 return (vf_ifp->if_ioctl(vf_ifp, SIOCSIFFLAGS, (caddr_t)&ifr));
1323 }
1324
1325 static void
hn_xpnt_vf_saveifflags(struct hn_softc * sc)1326 hn_xpnt_vf_saveifflags(struct hn_softc *sc)
1327 {
1328 struct ifnet *ifp = sc->hn_ifp;
1329 int allmulti = 0;
1330
1331 HN_LOCK_ASSERT(sc);
1332
1333 /* XXX vlan(4) style mcast addr maintenance */
1334 if (!CK_STAILQ_EMPTY(&ifp->if_multiaddrs))
1335 allmulti = IFF_ALLMULTI;
1336
1337 /* Always set the VF's if_flags */
1338 sc->hn_vf_ifp->if_flags = ifp->if_flags | allmulti;
1339 }
1340
1341 static void
hn_xpnt_vf_input(struct ifnet * vf_ifp,struct mbuf * m)1342 hn_xpnt_vf_input(struct ifnet *vf_ifp, struct mbuf *m)
1343 {
1344 struct rm_priotracker pt;
1345 struct ifnet *hn_ifp = NULL;
1346 struct mbuf *mn;
1347
1348 /*
1349 * XXX racy, if hn(4) ever detached.
1350 */
1351 rm_rlock(&hn_vfmap_lock, &pt);
1352 if (vf_ifp->if_index < hn_vfmap_size)
1353 hn_ifp = hn_vfmap[vf_ifp->if_index];
1354 rm_runlock(&hn_vfmap_lock, &pt);
1355
1356 if (hn_ifp != NULL) {
1357 for (mn = m; mn != NULL; mn = mn->m_nextpkt) {
1358 /*
1359 * Allow tapping on the VF.
1360 */
1361 ETHER_BPF_MTAP(vf_ifp, mn);
1362
1363 /*
1364 * Update VF stats.
1365 */
1366 if ((vf_ifp->if_capenable & IFCAP_HWSTATS) == 0) {
1367 if_inc_counter(vf_ifp, IFCOUNTER_IBYTES,
1368 mn->m_pkthdr.len);
1369 }
1370 /*
1371 * XXX IFCOUNTER_IMCAST
1372 * This stat updating is kinda invasive, since it
1373 * requires two checks on the mbuf: the length check
1374 * and the ethernet header check. As of this write,
1375 * all multicast packets go directly to hn(4), which
1376 * makes imcast stat updating in the VF a try in vian.
1377 */
1378
1379 /*
1380 * Fix up rcvif and increase hn(4)'s ipackets.
1381 */
1382 mn->m_pkthdr.rcvif = hn_ifp;
1383 if_inc_counter(hn_ifp, IFCOUNTER_IPACKETS, 1);
1384 }
1385 /*
1386 * Go through hn(4)'s if_input.
1387 */
1388 hn_ifp->if_input(hn_ifp, m);
1389 } else {
1390 /*
1391 * In the middle of the transition; free this
1392 * mbuf chain.
1393 */
1394 while (m != NULL) {
1395 mn = m->m_nextpkt;
1396 m->m_nextpkt = NULL;
1397 m_freem(m);
1398 m = mn;
1399 }
1400 }
1401 }
1402
1403 static void
hn_mtu_change_fixup(struct hn_softc * sc)1404 hn_mtu_change_fixup(struct hn_softc *sc)
1405 {
1406 struct ifnet *ifp;
1407
1408 HN_LOCK_ASSERT(sc);
1409 ifp = sc->hn_ifp;
1410
1411 hn_set_tso_maxsize(sc, hn_tso_maxlen, ifp->if_mtu);
1412 #if __FreeBSD_version >= 1100099
1413 if (sc->hn_rx_ring[0].hn_lro.lro_length_lim < HN_LRO_LENLIM_MIN(ifp))
1414 hn_set_lro_lenlim(sc, HN_LRO_LENLIM_MIN(ifp));
1415 #endif
1416 }
1417
1418 static uint32_t
hn_rss_type_fromndis(uint32_t rss_hash)1419 hn_rss_type_fromndis(uint32_t rss_hash)
1420 {
1421 uint32_t types = 0;
1422
1423 if (rss_hash & NDIS_HASH_IPV4)
1424 types |= RSS_TYPE_IPV4;
1425 if (rss_hash & NDIS_HASH_TCP_IPV4)
1426 types |= RSS_TYPE_TCP_IPV4;
1427 if (rss_hash & NDIS_HASH_IPV6)
1428 types |= RSS_TYPE_IPV6;
1429 if (rss_hash & NDIS_HASH_IPV6_EX)
1430 types |= RSS_TYPE_IPV6_EX;
1431 if (rss_hash & NDIS_HASH_TCP_IPV6)
1432 types |= RSS_TYPE_TCP_IPV6;
1433 if (rss_hash & NDIS_HASH_TCP_IPV6_EX)
1434 types |= RSS_TYPE_TCP_IPV6_EX;
1435 if (rss_hash & NDIS_HASH_UDP_IPV4_X)
1436 types |= RSS_TYPE_UDP_IPV4;
1437 return (types);
1438 }
1439
1440 static uint32_t
hn_rss_type_tondis(uint32_t types)1441 hn_rss_type_tondis(uint32_t types)
1442 {
1443 uint32_t rss_hash = 0;
1444
1445 KASSERT((types & (RSS_TYPE_UDP_IPV6 | RSS_TYPE_UDP_IPV6_EX)) == 0,
1446 ("UDP6 and UDP6EX are not supported"));
1447
1448 if (types & RSS_TYPE_IPV4)
1449 rss_hash |= NDIS_HASH_IPV4;
1450 if (types & RSS_TYPE_TCP_IPV4)
1451 rss_hash |= NDIS_HASH_TCP_IPV4;
1452 if (types & RSS_TYPE_IPV6)
1453 rss_hash |= NDIS_HASH_IPV6;
1454 if (types & RSS_TYPE_IPV6_EX)
1455 rss_hash |= NDIS_HASH_IPV6_EX;
1456 if (types & RSS_TYPE_TCP_IPV6)
1457 rss_hash |= NDIS_HASH_TCP_IPV6;
1458 if (types & RSS_TYPE_TCP_IPV6_EX)
1459 rss_hash |= NDIS_HASH_TCP_IPV6_EX;
1460 if (types & RSS_TYPE_UDP_IPV4)
1461 rss_hash |= NDIS_HASH_UDP_IPV4_X;
1462 return (rss_hash);
1463 }
1464
1465 static void
hn_rss_mbuf_hash(struct hn_softc * sc,uint32_t mbuf_hash)1466 hn_rss_mbuf_hash(struct hn_softc *sc, uint32_t mbuf_hash)
1467 {
1468 int i;
1469
1470 HN_LOCK_ASSERT(sc);
1471
1472 for (i = 0; i < sc->hn_rx_ring_cnt; ++i)
1473 sc->hn_rx_ring[i].hn_mbuf_hash = mbuf_hash;
1474 }
1475
1476 static void
hn_vf_rss_fixup(struct hn_softc * sc,bool reconf)1477 hn_vf_rss_fixup(struct hn_softc *sc, bool reconf)
1478 {
1479 struct ifnet *ifp, *vf_ifp;
1480 struct ifrsshash ifrh;
1481 struct ifrsskey ifrk;
1482 int error;
1483 uint32_t my_types, diff_types, mbuf_types = 0;
1484
1485 HN_LOCK_ASSERT(sc);
1486 KASSERT(sc->hn_flags & HN_FLAG_SYNTH_ATTACHED,
1487 ("%s: synthetic parts are not attached", sc->hn_ifp->if_xname));
1488
1489 if (sc->hn_rx_ring_inuse == 1) {
1490 /* No RSS on synthetic parts; done. */
1491 return;
1492 }
1493 if ((sc->hn_rss_hcap & NDIS_HASH_FUNCTION_TOEPLITZ) == 0) {
1494 /* Synthetic parts do not support Toeplitz; done. */
1495 return;
1496 }
1497
1498 ifp = sc->hn_ifp;
1499 vf_ifp = sc->hn_vf_ifp;
1500
1501 /*
1502 * Extract VF's RSS key. Only 40 bytes key for Toeplitz is
1503 * supported.
1504 */
1505 memset(&ifrk, 0, sizeof(ifrk));
1506 strlcpy(ifrk.ifrk_name, vf_ifp->if_xname, sizeof(ifrk.ifrk_name));
1507 error = vf_ifp->if_ioctl(vf_ifp, SIOCGIFRSSKEY, (caddr_t)&ifrk);
1508 if (error) {
1509 if_printf(ifp, "%s SIOCGRSSKEY failed: %d\n",
1510 vf_ifp->if_xname, error);
1511 goto done;
1512 }
1513 if (ifrk.ifrk_func != RSS_FUNC_TOEPLITZ) {
1514 if_printf(ifp, "%s RSS function %u is not Toeplitz\n",
1515 vf_ifp->if_xname, ifrk.ifrk_func);
1516 goto done;
1517 }
1518 if (ifrk.ifrk_keylen != NDIS_HASH_KEYSIZE_TOEPLITZ) {
1519 if_printf(ifp, "%s invalid RSS Toeplitz key length %d\n",
1520 vf_ifp->if_xname, ifrk.ifrk_keylen);
1521 goto done;
1522 }
1523
1524 /*
1525 * Extract VF's RSS hash. Only Toeplitz is supported.
1526 */
1527 memset(&ifrh, 0, sizeof(ifrh));
1528 strlcpy(ifrh.ifrh_name, vf_ifp->if_xname, sizeof(ifrh.ifrh_name));
1529 error = vf_ifp->if_ioctl(vf_ifp, SIOCGIFRSSHASH, (caddr_t)&ifrh);
1530 if (error) {
1531 if_printf(ifp, "%s SIOCGRSSHASH failed: %d\n",
1532 vf_ifp->if_xname, error);
1533 goto done;
1534 }
1535 if (ifrh.ifrh_func != RSS_FUNC_TOEPLITZ) {
1536 if_printf(ifp, "%s RSS function %u is not Toeplitz\n",
1537 vf_ifp->if_xname, ifrh.ifrh_func);
1538 goto done;
1539 }
1540
1541 my_types = hn_rss_type_fromndis(sc->hn_rss_hcap);
1542 if ((ifrh.ifrh_types & my_types) == 0) {
1543 /* This disables RSS; ignore it then */
1544 if_printf(ifp, "%s intersection of RSS types failed. "
1545 "VF %#x, mine %#x\n", vf_ifp->if_xname,
1546 ifrh.ifrh_types, my_types);
1547 goto done;
1548 }
1549
1550 diff_types = my_types ^ ifrh.ifrh_types;
1551 my_types &= ifrh.ifrh_types;
1552 mbuf_types = my_types;
1553
1554 /*
1555 * Detect RSS hash value/type confliction.
1556 *
1557 * NOTE:
1558 * We don't disable the hash type, but stop delivery the hash
1559 * value/type through mbufs on RX path.
1560 *
1561 * XXX If HN_CAP_UDPHASH is set in hn_caps, then UDP 4-tuple
1562 * hash is delivered with type of TCP_IPV4. This means if
1563 * UDP_IPV4 is enabled, then TCP_IPV4 should be forced, at
1564 * least to hn_mbuf_hash. However, given that _all_ of the
1565 * NICs implement TCP_IPV4, this will _not_ impose any issues
1566 * here.
1567 */
1568 if ((my_types & RSS_TYPE_IPV4) &&
1569 (diff_types & ifrh.ifrh_types &
1570 (RSS_TYPE_TCP_IPV4 | RSS_TYPE_UDP_IPV4))) {
1571 /* Conflict; disable IPV4 hash type/value delivery. */
1572 if_printf(ifp, "disable IPV4 mbuf hash delivery\n");
1573 mbuf_types &= ~RSS_TYPE_IPV4;
1574 }
1575 if ((my_types & RSS_TYPE_IPV6) &&
1576 (diff_types & ifrh.ifrh_types &
1577 (RSS_TYPE_TCP_IPV6 | RSS_TYPE_UDP_IPV6 |
1578 RSS_TYPE_TCP_IPV6_EX | RSS_TYPE_UDP_IPV6_EX |
1579 RSS_TYPE_IPV6_EX))) {
1580 /* Conflict; disable IPV6 hash type/value delivery. */
1581 if_printf(ifp, "disable IPV6 mbuf hash delivery\n");
1582 mbuf_types &= ~RSS_TYPE_IPV6;
1583 }
1584 if ((my_types & RSS_TYPE_IPV6_EX) &&
1585 (diff_types & ifrh.ifrh_types &
1586 (RSS_TYPE_TCP_IPV6 | RSS_TYPE_UDP_IPV6 |
1587 RSS_TYPE_TCP_IPV6_EX | RSS_TYPE_UDP_IPV6_EX |
1588 RSS_TYPE_IPV6))) {
1589 /* Conflict; disable IPV6_EX hash type/value delivery. */
1590 if_printf(ifp, "disable IPV6_EX mbuf hash delivery\n");
1591 mbuf_types &= ~RSS_TYPE_IPV6_EX;
1592 }
1593 if ((my_types & RSS_TYPE_TCP_IPV6) &&
1594 (diff_types & ifrh.ifrh_types & RSS_TYPE_TCP_IPV6_EX)) {
1595 /* Conflict; disable TCP_IPV6 hash type/value delivery. */
1596 if_printf(ifp, "disable TCP_IPV6 mbuf hash delivery\n");
1597 mbuf_types &= ~RSS_TYPE_TCP_IPV6;
1598 }
1599 if ((my_types & RSS_TYPE_TCP_IPV6_EX) &&
1600 (diff_types & ifrh.ifrh_types & RSS_TYPE_TCP_IPV6)) {
1601 /* Conflict; disable TCP_IPV6_EX hash type/value delivery. */
1602 if_printf(ifp, "disable TCP_IPV6_EX mbuf hash delivery\n");
1603 mbuf_types &= ~RSS_TYPE_TCP_IPV6_EX;
1604 }
1605 if ((my_types & RSS_TYPE_UDP_IPV6) &&
1606 (diff_types & ifrh.ifrh_types & RSS_TYPE_UDP_IPV6_EX)) {
1607 /* Conflict; disable UDP_IPV6 hash type/value delivery. */
1608 if_printf(ifp, "disable UDP_IPV6 mbuf hash delivery\n");
1609 mbuf_types &= ~RSS_TYPE_UDP_IPV6;
1610 }
1611 if ((my_types & RSS_TYPE_UDP_IPV6_EX) &&
1612 (diff_types & ifrh.ifrh_types & RSS_TYPE_UDP_IPV6)) {
1613 /* Conflict; disable UDP_IPV6_EX hash type/value delivery. */
1614 if_printf(ifp, "disable UDP_IPV6_EX mbuf hash delivery\n");
1615 mbuf_types &= ~RSS_TYPE_UDP_IPV6_EX;
1616 }
1617
1618 /*
1619 * Indirect table does not matter.
1620 */
1621
1622 sc->hn_rss_hash = (sc->hn_rss_hcap & NDIS_HASH_FUNCTION_MASK) |
1623 hn_rss_type_tondis(my_types);
1624 memcpy(sc->hn_rss.rss_key, ifrk.ifrk_key, sizeof(sc->hn_rss.rss_key));
1625 sc->hn_flags |= HN_FLAG_HAS_RSSKEY;
1626
1627 if (reconf) {
1628 error = hn_rss_reconfig(sc);
1629 if (error) {
1630 /* XXX roll-back? */
1631 if_printf(ifp, "hn_rss_reconfig failed: %d\n", error);
1632 /* XXX keep going. */
1633 }
1634 }
1635 done:
1636 /* Hash deliverability for mbufs. */
1637 hn_rss_mbuf_hash(sc, hn_rss_type_tondis(mbuf_types));
1638 }
1639
1640 static void
hn_vf_rss_restore(struct hn_softc * sc)1641 hn_vf_rss_restore(struct hn_softc *sc)
1642 {
1643
1644 HN_LOCK_ASSERT(sc);
1645 KASSERT(sc->hn_flags & HN_FLAG_SYNTH_ATTACHED,
1646 ("%s: synthetic parts are not attached", sc->hn_ifp->if_xname));
1647
1648 if (sc->hn_rx_ring_inuse == 1)
1649 goto done;
1650
1651 /*
1652 * Restore hash types. Key does _not_ matter.
1653 */
1654 if (sc->hn_rss_hash != sc->hn_rss_hcap) {
1655 int error;
1656
1657 sc->hn_rss_hash = sc->hn_rss_hcap;
1658 error = hn_rss_reconfig(sc);
1659 if (error) {
1660 if_printf(sc->hn_ifp, "hn_rss_reconfig failed: %d\n",
1661 error);
1662 /* XXX keep going. */
1663 }
1664 }
1665 done:
1666 /* Hash deliverability for mbufs. */
1667 hn_rss_mbuf_hash(sc, NDIS_HASH_ALL);
1668 }
1669
1670 static void
hn_xpnt_vf_setready(struct hn_softc * sc)1671 hn_xpnt_vf_setready(struct hn_softc *sc)
1672 {
1673 struct ifnet *ifp, *vf_ifp;
1674 struct ifreq ifr;
1675
1676 HN_LOCK_ASSERT(sc);
1677 ifp = sc->hn_ifp;
1678 vf_ifp = sc->hn_vf_ifp;
1679
1680 /*
1681 * Mark the VF ready.
1682 */
1683 sc->hn_vf_rdytick = 0;
1684
1685 /*
1686 * Save information for restoration.
1687 */
1688 sc->hn_saved_caps = ifp->if_capabilities;
1689 sc->hn_saved_tsomax = ifp->if_hw_tsomax;
1690 sc->hn_saved_tsosegcnt = ifp->if_hw_tsomaxsegcount;
1691 sc->hn_saved_tsosegsz = ifp->if_hw_tsomaxsegsize;
1692
1693 /*
1694 * Intersect supported/enabled capabilities.
1695 *
1696 * NOTE:
1697 * if_hwassist is not changed here.
1698 */
1699 ifp->if_capabilities &= vf_ifp->if_capabilities;
1700 ifp->if_capenable &= ifp->if_capabilities;
1701
1702 /*
1703 * Fix TSO settings.
1704 */
1705 if (ifp->if_hw_tsomax > vf_ifp->if_hw_tsomax)
1706 ifp->if_hw_tsomax = vf_ifp->if_hw_tsomax;
1707 if (ifp->if_hw_tsomaxsegcount > vf_ifp->if_hw_tsomaxsegcount)
1708 ifp->if_hw_tsomaxsegcount = vf_ifp->if_hw_tsomaxsegcount;
1709 if (ifp->if_hw_tsomaxsegsize > vf_ifp->if_hw_tsomaxsegsize)
1710 ifp->if_hw_tsomaxsegsize = vf_ifp->if_hw_tsomaxsegsize;
1711
1712 /*
1713 * Change VF's enabled capabilities.
1714 */
1715 memset(&ifr, 0, sizeof(ifr));
1716 strlcpy(ifr.ifr_name, vf_ifp->if_xname, sizeof(ifr.ifr_name));
1717 ifr.ifr_reqcap = ifp->if_capenable;
1718 hn_xpnt_vf_iocsetcaps(sc, &ifr);
1719
1720 if (ifp->if_mtu != ETHERMTU) {
1721 int error;
1722
1723 /*
1724 * Change VF's MTU.
1725 */
1726 memset(&ifr, 0, sizeof(ifr));
1727 strlcpy(ifr.ifr_name, vf_ifp->if_xname, sizeof(ifr.ifr_name));
1728 ifr.ifr_mtu = ifp->if_mtu;
1729 error = vf_ifp->if_ioctl(vf_ifp, SIOCSIFMTU, (caddr_t)&ifr);
1730 if (error) {
1731 if_printf(ifp, "%s SIOCSIFMTU %u failed\n",
1732 vf_ifp->if_xname, ifp->if_mtu);
1733 if (ifp->if_mtu > ETHERMTU) {
1734 if_printf(ifp, "change MTU to %d\n", ETHERMTU);
1735
1736 /*
1737 * XXX
1738 * No need to adjust the synthetic parts' MTU;
1739 * failure of the adjustment will cause us
1740 * infinite headache.
1741 */
1742 ifp->if_mtu = ETHERMTU;
1743 hn_mtu_change_fixup(sc);
1744 }
1745 }
1746 }
1747 }
1748
1749 static bool
hn_xpnt_vf_isready(struct hn_softc * sc)1750 hn_xpnt_vf_isready(struct hn_softc *sc)
1751 {
1752
1753 HN_LOCK_ASSERT(sc);
1754
1755 if (!hn_xpnt_vf || sc->hn_vf_ifp == NULL)
1756 return (false);
1757
1758 if (sc->hn_vf_rdytick == 0)
1759 return (true);
1760
1761 if (sc->hn_vf_rdytick > ticks)
1762 return (false);
1763
1764 /* Mark VF as ready. */
1765 hn_xpnt_vf_setready(sc);
1766 return (true);
1767 }
1768
1769 static void
hn_xpnt_vf_setenable(struct hn_softc * sc)1770 hn_xpnt_vf_setenable(struct hn_softc *sc)
1771 {
1772 int i;
1773
1774 HN_LOCK_ASSERT(sc);
1775
1776 /* NOTE: hn_vf_lock for hn_transmit()/hn_qflush() */
1777 rm_wlock(&sc->hn_vf_lock);
1778 sc->hn_xvf_flags |= HN_XVFFLAG_ENABLED;
1779 rm_wunlock(&sc->hn_vf_lock);
1780
1781 for (i = 0; i < sc->hn_rx_ring_cnt; ++i)
1782 sc->hn_rx_ring[i].hn_rx_flags |= HN_RX_FLAG_XPNT_VF;
1783 }
1784
1785 static void
hn_xpnt_vf_setdisable(struct hn_softc * sc,bool clear_vf)1786 hn_xpnt_vf_setdisable(struct hn_softc *sc, bool clear_vf)
1787 {
1788 int i;
1789
1790 HN_LOCK_ASSERT(sc);
1791
1792 /* NOTE: hn_vf_lock for hn_transmit()/hn_qflush() */
1793 rm_wlock(&sc->hn_vf_lock);
1794 sc->hn_xvf_flags &= ~HN_XVFFLAG_ENABLED;
1795 if (clear_vf)
1796 sc->hn_vf_ifp = NULL;
1797 rm_wunlock(&sc->hn_vf_lock);
1798
1799 for (i = 0; i < sc->hn_rx_ring_cnt; ++i)
1800 sc->hn_rx_ring[i].hn_rx_flags &= ~HN_RX_FLAG_XPNT_VF;
1801 }
1802
1803 static void
hn_xpnt_vf_init(struct hn_softc * sc)1804 hn_xpnt_vf_init(struct hn_softc *sc)
1805 {
1806 int error;
1807
1808 HN_LOCK_ASSERT(sc);
1809
1810 KASSERT((sc->hn_xvf_flags & HN_XVFFLAG_ENABLED) == 0,
1811 ("%s: transparent VF was enabled", sc->hn_ifp->if_xname));
1812
1813 if (bootverbose) {
1814 if_printf(sc->hn_ifp, "try bringing up %s\n",
1815 sc->hn_vf_ifp->if_xname);
1816 }
1817
1818 /*
1819 * Bring the VF up.
1820 */
1821 hn_xpnt_vf_saveifflags(sc);
1822 sc->hn_vf_ifp->if_flags |= IFF_UP;
1823 error = hn_xpnt_vf_iocsetflags(sc);
1824 if (error) {
1825 if_printf(sc->hn_ifp, "bringing up %s failed: %d\n",
1826 sc->hn_vf_ifp->if_xname, error);
1827 return;
1828 }
1829
1830 /*
1831 * NOTE:
1832 * Datapath setting must happen _after_ bringing the VF up.
1833 */
1834 hn_nvs_set_datapath(sc, HN_NVS_DATAPATH_VF);
1835
1836 /*
1837 * NOTE:
1838 * Fixup RSS related bits _after_ the VF is brought up, since
1839 * many VFs generate RSS key during it's initialization.
1840 */
1841 hn_vf_rss_fixup(sc, true);
1842
1843 /* Mark transparent mode VF as enabled. */
1844 hn_xpnt_vf_setenable(sc);
1845 }
1846
1847 static void
hn_xpnt_vf_init_taskfunc(void * xsc,int pending __unused)1848 hn_xpnt_vf_init_taskfunc(void *xsc, int pending __unused)
1849 {
1850 struct hn_softc *sc = xsc;
1851
1852 HN_LOCK(sc);
1853
1854 if ((sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) == 0)
1855 goto done;
1856 if (sc->hn_vf_ifp == NULL)
1857 goto done;
1858 if (sc->hn_xvf_flags & HN_XVFFLAG_ENABLED)
1859 goto done;
1860
1861 if (sc->hn_vf_rdytick != 0) {
1862 /* Mark VF as ready. */
1863 hn_xpnt_vf_setready(sc);
1864 }
1865
1866 if (sc->hn_ifp->if_drv_flags & IFF_DRV_RUNNING) {
1867 /*
1868 * Delayed VF initialization.
1869 */
1870 if (bootverbose) {
1871 if_printf(sc->hn_ifp, "delayed initialize %s\n",
1872 sc->hn_vf_ifp->if_xname);
1873 }
1874 hn_xpnt_vf_init(sc);
1875 }
1876 done:
1877 HN_UNLOCK(sc);
1878 }
1879
1880 static void
hn_ifnet_attevent(void * xsc,struct ifnet * ifp)1881 hn_ifnet_attevent(void *xsc, struct ifnet *ifp)
1882 {
1883 struct hn_softc *sc = xsc;
1884
1885 HN_LOCK(sc);
1886
1887 if (!(sc->hn_flags & HN_FLAG_SYNTH_ATTACHED))
1888 goto done;
1889
1890 if (!hn_ismyvf(sc, ifp))
1891 goto done;
1892
1893 if (sc->hn_vf_ifp != NULL) {
1894 if_printf(sc->hn_ifp, "%s was attached as VF\n",
1895 sc->hn_vf_ifp->if_xname);
1896 goto done;
1897 }
1898
1899 if (hn_xpnt_vf && ifp->if_start != NULL) {
1900 /*
1901 * ifnet.if_start is _not_ supported by transparent
1902 * mode VF; mainly due to the IFF_DRV_OACTIVE flag.
1903 */
1904 if_printf(sc->hn_ifp, "%s uses if_start, which is unsupported "
1905 "in transparent VF mode.\n", ifp->if_xname);
1906 goto done;
1907 }
1908
1909 rm_wlock(&hn_vfmap_lock);
1910
1911 if (ifp->if_index >= hn_vfmap_size) {
1912 struct ifnet **newmap;
1913 int newsize;
1914
1915 newsize = ifp->if_index + HN_VFMAP_SIZE_DEF;
1916 newmap = malloc(sizeof(struct ifnet *) * newsize, M_DEVBUF,
1917 M_WAITOK | M_ZERO);
1918
1919 memcpy(newmap, hn_vfmap,
1920 sizeof(struct ifnet *) * hn_vfmap_size);
1921 free(hn_vfmap, M_DEVBUF);
1922 hn_vfmap = newmap;
1923 hn_vfmap_size = newsize;
1924 }
1925 KASSERT(hn_vfmap[ifp->if_index] == NULL,
1926 ("%s: ifindex %d was mapped to %s",
1927 ifp->if_xname, ifp->if_index, hn_vfmap[ifp->if_index]->if_xname));
1928 hn_vfmap[ifp->if_index] = sc->hn_ifp;
1929
1930 rm_wunlock(&hn_vfmap_lock);
1931
1932 /* NOTE: hn_vf_lock for hn_transmit()/hn_qflush() */
1933 rm_wlock(&sc->hn_vf_lock);
1934 KASSERT((sc->hn_xvf_flags & HN_XVFFLAG_ENABLED) == 0,
1935 ("%s: transparent VF was enabled", sc->hn_ifp->if_xname));
1936 sc->hn_vf_ifp = ifp;
1937 rm_wunlock(&sc->hn_vf_lock);
1938
1939 if (hn_xpnt_vf) {
1940 int wait_ticks;
1941
1942 /*
1943 * Install if_input for vf_ifp, which does vf_ifp -> hn_ifp.
1944 * Save vf_ifp's current if_input for later restoration.
1945 */
1946 sc->hn_vf_input = ifp->if_input;
1947 ifp->if_input = hn_xpnt_vf_input;
1948
1949 /*
1950 * Stop link status management; use the VF's.
1951 */
1952 hn_suspend_mgmt(sc);
1953
1954 /*
1955 * Give VF sometime to complete its attach routing.
1956 */
1957 wait_ticks = hn_xpnt_vf_attwait * hz;
1958 sc->hn_vf_rdytick = ticks + wait_ticks;
1959
1960 taskqueue_enqueue_timeout(sc->hn_vf_taskq, &sc->hn_vf_init,
1961 wait_ticks);
1962 }
1963 done:
1964 HN_UNLOCK(sc);
1965 }
1966
1967 static void
hn_ifnet_detevent(void * xsc,struct ifnet * ifp)1968 hn_ifnet_detevent(void *xsc, struct ifnet *ifp)
1969 {
1970 struct hn_softc *sc = xsc;
1971
1972 HN_LOCK(sc);
1973
1974 if (sc->hn_vf_ifp == NULL)
1975 goto done;
1976
1977 if (!hn_ismyvf(sc, ifp))
1978 goto done;
1979
1980 if (hn_xpnt_vf) {
1981 /*
1982 * Make sure that the delayed initialization is not running.
1983 *
1984 * NOTE:
1985 * - This lock _must_ be released, since the hn_vf_init task
1986 * will try holding this lock.
1987 * - It is safe to release this lock here, since the
1988 * hn_ifnet_attevent() is interlocked by the hn_vf_ifp.
1989 *
1990 * XXX racy, if hn(4) ever detached.
1991 */
1992 HN_UNLOCK(sc);
1993 taskqueue_drain_timeout(sc->hn_vf_taskq, &sc->hn_vf_init);
1994 HN_LOCK(sc);
1995
1996 KASSERT(sc->hn_vf_input != NULL, ("%s VF input is not saved",
1997 sc->hn_ifp->if_xname));
1998 ifp->if_input = sc->hn_vf_input;
1999 sc->hn_vf_input = NULL;
2000
2001 if ((sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) &&
2002 (sc->hn_xvf_flags & HN_XVFFLAG_ENABLED))
2003 hn_nvs_set_datapath(sc, HN_NVS_DATAPATH_SYNTH);
2004
2005 if (sc->hn_vf_rdytick == 0) {
2006 /*
2007 * The VF was ready; restore some settings.
2008 */
2009 sc->hn_ifp->if_capabilities = sc->hn_saved_caps;
2010 /*
2011 * NOTE:
2012 * There is _no_ need to fixup if_capenable and
2013 * if_hwassist, since the if_capabilities before
2014 * restoration was an intersection of the VF's
2015 * if_capabilites and the synthetic device's
2016 * if_capabilites.
2017 */
2018 sc->hn_ifp->if_hw_tsomax = sc->hn_saved_tsomax;
2019 sc->hn_ifp->if_hw_tsomaxsegcount =
2020 sc->hn_saved_tsosegcnt;
2021 sc->hn_ifp->if_hw_tsomaxsegsize = sc->hn_saved_tsosegsz;
2022 }
2023
2024 if (sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) {
2025 /*
2026 * Restore RSS settings.
2027 */
2028 hn_vf_rss_restore(sc);
2029
2030 /*
2031 * Resume link status management, which was suspended
2032 * by hn_ifnet_attevent().
2033 */
2034 hn_resume_mgmt(sc);
2035 }
2036 }
2037
2038 /* Mark transparent mode VF as disabled. */
2039 hn_xpnt_vf_setdisable(sc, true /* clear hn_vf_ifp */);
2040
2041 rm_wlock(&hn_vfmap_lock);
2042
2043 KASSERT(ifp->if_index < hn_vfmap_size,
2044 ("ifindex %d, vfmapsize %d", ifp->if_index, hn_vfmap_size));
2045 if (hn_vfmap[ifp->if_index] != NULL) {
2046 KASSERT(hn_vfmap[ifp->if_index] == sc->hn_ifp,
2047 ("%s: ifindex %d was mapped to %s",
2048 ifp->if_xname, ifp->if_index,
2049 hn_vfmap[ifp->if_index]->if_xname));
2050 hn_vfmap[ifp->if_index] = NULL;
2051 }
2052
2053 rm_wunlock(&hn_vfmap_lock);
2054 done:
2055 HN_UNLOCK(sc);
2056 }
2057
2058 static void
hn_ifnet_lnkevent(void * xsc,struct ifnet * ifp,int link_state)2059 hn_ifnet_lnkevent(void *xsc, struct ifnet *ifp, int link_state)
2060 {
2061 struct hn_softc *sc = xsc;
2062
2063 if (sc->hn_vf_ifp == ifp)
2064 if_link_state_change(sc->hn_ifp, link_state);
2065 }
2066
2067 static int
hn_probe(device_t dev)2068 hn_probe(device_t dev)
2069 {
2070
2071 if (VMBUS_PROBE_GUID(device_get_parent(dev), dev, &hn_guid) == 0) {
2072 device_set_desc(dev, "Hyper-V Network Interface");
2073 return BUS_PROBE_DEFAULT;
2074 }
2075 return ENXIO;
2076 }
2077
2078 static int
hn_attach(device_t dev)2079 hn_attach(device_t dev)
2080 {
2081 struct hn_softc *sc = device_get_softc(dev);
2082 struct sysctl_oid_list *child;
2083 struct sysctl_ctx_list *ctx;
2084 uint8_t eaddr[ETHER_ADDR_LEN];
2085 struct ifnet *ifp = NULL;
2086 int error, ring_cnt, tx_ring_cnt;
2087 uint32_t mtu;
2088
2089 sc->hn_dev = dev;
2090 sc->hn_prichan = vmbus_get_channel(dev);
2091 HN_LOCK_INIT(sc);
2092 rm_init(&sc->hn_vf_lock, "hnvf");
2093 if (hn_xpnt_vf && hn_xpnt_vf_accbpf)
2094 sc->hn_xvf_flags |= HN_XVFFLAG_ACCBPF;
2095
2096 /*
2097 * Initialize these tunables once.
2098 */
2099 sc->hn_agg_size = hn_tx_agg_size;
2100 sc->hn_agg_pkts = hn_tx_agg_pkts;
2101
2102 /*
2103 * Setup taskqueue for transmission.
2104 */
2105 if (hn_tx_taskq_mode == HN_TX_TASKQ_M_INDEP) {
2106 int i;
2107
2108 sc->hn_tx_taskqs =
2109 malloc(hn_tx_taskq_cnt * sizeof(struct taskqueue *),
2110 M_DEVBUF, M_WAITOK);
2111 for (i = 0; i < hn_tx_taskq_cnt; ++i) {
2112 sc->hn_tx_taskqs[i] = taskqueue_create("hn_tx",
2113 M_WAITOK, taskqueue_thread_enqueue,
2114 &sc->hn_tx_taskqs[i]);
2115 taskqueue_start_threads(&sc->hn_tx_taskqs[i], 1, PI_NET,
2116 "%s tx%d", device_get_nameunit(dev), i);
2117 }
2118 } else if (hn_tx_taskq_mode == HN_TX_TASKQ_M_GLOBAL) {
2119 sc->hn_tx_taskqs = hn_tx_taskque;
2120 }
2121
2122 /*
2123 * Setup taskqueue for mangement tasks, e.g. link status.
2124 */
2125 sc->hn_mgmt_taskq0 = taskqueue_create("hn_mgmt", M_WAITOK,
2126 taskqueue_thread_enqueue, &sc->hn_mgmt_taskq0);
2127 taskqueue_start_threads(&sc->hn_mgmt_taskq0, 1, PI_NET, "%s mgmt",
2128 device_get_nameunit(dev));
2129 TASK_INIT(&sc->hn_link_task, 0, hn_link_taskfunc, sc);
2130 TASK_INIT(&sc->hn_netchg_init, 0, hn_netchg_init_taskfunc, sc);
2131 TIMEOUT_TASK_INIT(sc->hn_mgmt_taskq0, &sc->hn_netchg_status, 0,
2132 hn_netchg_status_taskfunc, sc);
2133
2134 if (hn_xpnt_vf) {
2135 /*
2136 * Setup taskqueue for VF tasks, e.g. delayed VF bringing up.
2137 */
2138 sc->hn_vf_taskq = taskqueue_create("hn_vf", M_WAITOK,
2139 taskqueue_thread_enqueue, &sc->hn_vf_taskq);
2140 taskqueue_start_threads(&sc->hn_vf_taskq, 1, PI_NET, "%s vf",
2141 device_get_nameunit(dev));
2142 TIMEOUT_TASK_INIT(sc->hn_vf_taskq, &sc->hn_vf_init, 0,
2143 hn_xpnt_vf_init_taskfunc, sc);
2144 }
2145
2146 /*
2147 * Allocate ifnet and setup its name earlier, so that if_printf
2148 * can be used by functions, which will be called after
2149 * ether_ifattach().
2150 */
2151 ifp = sc->hn_ifp = if_alloc(IFT_ETHER);
2152 ifp->if_softc = sc;
2153 if_initname(ifp, device_get_name(dev), device_get_unit(dev));
2154
2155 /*
2156 * Initialize ifmedia earlier so that it can be unconditionally
2157 * destroyed, if error happened later on.
2158 */
2159 ifmedia_init(&sc->hn_media, 0, hn_ifmedia_upd, hn_ifmedia_sts);
2160
2161 /*
2162 * Figure out the # of RX rings (ring_cnt) and the # of TX rings
2163 * to use (tx_ring_cnt).
2164 *
2165 * NOTE:
2166 * The # of RX rings to use is same as the # of channels to use.
2167 */
2168 ring_cnt = hn_chan_cnt;
2169 if (ring_cnt <= 0) {
2170 /* Default */
2171 ring_cnt = mp_ncpus;
2172 if (ring_cnt > HN_RING_CNT_DEF_MAX)
2173 ring_cnt = HN_RING_CNT_DEF_MAX;
2174 } else if (ring_cnt > mp_ncpus) {
2175 ring_cnt = mp_ncpus;
2176 }
2177 #ifdef RSS
2178 if (ring_cnt > rss_getnumbuckets())
2179 ring_cnt = rss_getnumbuckets();
2180 #endif
2181
2182 tx_ring_cnt = hn_tx_ring_cnt;
2183 if (tx_ring_cnt <= 0 || tx_ring_cnt > ring_cnt)
2184 tx_ring_cnt = ring_cnt;
2185 #ifdef HN_IFSTART_SUPPORT
2186 if (hn_use_if_start) {
2187 /* ifnet.if_start only needs one TX ring. */
2188 tx_ring_cnt = 1;
2189 }
2190 #endif
2191
2192 /*
2193 * Set the leader CPU for channels.
2194 */
2195 sc->hn_cpu = atomic_fetchadd_int(&hn_cpu_index, ring_cnt) % mp_ncpus;
2196
2197 /*
2198 * Create enough TX/RX rings, even if only limited number of
2199 * channels can be allocated.
2200 */
2201 error = hn_create_tx_data(sc, tx_ring_cnt);
2202 if (error)
2203 goto failed;
2204 error = hn_create_rx_data(sc, ring_cnt);
2205 if (error)
2206 goto failed;
2207
2208 /*
2209 * Create transaction context for NVS and RNDIS transactions.
2210 */
2211 sc->hn_xact = vmbus_xact_ctx_create(bus_get_dma_tag(dev),
2212 HN_XACT_REQ_SIZE, HN_XACT_RESP_SIZE, 0);
2213 if (sc->hn_xact == NULL) {
2214 error = ENXIO;
2215 goto failed;
2216 }
2217
2218 /*
2219 * Install orphan handler for the revocation of this device's
2220 * primary channel.
2221 *
2222 * NOTE:
2223 * The processing order is critical here:
2224 * Install the orphan handler, _before_ testing whether this
2225 * device's primary channel has been revoked or not.
2226 */
2227 vmbus_chan_set_orphan(sc->hn_prichan, sc->hn_xact);
2228 if (vmbus_chan_is_revoked(sc->hn_prichan)) {
2229 error = ENXIO;
2230 goto failed;
2231 }
2232
2233 /*
2234 * Attach the synthetic parts, i.e. NVS and RNDIS.
2235 */
2236 error = hn_synth_attach(sc, ETHERMTU);
2237 if (error)
2238 goto failed;
2239
2240 error = hn_rndis_get_eaddr(sc, eaddr);
2241 if (error)
2242 goto failed;
2243
2244 error = hn_rndis_get_mtu(sc, &mtu);
2245 if (error)
2246 mtu = ETHERMTU;
2247 else if (bootverbose)
2248 device_printf(dev, "RNDIS mtu %u\n", mtu);
2249
2250 #if __FreeBSD_version >= 1100099
2251 if (sc->hn_rx_ring_inuse > 1) {
2252 /*
2253 * Reduce TCP segment aggregation limit for multiple
2254 * RX rings to increase ACK timeliness.
2255 */
2256 hn_set_lro_lenlim(sc, HN_LRO_LENLIM_MULTIRX_DEF);
2257 }
2258 #endif
2259
2260 /*
2261 * Fixup TX/RX stuffs after synthetic parts are attached.
2262 */
2263 hn_fixup_tx_data(sc);
2264 hn_fixup_rx_data(sc);
2265
2266 ctx = device_get_sysctl_ctx(dev);
2267 child = SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
2268 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "nvs_version", CTLFLAG_RD,
2269 &sc->hn_nvs_ver, 0, "NVS version");
2270 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "ndis_version",
2271 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
2272 hn_ndis_version_sysctl, "A", "NDIS version");
2273 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "caps",
2274 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
2275 hn_caps_sysctl, "A", "capabilities");
2276 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "hwassist",
2277 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
2278 hn_hwassist_sysctl, "A", "hwassist");
2279 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "tso_max",
2280 CTLFLAG_RD, &ifp->if_hw_tsomax, 0, "max TSO size");
2281 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "tso_maxsegcnt",
2282 CTLFLAG_RD, &ifp->if_hw_tsomaxsegcount, 0,
2283 "max # of TSO segments");
2284 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "tso_maxsegsz",
2285 CTLFLAG_RD, &ifp->if_hw_tsomaxsegsize, 0,
2286 "max size of TSO segment");
2287 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rxfilter",
2288 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
2289 hn_rxfilter_sysctl, "A", "rxfilter");
2290 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rss_hash",
2291 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
2292 hn_rss_hash_sysctl, "A", "RSS hash");
2293 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rss_hashcap",
2294 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
2295 hn_rss_hcap_sysctl, "A", "RSS hash capabilities");
2296 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "mbuf_hash",
2297 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
2298 hn_rss_mbuf_sysctl, "A", "RSS hash for mbufs");
2299 SYSCTL_ADD_INT(ctx, child, OID_AUTO, "rss_ind_size",
2300 CTLFLAG_RD, &sc->hn_rss_ind_size, 0, "RSS indirect entry count");
2301 #ifndef RSS
2302 /*
2303 * Don't allow RSS key/indirect table changes, if RSS is defined.
2304 */
2305 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rss_key",
2306 CTLTYPE_OPAQUE | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
2307 hn_rss_key_sysctl, "IU", "RSS key");
2308 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rss_ind",
2309 CTLTYPE_OPAQUE | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
2310 hn_rss_ind_sysctl, "IU", "RSS indirect table");
2311 #endif
2312 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "rndis_agg_size",
2313 CTLFLAG_RD, &sc->hn_rndis_agg_size, 0,
2314 "RNDIS offered packet transmission aggregation size limit");
2315 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "rndis_agg_pkts",
2316 CTLFLAG_RD, &sc->hn_rndis_agg_pkts, 0,
2317 "RNDIS offered packet transmission aggregation count limit");
2318 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "rndis_agg_align",
2319 CTLFLAG_RD, &sc->hn_rndis_agg_align, 0,
2320 "RNDIS packet transmission aggregation alignment");
2321 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "agg_size",
2322 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
2323 hn_txagg_size_sysctl, "I",
2324 "Packet transmission aggregation size, 0 -- disable, -1 -- auto");
2325 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "agg_pkts",
2326 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
2327 hn_txagg_pkts_sysctl, "I",
2328 "Packet transmission aggregation packets, "
2329 "0 -- disable, -1 -- auto");
2330 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "polling",
2331 CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
2332 hn_polling_sysctl, "I",
2333 "Polling frequency: [100,1000000], 0 disable polling");
2334 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "vf",
2335 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
2336 hn_vf_sysctl, "A", "Virtual Function's name");
2337 if (!hn_xpnt_vf) {
2338 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rxvf",
2339 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
2340 hn_rxvf_sysctl, "A", "activated Virtual Function's name");
2341 } else {
2342 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "vf_xpnt_enabled",
2343 CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
2344 hn_xpnt_vf_enabled_sysctl, "I",
2345 "Transparent VF enabled");
2346 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "vf_xpnt_accbpf",
2347 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
2348 hn_xpnt_vf_accbpf_sysctl, "I",
2349 "Accurate BPF for transparent VF");
2350 }
2351
2352 /*
2353 * Setup the ifmedia, which has been initialized earlier.
2354 */
2355 ifmedia_add(&sc->hn_media, IFM_ETHER | IFM_AUTO, 0, NULL);
2356 ifmedia_set(&sc->hn_media, IFM_ETHER | IFM_AUTO);
2357 /* XXX ifmedia_set really should do this for us */
2358 sc->hn_media.ifm_media = sc->hn_media.ifm_cur->ifm_media;
2359
2360 /*
2361 * Setup the ifnet for this interface.
2362 */
2363
2364 ifp->if_baudrate = IF_Gbps(10);
2365 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
2366 ifp->if_ioctl = hn_ioctl;
2367 ifp->if_init = hn_init;
2368 #ifdef HN_IFSTART_SUPPORT
2369 if (hn_use_if_start) {
2370 int qdepth = hn_get_txswq_depth(&sc->hn_tx_ring[0]);
2371
2372 ifp->if_start = hn_start;
2373 IFQ_SET_MAXLEN(&ifp->if_snd, qdepth);
2374 ifp->if_snd.ifq_drv_maxlen = qdepth - 1;
2375 IFQ_SET_READY(&ifp->if_snd);
2376 } else
2377 #endif
2378 {
2379 ifp->if_transmit = hn_transmit;
2380 ifp->if_qflush = hn_xmit_qflush;
2381 }
2382
2383 ifp->if_capabilities |= IFCAP_RXCSUM | IFCAP_LRO | IFCAP_LINKSTATE;
2384 #ifdef foo
2385 /* We can't diff IPv6 packets from IPv4 packets on RX path. */
2386 ifp->if_capabilities |= IFCAP_RXCSUM_IPV6;
2387 #endif
2388 if (sc->hn_caps & HN_CAP_VLAN) {
2389 /* XXX not sure about VLAN_MTU. */
2390 ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
2391 }
2392
2393 ifp->if_hwassist = sc->hn_tx_ring[0].hn_csum_assist;
2394 if (ifp->if_hwassist & HN_CSUM_IP_MASK)
2395 ifp->if_capabilities |= IFCAP_TXCSUM;
2396 if (ifp->if_hwassist & HN_CSUM_IP6_MASK)
2397 ifp->if_capabilities |= IFCAP_TXCSUM_IPV6;
2398 if (sc->hn_caps & HN_CAP_TSO4) {
2399 ifp->if_capabilities |= IFCAP_TSO4;
2400 ifp->if_hwassist |= CSUM_IP_TSO;
2401 }
2402 if (sc->hn_caps & HN_CAP_TSO6) {
2403 ifp->if_capabilities |= IFCAP_TSO6;
2404 ifp->if_hwassist |= CSUM_IP6_TSO;
2405 }
2406
2407 /* Enable all available capabilities by default. */
2408 ifp->if_capenable = ifp->if_capabilities;
2409
2410 /*
2411 * Disable IPv6 TSO and TXCSUM by default, they still can
2412 * be enabled through SIOCSIFCAP.
2413 */
2414 ifp->if_capenable &= ~(IFCAP_TXCSUM_IPV6 | IFCAP_TSO6);
2415 ifp->if_hwassist &= ~(HN_CSUM_IP6_MASK | CSUM_IP6_TSO);
2416
2417 if (ifp->if_capabilities & (IFCAP_TSO6 | IFCAP_TSO4)) {
2418 /*
2419 * Lock hn_set_tso_maxsize() to simplify its
2420 * internal logic.
2421 */
2422 HN_LOCK(sc);
2423 hn_set_tso_maxsize(sc, hn_tso_maxlen, ETHERMTU);
2424 HN_UNLOCK(sc);
2425 ifp->if_hw_tsomaxsegcount = HN_TX_DATA_SEGCNT_MAX;
2426 ifp->if_hw_tsomaxsegsize = PAGE_SIZE;
2427 }
2428
2429 ether_ifattach(ifp, eaddr);
2430
2431 if ((ifp->if_capabilities & (IFCAP_TSO6 | IFCAP_TSO4)) && bootverbose) {
2432 if_printf(ifp, "TSO segcnt %u segsz %u\n",
2433 ifp->if_hw_tsomaxsegcount, ifp->if_hw_tsomaxsegsize);
2434 }
2435 if (mtu < ETHERMTU) {
2436 if_printf(ifp, "fixup mtu %u -> %u\n", ifp->if_mtu, mtu);
2437 ifp->if_mtu = mtu;
2438 }
2439
2440 /* Inform the upper layer about the long frame support. */
2441 ifp->if_hdrlen = sizeof(struct ether_vlan_header);
2442
2443 /*
2444 * Kick off link status check.
2445 */
2446 sc->hn_mgmt_taskq = sc->hn_mgmt_taskq0;
2447 hn_update_link_status(sc);
2448
2449 if (!hn_xpnt_vf) {
2450 sc->hn_ifnet_evthand = EVENTHANDLER_REGISTER(ifnet_event,
2451 hn_ifnet_event, sc, EVENTHANDLER_PRI_ANY);
2452 sc->hn_ifaddr_evthand = EVENTHANDLER_REGISTER(ifaddr_event,
2453 hn_ifaddr_event, sc, EVENTHANDLER_PRI_ANY);
2454 } else {
2455 sc->hn_ifnet_lnkhand = EVENTHANDLER_REGISTER(ifnet_link_event,
2456 hn_ifnet_lnkevent, sc, EVENTHANDLER_PRI_ANY);
2457 }
2458
2459 /*
2460 * NOTE:
2461 * Subscribe ether_ifattach event, instead of ifnet_arrival event,
2462 * since interface's LLADDR is needed; interface LLADDR is not
2463 * available when ifnet_arrival event is triggered.
2464 */
2465 sc->hn_ifnet_atthand = EVENTHANDLER_REGISTER(ether_ifattach_event,
2466 hn_ifnet_attevent, sc, EVENTHANDLER_PRI_ANY);
2467 sc->hn_ifnet_dethand = EVENTHANDLER_REGISTER(ifnet_departure_event,
2468 hn_ifnet_detevent, sc, EVENTHANDLER_PRI_ANY);
2469
2470 return (0);
2471 failed:
2472 if (sc->hn_flags & HN_FLAG_SYNTH_ATTACHED)
2473 hn_synth_detach(sc);
2474 hn_detach(dev);
2475 return (error);
2476 }
2477
2478 static int
hn_detach(device_t dev)2479 hn_detach(device_t dev)
2480 {
2481 struct hn_softc *sc = device_get_softc(dev);
2482 struct ifnet *ifp = sc->hn_ifp, *vf_ifp;
2483
2484 if (sc->hn_xact != NULL && vmbus_chan_is_revoked(sc->hn_prichan)) {
2485 /*
2486 * In case that the vmbus missed the orphan handler
2487 * installation.
2488 */
2489 vmbus_xact_ctx_orphan(sc->hn_xact);
2490 }
2491
2492 if (sc->hn_ifaddr_evthand != NULL)
2493 EVENTHANDLER_DEREGISTER(ifaddr_event, sc->hn_ifaddr_evthand);
2494 if (sc->hn_ifnet_evthand != NULL)
2495 EVENTHANDLER_DEREGISTER(ifnet_event, sc->hn_ifnet_evthand);
2496 if (sc->hn_ifnet_atthand != NULL) {
2497 EVENTHANDLER_DEREGISTER(ether_ifattach_event,
2498 sc->hn_ifnet_atthand);
2499 }
2500 if (sc->hn_ifnet_dethand != NULL) {
2501 EVENTHANDLER_DEREGISTER(ifnet_departure_event,
2502 sc->hn_ifnet_dethand);
2503 }
2504 if (sc->hn_ifnet_lnkhand != NULL)
2505 EVENTHANDLER_DEREGISTER(ifnet_link_event, sc->hn_ifnet_lnkhand);
2506
2507 vf_ifp = sc->hn_vf_ifp;
2508 __compiler_membar();
2509 if (vf_ifp != NULL)
2510 hn_ifnet_detevent(sc, vf_ifp);
2511
2512 if (device_is_attached(dev)) {
2513 HN_LOCK(sc);
2514 if (sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) {
2515 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
2516 hn_stop(sc, true);
2517 /*
2518 * NOTE:
2519 * hn_stop() only suspends data, so managment
2520 * stuffs have to be suspended manually here.
2521 */
2522 hn_suspend_mgmt(sc);
2523 hn_synth_detach(sc);
2524 }
2525 HN_UNLOCK(sc);
2526 ether_ifdetach(ifp);
2527 }
2528
2529 ifmedia_removeall(&sc->hn_media);
2530 hn_destroy_rx_data(sc);
2531 hn_destroy_tx_data(sc);
2532
2533 if (sc->hn_tx_taskqs != NULL && sc->hn_tx_taskqs != hn_tx_taskque) {
2534 int i;
2535
2536 for (i = 0; i < hn_tx_taskq_cnt; ++i)
2537 taskqueue_free(sc->hn_tx_taskqs[i]);
2538 free(sc->hn_tx_taskqs, M_DEVBUF);
2539 }
2540 taskqueue_free(sc->hn_mgmt_taskq0);
2541 if (sc->hn_vf_taskq != NULL)
2542 taskqueue_free(sc->hn_vf_taskq);
2543
2544 if (sc->hn_xact != NULL) {
2545 /*
2546 * Uninstall the orphan handler _before_ the xact is
2547 * destructed.
2548 */
2549 vmbus_chan_unset_orphan(sc->hn_prichan);
2550 vmbus_xact_ctx_destroy(sc->hn_xact);
2551 }
2552
2553 if_free(ifp);
2554
2555 HN_LOCK_DESTROY(sc);
2556 rm_destroy(&sc->hn_vf_lock);
2557 return (0);
2558 }
2559
2560 static int
hn_shutdown(device_t dev)2561 hn_shutdown(device_t dev)
2562 {
2563
2564 return (0);
2565 }
2566
2567 static void
hn_link_status(struct hn_softc * sc)2568 hn_link_status(struct hn_softc *sc)
2569 {
2570 uint32_t link_status;
2571 int error;
2572
2573 error = hn_rndis_get_linkstatus(sc, &link_status);
2574 if (error) {
2575 /* XXX what to do? */
2576 return;
2577 }
2578
2579 if (link_status == NDIS_MEDIA_STATE_CONNECTED)
2580 sc->hn_link_flags |= HN_LINK_FLAG_LINKUP;
2581 else
2582 sc->hn_link_flags &= ~HN_LINK_FLAG_LINKUP;
2583 if_link_state_change(sc->hn_ifp,
2584 (sc->hn_link_flags & HN_LINK_FLAG_LINKUP) ?
2585 LINK_STATE_UP : LINK_STATE_DOWN);
2586 }
2587
2588 static void
hn_link_taskfunc(void * xsc,int pending __unused)2589 hn_link_taskfunc(void *xsc, int pending __unused)
2590 {
2591 struct hn_softc *sc = xsc;
2592
2593 if (sc->hn_link_flags & HN_LINK_FLAG_NETCHG)
2594 return;
2595 hn_link_status(sc);
2596 }
2597
2598 static void
hn_netchg_init_taskfunc(void * xsc,int pending __unused)2599 hn_netchg_init_taskfunc(void *xsc, int pending __unused)
2600 {
2601 struct hn_softc *sc = xsc;
2602
2603 /* Prevent any link status checks from running. */
2604 sc->hn_link_flags |= HN_LINK_FLAG_NETCHG;
2605
2606 /*
2607 * Fake up a [link down --> link up] state change; 5 seconds
2608 * delay is used, which closely simulates miibus reaction
2609 * upon link down event.
2610 */
2611 sc->hn_link_flags &= ~HN_LINK_FLAG_LINKUP;
2612 if_link_state_change(sc->hn_ifp, LINK_STATE_DOWN);
2613 taskqueue_enqueue_timeout(sc->hn_mgmt_taskq0,
2614 &sc->hn_netchg_status, 5 * hz);
2615 }
2616
2617 static void
hn_netchg_status_taskfunc(void * xsc,int pending __unused)2618 hn_netchg_status_taskfunc(void *xsc, int pending __unused)
2619 {
2620 struct hn_softc *sc = xsc;
2621
2622 /* Re-allow link status checks. */
2623 sc->hn_link_flags &= ~HN_LINK_FLAG_NETCHG;
2624 hn_link_status(sc);
2625 }
2626
2627 static void
hn_update_link_status(struct hn_softc * sc)2628 hn_update_link_status(struct hn_softc *sc)
2629 {
2630
2631 if (sc->hn_mgmt_taskq != NULL)
2632 taskqueue_enqueue(sc->hn_mgmt_taskq, &sc->hn_link_task);
2633 }
2634
2635 static void
hn_change_network(struct hn_softc * sc)2636 hn_change_network(struct hn_softc *sc)
2637 {
2638
2639 if (sc->hn_mgmt_taskq != NULL)
2640 taskqueue_enqueue(sc->hn_mgmt_taskq, &sc->hn_netchg_init);
2641 }
2642
2643 static __inline int
hn_txdesc_dmamap_load(struct hn_tx_ring * txr,struct hn_txdesc * txd,struct mbuf ** m_head,bus_dma_segment_t * segs,int * nsegs)2644 hn_txdesc_dmamap_load(struct hn_tx_ring *txr, struct hn_txdesc *txd,
2645 struct mbuf **m_head, bus_dma_segment_t *segs, int *nsegs)
2646 {
2647 struct mbuf *m = *m_head;
2648 int error;
2649
2650 KASSERT(txd->chim_index == HN_NVS_CHIM_IDX_INVALID, ("txd uses chim"));
2651
2652 error = bus_dmamap_load_mbuf_sg(txr->hn_tx_data_dtag, txd->data_dmap,
2653 m, segs, nsegs, BUS_DMA_NOWAIT);
2654 if (error == EFBIG) {
2655 struct mbuf *m_new;
2656
2657 m_new = m_collapse(m, M_NOWAIT, HN_TX_DATA_SEGCNT_MAX);
2658 if (m_new == NULL)
2659 return ENOBUFS;
2660 else
2661 *m_head = m = m_new;
2662 txr->hn_tx_collapsed++;
2663
2664 error = bus_dmamap_load_mbuf_sg(txr->hn_tx_data_dtag,
2665 txd->data_dmap, m, segs, nsegs, BUS_DMA_NOWAIT);
2666 }
2667 if (!error) {
2668 bus_dmamap_sync(txr->hn_tx_data_dtag, txd->data_dmap,
2669 BUS_DMASYNC_PREWRITE);
2670 txd->flags |= HN_TXD_FLAG_DMAMAP;
2671 }
2672 return error;
2673 }
2674
2675 static __inline int
hn_txdesc_put(struct hn_tx_ring * txr,struct hn_txdesc * txd)2676 hn_txdesc_put(struct hn_tx_ring *txr, struct hn_txdesc *txd)
2677 {
2678
2679 KASSERT((txd->flags & HN_TXD_FLAG_ONLIST) == 0,
2680 ("put an onlist txd %#x", txd->flags));
2681 KASSERT((txd->flags & HN_TXD_FLAG_ONAGG) == 0,
2682 ("put an onagg txd %#x", txd->flags));
2683
2684 KASSERT(txd->refs > 0, ("invalid txd refs %d", txd->refs));
2685 if (atomic_fetchadd_int(&txd->refs, -1) != 1)
2686 return 0;
2687
2688 if (!STAILQ_EMPTY(&txd->agg_list)) {
2689 struct hn_txdesc *tmp_txd;
2690
2691 while ((tmp_txd = STAILQ_FIRST(&txd->agg_list)) != NULL) {
2692 int freed;
2693
2694 KASSERT(STAILQ_EMPTY(&tmp_txd->agg_list),
2695 ("resursive aggregation on aggregated txdesc"));
2696 KASSERT((tmp_txd->flags & HN_TXD_FLAG_ONAGG),
2697 ("not aggregated txdesc"));
2698 KASSERT((tmp_txd->flags & HN_TXD_FLAG_DMAMAP) == 0,
2699 ("aggregated txdesc uses dmamap"));
2700 KASSERT(tmp_txd->chim_index == HN_NVS_CHIM_IDX_INVALID,
2701 ("aggregated txdesc consumes "
2702 "chimney sending buffer"));
2703 KASSERT(tmp_txd->chim_size == 0,
2704 ("aggregated txdesc has non-zero "
2705 "chimney sending size"));
2706
2707 STAILQ_REMOVE_HEAD(&txd->agg_list, agg_link);
2708 tmp_txd->flags &= ~HN_TXD_FLAG_ONAGG;
2709 freed = hn_txdesc_put(txr, tmp_txd);
2710 KASSERT(freed, ("failed to free aggregated txdesc"));
2711 }
2712 }
2713
2714 if (txd->chim_index != HN_NVS_CHIM_IDX_INVALID) {
2715 KASSERT((txd->flags & HN_TXD_FLAG_DMAMAP) == 0,
2716 ("chim txd uses dmamap"));
2717 hn_chim_free(txr->hn_sc, txd->chim_index);
2718 txd->chim_index = HN_NVS_CHIM_IDX_INVALID;
2719 txd->chim_size = 0;
2720 } else if (txd->flags & HN_TXD_FLAG_DMAMAP) {
2721 bus_dmamap_sync(txr->hn_tx_data_dtag,
2722 txd->data_dmap, BUS_DMASYNC_POSTWRITE);
2723 bus_dmamap_unload(txr->hn_tx_data_dtag,
2724 txd->data_dmap);
2725 txd->flags &= ~HN_TXD_FLAG_DMAMAP;
2726 }
2727
2728 if (txd->m != NULL) {
2729 m_freem(txd->m);
2730 txd->m = NULL;
2731 }
2732
2733 txd->flags |= HN_TXD_FLAG_ONLIST;
2734 #ifndef HN_USE_TXDESC_BUFRING
2735 mtx_lock_spin(&txr->hn_txlist_spin);
2736 KASSERT(txr->hn_txdesc_avail >= 0 &&
2737 txr->hn_txdesc_avail < txr->hn_txdesc_cnt,
2738 ("txdesc_put: invalid txd avail %d", txr->hn_txdesc_avail));
2739 txr->hn_txdesc_avail++;
2740 SLIST_INSERT_HEAD(&txr->hn_txlist, txd, link);
2741 mtx_unlock_spin(&txr->hn_txlist_spin);
2742 #else /* HN_USE_TXDESC_BUFRING */
2743 #ifdef HN_DEBUG
2744 atomic_add_int(&txr->hn_txdesc_avail, 1);
2745 #endif
2746 buf_ring_enqueue(txr->hn_txdesc_br, txd);
2747 #endif /* !HN_USE_TXDESC_BUFRING */
2748
2749 return 1;
2750 }
2751
2752 static __inline struct hn_txdesc *
hn_txdesc_get(struct hn_tx_ring * txr)2753 hn_txdesc_get(struct hn_tx_ring *txr)
2754 {
2755 struct hn_txdesc *txd;
2756
2757 #ifndef HN_USE_TXDESC_BUFRING
2758 mtx_lock_spin(&txr->hn_txlist_spin);
2759 txd = SLIST_FIRST(&txr->hn_txlist);
2760 if (txd != NULL) {
2761 KASSERT(txr->hn_txdesc_avail > 0,
2762 ("txdesc_get: invalid txd avail %d", txr->hn_txdesc_avail));
2763 txr->hn_txdesc_avail--;
2764 SLIST_REMOVE_HEAD(&txr->hn_txlist, link);
2765 }
2766 mtx_unlock_spin(&txr->hn_txlist_spin);
2767 #else
2768 txd = buf_ring_dequeue_sc(txr->hn_txdesc_br);
2769 #endif
2770
2771 if (txd != NULL) {
2772 #ifdef HN_USE_TXDESC_BUFRING
2773 #ifdef HN_DEBUG
2774 atomic_subtract_int(&txr->hn_txdesc_avail, 1);
2775 #endif
2776 #endif /* HN_USE_TXDESC_BUFRING */
2777 KASSERT(txd->m == NULL && txd->refs == 0 &&
2778 STAILQ_EMPTY(&txd->agg_list) &&
2779 txd->chim_index == HN_NVS_CHIM_IDX_INVALID &&
2780 txd->chim_size == 0 &&
2781 (txd->flags & HN_TXD_FLAG_ONLIST) &&
2782 (txd->flags & HN_TXD_FLAG_ONAGG) == 0 &&
2783 (txd->flags & HN_TXD_FLAG_DMAMAP) == 0, ("invalid txd"));
2784 txd->flags &= ~HN_TXD_FLAG_ONLIST;
2785 txd->refs = 1;
2786 }
2787 return txd;
2788 }
2789
2790 static __inline void
hn_txdesc_hold(struct hn_txdesc * txd)2791 hn_txdesc_hold(struct hn_txdesc *txd)
2792 {
2793
2794 /* 0->1 transition will never work */
2795 KASSERT(txd->refs > 0, ("invalid txd refs %d", txd->refs));
2796 atomic_add_int(&txd->refs, 1);
2797 }
2798
2799 static __inline void
hn_txdesc_agg(struct hn_txdesc * agg_txd,struct hn_txdesc * txd)2800 hn_txdesc_agg(struct hn_txdesc *agg_txd, struct hn_txdesc *txd)
2801 {
2802
2803 KASSERT((agg_txd->flags & HN_TXD_FLAG_ONAGG) == 0,
2804 ("recursive aggregation on aggregating txdesc"));
2805
2806 KASSERT((txd->flags & HN_TXD_FLAG_ONAGG) == 0,
2807 ("already aggregated"));
2808 KASSERT(STAILQ_EMPTY(&txd->agg_list),
2809 ("recursive aggregation on to-be-aggregated txdesc"));
2810
2811 txd->flags |= HN_TXD_FLAG_ONAGG;
2812 STAILQ_INSERT_TAIL(&agg_txd->agg_list, txd, agg_link);
2813 }
2814
2815 static bool
hn_tx_ring_pending(struct hn_tx_ring * txr)2816 hn_tx_ring_pending(struct hn_tx_ring *txr)
2817 {
2818 bool pending = false;
2819
2820 #ifndef HN_USE_TXDESC_BUFRING
2821 mtx_lock_spin(&txr->hn_txlist_spin);
2822 if (txr->hn_txdesc_avail != txr->hn_txdesc_cnt)
2823 pending = true;
2824 mtx_unlock_spin(&txr->hn_txlist_spin);
2825 #else
2826 if (!buf_ring_full(txr->hn_txdesc_br))
2827 pending = true;
2828 #endif
2829 return (pending);
2830 }
2831
2832 static __inline void
hn_txeof(struct hn_tx_ring * txr)2833 hn_txeof(struct hn_tx_ring *txr)
2834 {
2835 txr->hn_has_txeof = 0;
2836 txr->hn_txeof(txr);
2837 }
2838
2839 static void
hn_txpkt_done(struct hn_nvs_sendctx * sndc,struct hn_softc * sc,struct vmbus_channel * chan,const void * data __unused,int dlen __unused)2840 hn_txpkt_done(struct hn_nvs_sendctx *sndc, struct hn_softc *sc,
2841 struct vmbus_channel *chan, const void *data __unused, int dlen __unused)
2842 {
2843 struct hn_txdesc *txd = sndc->hn_cbarg;
2844 struct hn_tx_ring *txr;
2845
2846 txr = txd->txr;
2847 KASSERT(txr->hn_chan == chan,
2848 ("channel mismatch, on chan%u, should be chan%u",
2849 vmbus_chan_id(chan), vmbus_chan_id(txr->hn_chan)));
2850
2851 txr->hn_has_txeof = 1;
2852 hn_txdesc_put(txr, txd);
2853
2854 ++txr->hn_txdone_cnt;
2855 if (txr->hn_txdone_cnt >= HN_EARLY_TXEOF_THRESH) {
2856 txr->hn_txdone_cnt = 0;
2857 if (txr->hn_oactive)
2858 hn_txeof(txr);
2859 }
2860 }
2861
2862 static void
hn_chan_rollup(struct hn_rx_ring * rxr,struct hn_tx_ring * txr)2863 hn_chan_rollup(struct hn_rx_ring *rxr, struct hn_tx_ring *txr)
2864 {
2865 #if defined(INET) || defined(INET6)
2866 tcp_lro_flush_all(&rxr->hn_lro);
2867 #endif
2868
2869 /*
2870 * NOTE:
2871 * 'txr' could be NULL, if multiple channels and
2872 * ifnet.if_start method are enabled.
2873 */
2874 if (txr == NULL || !txr->hn_has_txeof)
2875 return;
2876
2877 txr->hn_txdone_cnt = 0;
2878 hn_txeof(txr);
2879 }
2880
2881 static __inline uint32_t
hn_rndis_pktmsg_offset(uint32_t ofs)2882 hn_rndis_pktmsg_offset(uint32_t ofs)
2883 {
2884
2885 KASSERT(ofs >= sizeof(struct rndis_packet_msg),
2886 ("invalid RNDIS packet msg offset %u", ofs));
2887 return (ofs - __offsetof(struct rndis_packet_msg, rm_dataoffset));
2888 }
2889
2890 static __inline void *
hn_rndis_pktinfo_append(struct rndis_packet_msg * pkt,size_t pktsize,size_t pi_dlen,uint32_t pi_type)2891 hn_rndis_pktinfo_append(struct rndis_packet_msg *pkt, size_t pktsize,
2892 size_t pi_dlen, uint32_t pi_type)
2893 {
2894 const size_t pi_size = HN_RNDIS_PKTINFO_SIZE(pi_dlen);
2895 struct rndis_pktinfo *pi;
2896
2897 KASSERT((pi_size & RNDIS_PACKET_MSG_OFFSET_ALIGNMASK) == 0,
2898 ("unaligned pktinfo size %zu, pktinfo dlen %zu", pi_size, pi_dlen));
2899
2900 /*
2901 * Per-packet-info does not move; it only grows.
2902 *
2903 * NOTE:
2904 * rm_pktinfooffset in this phase counts from the beginning
2905 * of rndis_packet_msg.
2906 */
2907 KASSERT(pkt->rm_pktinfooffset + pkt->rm_pktinfolen + pi_size <= pktsize,
2908 ("%u pktinfo overflows RNDIS packet msg", pi_type));
2909 pi = (struct rndis_pktinfo *)((uint8_t *)pkt + pkt->rm_pktinfooffset +
2910 pkt->rm_pktinfolen);
2911 pkt->rm_pktinfolen += pi_size;
2912
2913 pi->rm_size = pi_size;
2914 pi->rm_type = pi_type;
2915 pi->rm_pktinfooffset = RNDIS_PKTINFO_OFFSET;
2916
2917 return (pi->rm_data);
2918 }
2919
2920 static __inline int
hn_flush_txagg(struct ifnet * ifp,struct hn_tx_ring * txr)2921 hn_flush_txagg(struct ifnet *ifp, struct hn_tx_ring *txr)
2922 {
2923 struct hn_txdesc *txd;
2924 struct mbuf *m;
2925 int error, pkts;
2926
2927 txd = txr->hn_agg_txd;
2928 KASSERT(txd != NULL, ("no aggregate txdesc"));
2929
2930 /*
2931 * Since hn_txpkt() will reset this temporary stat, save
2932 * it now, so that oerrors can be updated properly, if
2933 * hn_txpkt() ever fails.
2934 */
2935 pkts = txr->hn_stat_pkts;
2936
2937 /*
2938 * Since txd's mbuf will _not_ be freed upon hn_txpkt()
2939 * failure, save it for later freeing, if hn_txpkt() ever
2940 * fails.
2941 */
2942 m = txd->m;
2943 error = hn_txpkt(ifp, txr, txd);
2944 if (__predict_false(error)) {
2945 /* txd is freed, but m is not. */
2946 m_freem(m);
2947
2948 txr->hn_flush_failed++;
2949 if_inc_counter(ifp, IFCOUNTER_OERRORS, pkts);
2950 }
2951
2952 /* Reset all aggregation states. */
2953 txr->hn_agg_txd = NULL;
2954 txr->hn_agg_szleft = 0;
2955 txr->hn_agg_pktleft = 0;
2956 txr->hn_agg_prevpkt = NULL;
2957
2958 return (error);
2959 }
2960
2961 static void *
hn_try_txagg(struct ifnet * ifp,struct hn_tx_ring * txr,struct hn_txdesc * txd,int pktsize)2962 hn_try_txagg(struct ifnet *ifp, struct hn_tx_ring *txr, struct hn_txdesc *txd,
2963 int pktsize)
2964 {
2965 void *chim;
2966
2967 if (txr->hn_agg_txd != NULL) {
2968 if (txr->hn_agg_pktleft >= 1 && txr->hn_agg_szleft > pktsize) {
2969 struct hn_txdesc *agg_txd = txr->hn_agg_txd;
2970 struct rndis_packet_msg *pkt = txr->hn_agg_prevpkt;
2971 int olen;
2972
2973 /*
2974 * Update the previous RNDIS packet's total length,
2975 * it can be increased due to the mandatory alignment
2976 * padding for this RNDIS packet. And update the
2977 * aggregating txdesc's chimney sending buffer size
2978 * accordingly.
2979 *
2980 * XXX
2981 * Zero-out the padding, as required by the RNDIS spec.
2982 */
2983 olen = pkt->rm_len;
2984 pkt->rm_len = roundup2(olen, txr->hn_agg_align);
2985 agg_txd->chim_size += pkt->rm_len - olen;
2986
2987 /* Link this txdesc to the parent. */
2988 hn_txdesc_agg(agg_txd, txd);
2989
2990 chim = (uint8_t *)pkt + pkt->rm_len;
2991 /* Save the current packet for later fixup. */
2992 txr->hn_agg_prevpkt = chim;
2993
2994 txr->hn_agg_pktleft--;
2995 txr->hn_agg_szleft -= pktsize;
2996 if (txr->hn_agg_szleft <=
2997 HN_PKTSIZE_MIN(txr->hn_agg_align)) {
2998 /*
2999 * Probably can't aggregate more packets,
3000 * flush this aggregating txdesc proactively.
3001 */
3002 txr->hn_agg_pktleft = 0;
3003 }
3004 /* Done! */
3005 return (chim);
3006 }
3007 hn_flush_txagg(ifp, txr);
3008 }
3009 KASSERT(txr->hn_agg_txd == NULL, ("lingering aggregating txdesc"));
3010
3011 txr->hn_tx_chimney_tried++;
3012 txd->chim_index = hn_chim_alloc(txr->hn_sc);
3013 if (txd->chim_index == HN_NVS_CHIM_IDX_INVALID)
3014 return (NULL);
3015 txr->hn_tx_chimney++;
3016
3017 chim = txr->hn_sc->hn_chim +
3018 (txd->chim_index * txr->hn_sc->hn_chim_szmax);
3019
3020 if (txr->hn_agg_pktmax > 1 &&
3021 txr->hn_agg_szmax > pktsize + HN_PKTSIZE_MIN(txr->hn_agg_align)) {
3022 txr->hn_agg_txd = txd;
3023 txr->hn_agg_pktleft = txr->hn_agg_pktmax - 1;
3024 txr->hn_agg_szleft = txr->hn_agg_szmax - pktsize;
3025 txr->hn_agg_prevpkt = chim;
3026 }
3027 return (chim);
3028 }
3029
3030 /*
3031 * NOTE:
3032 * If this function fails, then both txd and m_head0 will be freed.
3033 */
3034 static int
hn_encap(struct ifnet * ifp,struct hn_tx_ring * txr,struct hn_txdesc * txd,struct mbuf ** m_head0)3035 hn_encap(struct ifnet *ifp, struct hn_tx_ring *txr, struct hn_txdesc *txd,
3036 struct mbuf **m_head0)
3037 {
3038 bus_dma_segment_t segs[HN_TX_DATA_SEGCNT_MAX];
3039 int error, nsegs, i;
3040 struct mbuf *m_head = *m_head0;
3041 struct rndis_packet_msg *pkt;
3042 uint32_t *pi_data;
3043 void *chim = NULL;
3044 int pkt_hlen, pkt_size;
3045
3046 pkt = txd->rndis_pkt;
3047 pkt_size = HN_PKTSIZE(m_head, txr->hn_agg_align);
3048 if (pkt_size < txr->hn_chim_size) {
3049 chim = hn_try_txagg(ifp, txr, txd, pkt_size);
3050 if (chim != NULL)
3051 pkt = chim;
3052 } else {
3053 if (txr->hn_agg_txd != NULL)
3054 hn_flush_txagg(ifp, txr);
3055 }
3056
3057 pkt->rm_type = REMOTE_NDIS_PACKET_MSG;
3058 pkt->rm_len = m_head->m_pkthdr.len;
3059 pkt->rm_dataoffset = 0;
3060 pkt->rm_datalen = m_head->m_pkthdr.len;
3061 pkt->rm_oobdataoffset = 0;
3062 pkt->rm_oobdatalen = 0;
3063 pkt->rm_oobdataelements = 0;
3064 pkt->rm_pktinfooffset = sizeof(*pkt);
3065 pkt->rm_pktinfolen = 0;
3066 pkt->rm_vchandle = 0;
3067 pkt->rm_reserved = 0;
3068
3069 if (txr->hn_tx_flags & HN_TX_FLAG_HASHVAL) {
3070 /*
3071 * Set the hash value for this packet, so that the host could
3072 * dispatch the TX done event for this packet back to this TX
3073 * ring's channel.
3074 */
3075 pi_data = hn_rndis_pktinfo_append(pkt, HN_RNDIS_PKT_LEN,
3076 HN_NDIS_HASH_VALUE_SIZE, HN_NDIS_PKTINFO_TYPE_HASHVAL);
3077 *pi_data = txr->hn_tx_idx;
3078 }
3079
3080 if (m_head->m_flags & M_VLANTAG) {
3081 pi_data = hn_rndis_pktinfo_append(pkt, HN_RNDIS_PKT_LEN,
3082 NDIS_VLAN_INFO_SIZE, NDIS_PKTINFO_TYPE_VLAN);
3083 *pi_data = NDIS_VLAN_INFO_MAKE(
3084 EVL_VLANOFTAG(m_head->m_pkthdr.ether_vtag),
3085 EVL_PRIOFTAG(m_head->m_pkthdr.ether_vtag),
3086 EVL_CFIOFTAG(m_head->m_pkthdr.ether_vtag));
3087 }
3088
3089 if (m_head->m_pkthdr.csum_flags & CSUM_TSO) {
3090 #if defined(INET6) || defined(INET)
3091 pi_data = hn_rndis_pktinfo_append(pkt, HN_RNDIS_PKT_LEN,
3092 NDIS_LSO2_INFO_SIZE, NDIS_PKTINFO_TYPE_LSO);
3093 #ifdef INET
3094 if (m_head->m_pkthdr.csum_flags & CSUM_IP_TSO) {
3095 *pi_data = NDIS_LSO2_INFO_MAKEIPV4(
3096 m_head->m_pkthdr.l2hlen + m_head->m_pkthdr.l3hlen,
3097 m_head->m_pkthdr.tso_segsz);
3098 }
3099 #endif
3100 #if defined(INET6) && defined(INET)
3101 else
3102 #endif
3103 #ifdef INET6
3104 {
3105 *pi_data = NDIS_LSO2_INFO_MAKEIPV6(
3106 m_head->m_pkthdr.l2hlen + m_head->m_pkthdr.l3hlen,
3107 m_head->m_pkthdr.tso_segsz);
3108 }
3109 #endif
3110 #endif /* INET6 || INET */
3111 } else if (m_head->m_pkthdr.csum_flags & txr->hn_csum_assist) {
3112 pi_data = hn_rndis_pktinfo_append(pkt, HN_RNDIS_PKT_LEN,
3113 NDIS_TXCSUM_INFO_SIZE, NDIS_PKTINFO_TYPE_CSUM);
3114 if (m_head->m_pkthdr.csum_flags &
3115 (CSUM_IP6_TCP | CSUM_IP6_UDP)) {
3116 *pi_data = NDIS_TXCSUM_INFO_IPV6;
3117 } else {
3118 *pi_data = NDIS_TXCSUM_INFO_IPV4;
3119 if (m_head->m_pkthdr.csum_flags & CSUM_IP)
3120 *pi_data |= NDIS_TXCSUM_INFO_IPCS;
3121 }
3122
3123 if (m_head->m_pkthdr.csum_flags &
3124 (CSUM_IP_TCP | CSUM_IP6_TCP)) {
3125 *pi_data |= NDIS_TXCSUM_INFO_MKTCPCS(
3126 m_head->m_pkthdr.l2hlen + m_head->m_pkthdr.l3hlen);
3127 } else if (m_head->m_pkthdr.csum_flags &
3128 (CSUM_IP_UDP | CSUM_IP6_UDP)) {
3129 *pi_data |= NDIS_TXCSUM_INFO_MKUDPCS(
3130 m_head->m_pkthdr.l2hlen + m_head->m_pkthdr.l3hlen);
3131 }
3132 }
3133
3134 pkt_hlen = pkt->rm_pktinfooffset + pkt->rm_pktinfolen;
3135 /* Fixup RNDIS packet message total length */
3136 pkt->rm_len += pkt_hlen;
3137 /* Convert RNDIS packet message offsets */
3138 pkt->rm_dataoffset = hn_rndis_pktmsg_offset(pkt_hlen);
3139 pkt->rm_pktinfooffset = hn_rndis_pktmsg_offset(pkt->rm_pktinfooffset);
3140
3141 /*
3142 * Fast path: Chimney sending.
3143 */
3144 if (chim != NULL) {
3145 struct hn_txdesc *tgt_txd = txd;
3146
3147 if (txr->hn_agg_txd != NULL) {
3148 tgt_txd = txr->hn_agg_txd;
3149 #ifdef INVARIANTS
3150 *m_head0 = NULL;
3151 #endif
3152 }
3153
3154 KASSERT(pkt == chim,
3155 ("RNDIS pkt not in chimney sending buffer"));
3156 KASSERT(tgt_txd->chim_index != HN_NVS_CHIM_IDX_INVALID,
3157 ("chimney sending buffer is not used"));
3158 tgt_txd->chim_size += pkt->rm_len;
3159
3160 m_copydata(m_head, 0, m_head->m_pkthdr.len,
3161 ((uint8_t *)chim) + pkt_hlen);
3162
3163 txr->hn_gpa_cnt = 0;
3164 txr->hn_sendpkt = hn_txpkt_chim;
3165 goto done;
3166 }
3167
3168 KASSERT(txr->hn_agg_txd == NULL, ("aggregating sglist txdesc"));
3169 KASSERT(txd->chim_index == HN_NVS_CHIM_IDX_INVALID,
3170 ("chimney buffer is used"));
3171 KASSERT(pkt == txd->rndis_pkt, ("RNDIS pkt not in txdesc"));
3172
3173 error = hn_txdesc_dmamap_load(txr, txd, &m_head, segs, &nsegs);
3174 if (__predict_false(error)) {
3175 int freed;
3176
3177 /*
3178 * This mbuf is not linked w/ the txd yet, so free it now.
3179 */
3180 m_freem(m_head);
3181 *m_head0 = NULL;
3182
3183 freed = hn_txdesc_put(txr, txd);
3184 KASSERT(freed != 0,
3185 ("fail to free txd upon txdma error"));
3186
3187 txr->hn_txdma_failed++;
3188 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
3189 return error;
3190 }
3191 *m_head0 = m_head;
3192
3193 /* +1 RNDIS packet message */
3194 txr->hn_gpa_cnt = nsegs + 1;
3195
3196 /* send packet with page buffer */
3197 txr->hn_gpa[0].gpa_page = atop(txd->rndis_pkt_paddr);
3198 txr->hn_gpa[0].gpa_ofs = txd->rndis_pkt_paddr & PAGE_MASK;
3199 txr->hn_gpa[0].gpa_len = pkt_hlen;
3200
3201 /*
3202 * Fill the page buffers with mbuf info after the page
3203 * buffer for RNDIS packet message.
3204 */
3205 for (i = 0; i < nsegs; ++i) {
3206 struct vmbus_gpa *gpa = &txr->hn_gpa[i + 1];
3207
3208 gpa->gpa_page = atop(segs[i].ds_addr);
3209 gpa->gpa_ofs = segs[i].ds_addr & PAGE_MASK;
3210 gpa->gpa_len = segs[i].ds_len;
3211 }
3212
3213 txd->chim_index = HN_NVS_CHIM_IDX_INVALID;
3214 txd->chim_size = 0;
3215 txr->hn_sendpkt = hn_txpkt_sglist;
3216 done:
3217 txd->m = m_head;
3218
3219 /* Set the completion routine */
3220 hn_nvs_sendctx_init(&txd->send_ctx, hn_txpkt_done, txd);
3221
3222 /* Update temporary stats for later use. */
3223 txr->hn_stat_pkts++;
3224 txr->hn_stat_size += m_head->m_pkthdr.len;
3225 if (m_head->m_flags & M_MCAST)
3226 txr->hn_stat_mcasts++;
3227
3228 return 0;
3229 }
3230
3231 /*
3232 * NOTE:
3233 * If this function fails, then txd will be freed, but the mbuf
3234 * associated w/ the txd will _not_ be freed.
3235 */
3236 static int
hn_txpkt(struct ifnet * ifp,struct hn_tx_ring * txr,struct hn_txdesc * txd)3237 hn_txpkt(struct ifnet *ifp, struct hn_tx_ring *txr, struct hn_txdesc *txd)
3238 {
3239 int error, send_failed = 0, has_bpf;
3240
3241 again:
3242 has_bpf = bpf_peers_present(ifp->if_bpf);
3243 if (has_bpf) {
3244 /*
3245 * Make sure that this txd and any aggregated txds are not
3246 * freed before ETHER_BPF_MTAP.
3247 */
3248 hn_txdesc_hold(txd);
3249 }
3250 error = txr->hn_sendpkt(txr, txd);
3251 if (!error) {
3252 if (has_bpf) {
3253 const struct hn_txdesc *tmp_txd;
3254
3255 ETHER_BPF_MTAP(ifp, txd->m);
3256 STAILQ_FOREACH(tmp_txd, &txd->agg_list, agg_link)
3257 ETHER_BPF_MTAP(ifp, tmp_txd->m);
3258 }
3259
3260 if_inc_counter(ifp, IFCOUNTER_OPACKETS, txr->hn_stat_pkts);
3261 #ifdef HN_IFSTART_SUPPORT
3262 if (!hn_use_if_start)
3263 #endif
3264 {
3265 if_inc_counter(ifp, IFCOUNTER_OBYTES,
3266 txr->hn_stat_size);
3267 if (txr->hn_stat_mcasts != 0) {
3268 if_inc_counter(ifp, IFCOUNTER_OMCASTS,
3269 txr->hn_stat_mcasts);
3270 }
3271 }
3272 txr->hn_pkts += txr->hn_stat_pkts;
3273 txr->hn_sends++;
3274 }
3275 if (has_bpf)
3276 hn_txdesc_put(txr, txd);
3277
3278 if (__predict_false(error)) {
3279 int freed;
3280
3281 /*
3282 * This should "really rarely" happen.
3283 *
3284 * XXX Too many RX to be acked or too many sideband
3285 * commands to run? Ask netvsc_channel_rollup()
3286 * to kick start later.
3287 */
3288 txr->hn_has_txeof = 1;
3289 if (!send_failed) {
3290 txr->hn_send_failed++;
3291 send_failed = 1;
3292 /*
3293 * Try sending again after set hn_has_txeof;
3294 * in case that we missed the last
3295 * netvsc_channel_rollup().
3296 */
3297 goto again;
3298 }
3299 if_printf(ifp, "send failed\n");
3300
3301 /*
3302 * Caller will perform further processing on the
3303 * associated mbuf, so don't free it in hn_txdesc_put();
3304 * only unload it from the DMA map in hn_txdesc_put(),
3305 * if it was loaded.
3306 */
3307 txd->m = NULL;
3308 freed = hn_txdesc_put(txr, txd);
3309 KASSERT(freed != 0,
3310 ("fail to free txd upon send error"));
3311
3312 txr->hn_send_failed++;
3313 }
3314
3315 /* Reset temporary stats, after this sending is done. */
3316 txr->hn_stat_size = 0;
3317 txr->hn_stat_pkts = 0;
3318 txr->hn_stat_mcasts = 0;
3319
3320 return (error);
3321 }
3322
3323 /*
3324 * Append the specified data to the indicated mbuf chain,
3325 * Extend the mbuf chain if the new data does not fit in
3326 * existing space.
3327 *
3328 * This is a minor rewrite of m_append() from sys/kern/uipc_mbuf.c.
3329 * There should be an equivalent in the kernel mbuf code,
3330 * but there does not appear to be one yet.
3331 *
3332 * Differs from m_append() in that additional mbufs are
3333 * allocated with cluster size MJUMPAGESIZE, and filled
3334 * accordingly.
3335 *
3336 * Return 1 if able to complete the job; otherwise 0.
3337 */
3338 static int
hv_m_append(struct mbuf * m0,int len,c_caddr_t cp)3339 hv_m_append(struct mbuf *m0, int len, c_caddr_t cp)
3340 {
3341 struct mbuf *m, *n;
3342 int remainder, space;
3343
3344 for (m = m0; m->m_next != NULL; m = m->m_next)
3345 ;
3346 remainder = len;
3347 space = M_TRAILINGSPACE(m);
3348 if (space > 0) {
3349 /*
3350 * Copy into available space.
3351 */
3352 if (space > remainder)
3353 space = remainder;
3354 bcopy(cp, mtod(m, caddr_t) + m->m_len, space);
3355 m->m_len += space;
3356 cp += space;
3357 remainder -= space;
3358 }
3359 while (remainder > 0) {
3360 /*
3361 * Allocate a new mbuf; could check space
3362 * and allocate a cluster instead.
3363 */
3364 n = m_getjcl(M_NOWAIT, m->m_type, 0, MJUMPAGESIZE);
3365 if (n == NULL)
3366 break;
3367 n->m_len = min(MJUMPAGESIZE, remainder);
3368 bcopy(cp, mtod(n, caddr_t), n->m_len);
3369 cp += n->m_len;
3370 remainder -= n->m_len;
3371 m->m_next = n;
3372 m = n;
3373 }
3374 if (m0->m_flags & M_PKTHDR)
3375 m0->m_pkthdr.len += len - remainder;
3376
3377 return (remainder == 0);
3378 }
3379
3380 #if defined(INET) || defined(INET6)
3381 static __inline int
hn_lro_rx(struct lro_ctrl * lc,struct mbuf * m)3382 hn_lro_rx(struct lro_ctrl *lc, struct mbuf *m)
3383 {
3384 #if __FreeBSD_version >= 1100095
3385 if (hn_lro_mbufq_depth) {
3386 tcp_lro_queue_mbuf(lc, m);
3387 return 0;
3388 }
3389 #endif
3390 return tcp_lro_rx(lc, m, 0);
3391 }
3392 #endif
3393
3394 static int
hn_rxpkt(struct hn_rx_ring * rxr,const void * data,int dlen,const struct hn_rxinfo * info)3395 hn_rxpkt(struct hn_rx_ring *rxr, const void *data, int dlen,
3396 const struct hn_rxinfo *info)
3397 {
3398 struct ifnet *ifp, *hn_ifp = rxr->hn_ifp;
3399 struct mbuf *m_new;
3400 int size, do_lro = 0, do_csum = 1, is_vf = 0;
3401 int hash_type = M_HASHTYPE_NONE;
3402 int l3proto = ETHERTYPE_MAX, l4proto = IPPROTO_DONE;
3403
3404 ifp = hn_ifp;
3405 if (rxr->hn_rxvf_ifp != NULL) {
3406 /*
3407 * Non-transparent mode VF; pretend this packet is from
3408 * the VF.
3409 */
3410 ifp = rxr->hn_rxvf_ifp;
3411 is_vf = 1;
3412 } else if (rxr->hn_rx_flags & HN_RX_FLAG_XPNT_VF) {
3413 /* Transparent mode VF. */
3414 is_vf = 1;
3415 }
3416
3417 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
3418 /*
3419 * NOTE:
3420 * See the NOTE of hn_rndis_init_fixat(). This
3421 * function can be reached, immediately after the
3422 * RNDIS is initialized but before the ifnet is
3423 * setup on the hn_attach() path; drop the unexpected
3424 * packets.
3425 */
3426 return (0);
3427 }
3428
3429 if (__predict_false(dlen < ETHER_HDR_LEN)) {
3430 if_inc_counter(hn_ifp, IFCOUNTER_IERRORS, 1);
3431 return (0);
3432 }
3433
3434 if (dlen <= MHLEN) {
3435 m_new = m_gethdr(M_NOWAIT, MT_DATA);
3436 if (m_new == NULL) {
3437 if_inc_counter(hn_ifp, IFCOUNTER_IQDROPS, 1);
3438 return (0);
3439 }
3440 memcpy(mtod(m_new, void *), data, dlen);
3441 m_new->m_pkthdr.len = m_new->m_len = dlen;
3442 rxr->hn_small_pkts++;
3443 } else {
3444 /*
3445 * Get an mbuf with a cluster. For packets 2K or less,
3446 * get a standard 2K cluster. For anything larger, get a
3447 * 4K cluster. Any buffers larger than 4K can cause problems
3448 * if looped around to the Hyper-V TX channel, so avoid them.
3449 */
3450 size = MCLBYTES;
3451 if (dlen > MCLBYTES) {
3452 /* 4096 */
3453 size = MJUMPAGESIZE;
3454 }
3455
3456 m_new = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, size);
3457 if (m_new == NULL) {
3458 if_inc_counter(hn_ifp, IFCOUNTER_IQDROPS, 1);
3459 return (0);
3460 }
3461
3462 hv_m_append(m_new, dlen, data);
3463 }
3464 m_new->m_pkthdr.rcvif = ifp;
3465
3466 if (__predict_false((hn_ifp->if_capenable & IFCAP_RXCSUM) == 0))
3467 do_csum = 0;
3468
3469 /* receive side checksum offload */
3470 if (info->csum_info != HN_NDIS_RXCSUM_INFO_INVALID) {
3471 /* IP csum offload */
3472 if ((info->csum_info & NDIS_RXCSUM_INFO_IPCS_OK) && do_csum) {
3473 m_new->m_pkthdr.csum_flags |=
3474 (CSUM_IP_CHECKED | CSUM_IP_VALID);
3475 rxr->hn_csum_ip++;
3476 }
3477
3478 /* TCP/UDP csum offload */
3479 if ((info->csum_info & (NDIS_RXCSUM_INFO_UDPCS_OK |
3480 NDIS_RXCSUM_INFO_TCPCS_OK)) && do_csum) {
3481 m_new->m_pkthdr.csum_flags |=
3482 (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
3483 m_new->m_pkthdr.csum_data = 0xffff;
3484 if (info->csum_info & NDIS_RXCSUM_INFO_TCPCS_OK)
3485 rxr->hn_csum_tcp++;
3486 else
3487 rxr->hn_csum_udp++;
3488 }
3489
3490 /*
3491 * XXX
3492 * As of this write (Oct 28th, 2016), host side will turn
3493 * on only TCPCS_OK and IPCS_OK even for UDP datagrams, so
3494 * the do_lro setting here is actually _not_ accurate. We
3495 * depend on the RSS hash type check to reset do_lro.
3496 */
3497 if ((info->csum_info &
3498 (NDIS_RXCSUM_INFO_TCPCS_OK | NDIS_RXCSUM_INFO_IPCS_OK)) ==
3499 (NDIS_RXCSUM_INFO_TCPCS_OK | NDIS_RXCSUM_INFO_IPCS_OK))
3500 do_lro = 1;
3501 } else {
3502 hn_rxpkt_proto(m_new, &l3proto, &l4proto);
3503 if (l3proto == ETHERTYPE_IP) {
3504 if (l4proto == IPPROTO_TCP) {
3505 if (do_csum &&
3506 (rxr->hn_trust_hcsum &
3507 HN_TRUST_HCSUM_TCP)) {
3508 rxr->hn_csum_trusted++;
3509 m_new->m_pkthdr.csum_flags |=
3510 (CSUM_IP_CHECKED | CSUM_IP_VALID |
3511 CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
3512 m_new->m_pkthdr.csum_data = 0xffff;
3513 }
3514 do_lro = 1;
3515 } else if (l4proto == IPPROTO_UDP) {
3516 if (do_csum &&
3517 (rxr->hn_trust_hcsum &
3518 HN_TRUST_HCSUM_UDP)) {
3519 rxr->hn_csum_trusted++;
3520 m_new->m_pkthdr.csum_flags |=
3521 (CSUM_IP_CHECKED | CSUM_IP_VALID |
3522 CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
3523 m_new->m_pkthdr.csum_data = 0xffff;
3524 }
3525 } else if (l4proto != IPPROTO_DONE && do_csum &&
3526 (rxr->hn_trust_hcsum & HN_TRUST_HCSUM_IP)) {
3527 rxr->hn_csum_trusted++;
3528 m_new->m_pkthdr.csum_flags |=
3529 (CSUM_IP_CHECKED | CSUM_IP_VALID);
3530 }
3531 }
3532 }
3533
3534 if (info->vlan_info != HN_NDIS_VLAN_INFO_INVALID) {
3535 m_new->m_pkthdr.ether_vtag = EVL_MAKETAG(
3536 NDIS_VLAN_INFO_ID(info->vlan_info),
3537 NDIS_VLAN_INFO_PRI(info->vlan_info),
3538 NDIS_VLAN_INFO_CFI(info->vlan_info));
3539 m_new->m_flags |= M_VLANTAG;
3540 }
3541
3542 /*
3543 * If VF is activated (tranparent/non-transparent mode does not
3544 * matter here).
3545 *
3546 * - Disable LRO
3547 *
3548 * hn(4) will only receive broadcast packets, multicast packets,
3549 * TCP SYN and SYN|ACK (in Azure), LRO is useless for these
3550 * packet types.
3551 *
3552 * For non-transparent, we definitely _cannot_ enable LRO at
3553 * all, since the LRO flush will use hn(4) as the receiving
3554 * interface; i.e. hn_ifp->if_input(hn_ifp, m).
3555 */
3556 if (is_vf)
3557 do_lro = 0;
3558
3559 /*
3560 * If VF is activated (tranparent/non-transparent mode does not
3561 * matter here), do _not_ mess with unsupported hash types or
3562 * functions.
3563 */
3564 if (info->hash_info != HN_NDIS_HASH_INFO_INVALID) {
3565 rxr->hn_rss_pkts++;
3566 m_new->m_pkthdr.flowid = info->hash_value;
3567 if (!is_vf)
3568 hash_type = M_HASHTYPE_OPAQUE_HASH;
3569 if ((info->hash_info & NDIS_HASH_FUNCTION_MASK) ==
3570 NDIS_HASH_FUNCTION_TOEPLITZ) {
3571 uint32_t type = (info->hash_info & NDIS_HASH_TYPE_MASK &
3572 rxr->hn_mbuf_hash);
3573
3574 /*
3575 * NOTE:
3576 * do_lro is resetted, if the hash types are not TCP
3577 * related. See the comment in the above csum_flags
3578 * setup section.
3579 */
3580 switch (type) {
3581 case NDIS_HASH_IPV4:
3582 hash_type = M_HASHTYPE_RSS_IPV4;
3583 do_lro = 0;
3584 break;
3585
3586 case NDIS_HASH_TCP_IPV4:
3587 hash_type = M_HASHTYPE_RSS_TCP_IPV4;
3588 if (rxr->hn_rx_flags & HN_RX_FLAG_UDP_HASH) {
3589 int def_htype = M_HASHTYPE_OPAQUE_HASH;
3590
3591 if (is_vf)
3592 def_htype = M_HASHTYPE_NONE;
3593
3594 /*
3595 * UDP 4-tuple hash is delivered as
3596 * TCP 4-tuple hash.
3597 */
3598 if (l3proto == ETHERTYPE_MAX) {
3599 hn_rxpkt_proto(m_new,
3600 &l3proto, &l4proto);
3601 }
3602 if (l3proto == ETHERTYPE_IP) {
3603 if (l4proto == IPPROTO_UDP &&
3604 (rxr->hn_mbuf_hash &
3605 NDIS_HASH_UDP_IPV4_X)) {
3606 hash_type =
3607 M_HASHTYPE_RSS_UDP_IPV4;
3608 do_lro = 0;
3609 } else if (l4proto !=
3610 IPPROTO_TCP) {
3611 hash_type = def_htype;
3612 do_lro = 0;
3613 }
3614 } else {
3615 hash_type = def_htype;
3616 do_lro = 0;
3617 }
3618 }
3619 break;
3620
3621 case NDIS_HASH_IPV6:
3622 hash_type = M_HASHTYPE_RSS_IPV6;
3623 do_lro = 0;
3624 break;
3625
3626 case NDIS_HASH_IPV6_EX:
3627 hash_type = M_HASHTYPE_RSS_IPV6_EX;
3628 do_lro = 0;
3629 break;
3630
3631 case NDIS_HASH_TCP_IPV6:
3632 hash_type = M_HASHTYPE_RSS_TCP_IPV6;
3633 break;
3634
3635 case NDIS_HASH_TCP_IPV6_EX:
3636 hash_type = M_HASHTYPE_RSS_TCP_IPV6_EX;
3637 break;
3638 }
3639 }
3640 } else if (!is_vf) {
3641 m_new->m_pkthdr.flowid = rxr->hn_rx_idx;
3642 hash_type = M_HASHTYPE_OPAQUE;
3643 }
3644 M_HASHTYPE_SET(m_new, hash_type);
3645
3646 if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
3647 if (hn_ifp != ifp) {
3648 const struct ether_header *eh;
3649
3650 /*
3651 * Non-transparent mode VF is activated.
3652 */
3653
3654 /*
3655 * Allow tapping on hn(4).
3656 */
3657 ETHER_BPF_MTAP(hn_ifp, m_new);
3658
3659 /*
3660 * Update hn(4)'s stats.
3661 */
3662 if_inc_counter(hn_ifp, IFCOUNTER_IPACKETS, 1);
3663 if_inc_counter(hn_ifp, IFCOUNTER_IBYTES, m_new->m_pkthdr.len);
3664 /* Checked at the beginning of this function. */
3665 KASSERT(m_new->m_len >= ETHER_HDR_LEN, ("not ethernet frame"));
3666 eh = mtod(m_new, struct ether_header *);
3667 if (ETHER_IS_MULTICAST(eh->ether_dhost))
3668 if_inc_counter(hn_ifp, IFCOUNTER_IMCASTS, 1);
3669 }
3670 rxr->hn_pkts++;
3671
3672 if ((hn_ifp->if_capenable & IFCAP_LRO) && do_lro) {
3673 #if defined(INET) || defined(INET6)
3674 struct lro_ctrl *lro = &rxr->hn_lro;
3675
3676 if (lro->lro_cnt) {
3677 rxr->hn_lro_tried++;
3678 if (hn_lro_rx(lro, m_new) == 0) {
3679 /* DONE! */
3680 return 0;
3681 }
3682 }
3683 #endif
3684 }
3685 ifp->if_input(ifp, m_new);
3686
3687 return (0);
3688 }
3689
3690 static int
hn_ioctl(struct ifnet * ifp,u_long cmd,caddr_t data)3691 hn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
3692 {
3693 struct hn_softc *sc = ifp->if_softc;
3694 struct ifreq *ifr = (struct ifreq *)data, ifr_vf;
3695 struct ifnet *vf_ifp;
3696 int mask, error = 0;
3697 struct ifrsskey *ifrk;
3698 struct ifrsshash *ifrh;
3699 uint32_t mtu;
3700
3701 switch (cmd) {
3702 case SIOCSIFMTU:
3703 if (ifr->ifr_mtu > HN_MTU_MAX) {
3704 error = EINVAL;
3705 break;
3706 }
3707
3708 HN_LOCK(sc);
3709
3710 if ((sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) == 0) {
3711 HN_UNLOCK(sc);
3712 break;
3713 }
3714
3715 if ((sc->hn_caps & HN_CAP_MTU) == 0) {
3716 /* Can't change MTU */
3717 HN_UNLOCK(sc);
3718 error = EOPNOTSUPP;
3719 break;
3720 }
3721
3722 if (ifp->if_mtu == ifr->ifr_mtu) {
3723 HN_UNLOCK(sc);
3724 break;
3725 }
3726
3727 if (hn_xpnt_vf_isready(sc)) {
3728 vf_ifp = sc->hn_vf_ifp;
3729 ifr_vf = *ifr;
3730 strlcpy(ifr_vf.ifr_name, vf_ifp->if_xname,
3731 sizeof(ifr_vf.ifr_name));
3732 error = vf_ifp->if_ioctl(vf_ifp, SIOCSIFMTU,
3733 (caddr_t)&ifr_vf);
3734 if (error) {
3735 HN_UNLOCK(sc);
3736 if_printf(ifp, "%s SIOCSIFMTU %d failed: %d\n",
3737 vf_ifp->if_xname, ifr->ifr_mtu, error);
3738 break;
3739 }
3740 }
3741
3742 /*
3743 * Suspend this interface before the synthetic parts
3744 * are ripped.
3745 */
3746 hn_suspend(sc);
3747
3748 /*
3749 * Detach the synthetics parts, i.e. NVS and RNDIS.
3750 */
3751 hn_synth_detach(sc);
3752
3753 /*
3754 * Reattach the synthetic parts, i.e. NVS and RNDIS,
3755 * with the new MTU setting.
3756 */
3757 error = hn_synth_attach(sc, ifr->ifr_mtu);
3758 if (error) {
3759 HN_UNLOCK(sc);
3760 break;
3761 }
3762
3763 error = hn_rndis_get_mtu(sc, &mtu);
3764 if (error)
3765 mtu = ifr->ifr_mtu;
3766 else if (bootverbose)
3767 if_printf(ifp, "RNDIS mtu %u\n", mtu);
3768
3769 /*
3770 * Commit the requested MTU, after the synthetic parts
3771 * have been successfully attached.
3772 */
3773 if (mtu >= ifr->ifr_mtu) {
3774 mtu = ifr->ifr_mtu;
3775 } else {
3776 if_printf(ifp, "fixup mtu %d -> %u\n",
3777 ifr->ifr_mtu, mtu);
3778 }
3779 ifp->if_mtu = mtu;
3780
3781 /*
3782 * Synthetic parts' reattach may change the chimney
3783 * sending size; update it.
3784 */
3785 if (sc->hn_tx_ring[0].hn_chim_size > sc->hn_chim_szmax)
3786 hn_set_chim_size(sc, sc->hn_chim_szmax);
3787
3788 /*
3789 * Make sure that various parameters based on MTU are
3790 * still valid, after the MTU change.
3791 */
3792 hn_mtu_change_fixup(sc);
3793
3794 /*
3795 * All done! Resume the interface now.
3796 */
3797 hn_resume(sc);
3798
3799 if ((sc->hn_flags & HN_FLAG_RXVF) ||
3800 (sc->hn_xvf_flags & HN_XVFFLAG_ENABLED)) {
3801 /*
3802 * Since we have reattached the NVS part,
3803 * change the datapath to VF again; in case
3804 * that it is lost, after the NVS was detached.
3805 */
3806 hn_nvs_set_datapath(sc, HN_NVS_DATAPATH_VF);
3807 }
3808
3809 HN_UNLOCK(sc);
3810 break;
3811
3812 case SIOCSIFFLAGS:
3813 HN_LOCK(sc);
3814
3815 if ((sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) == 0) {
3816 HN_UNLOCK(sc);
3817 break;
3818 }
3819
3820 if (hn_xpnt_vf_isready(sc))
3821 hn_xpnt_vf_saveifflags(sc);
3822
3823 if (ifp->if_flags & IFF_UP) {
3824 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
3825 /*
3826 * Caller meight hold mutex, e.g.
3827 * bpf; use busy-wait for the RNDIS
3828 * reply.
3829 */
3830 HN_NO_SLEEPING(sc);
3831 hn_rxfilter_config(sc);
3832 HN_SLEEPING_OK(sc);
3833
3834 if (sc->hn_xvf_flags & HN_XVFFLAG_ENABLED)
3835 error = hn_xpnt_vf_iocsetflags(sc);
3836 } else {
3837 hn_init_locked(sc);
3838 }
3839 } else {
3840 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
3841 hn_stop(sc, false);
3842 }
3843 sc->hn_if_flags = ifp->if_flags;
3844
3845 HN_UNLOCK(sc);
3846 break;
3847
3848 case SIOCSIFCAP:
3849 HN_LOCK(sc);
3850
3851 if (hn_xpnt_vf_isready(sc)) {
3852 ifr_vf = *ifr;
3853 strlcpy(ifr_vf.ifr_name, sc->hn_vf_ifp->if_xname,
3854 sizeof(ifr_vf.ifr_name));
3855 error = hn_xpnt_vf_iocsetcaps(sc, &ifr_vf);
3856 HN_UNLOCK(sc);
3857 break;
3858 }
3859
3860 /*
3861 * Fix up requested capabilities w/ supported capabilities,
3862 * since the supported capabilities could have been changed.
3863 */
3864 mask = (ifr->ifr_reqcap & ifp->if_capabilities) ^
3865 ifp->if_capenable;
3866
3867 if (mask & IFCAP_TXCSUM) {
3868 ifp->if_capenable ^= IFCAP_TXCSUM;
3869 if (ifp->if_capenable & IFCAP_TXCSUM)
3870 ifp->if_hwassist |= HN_CSUM_IP_HWASSIST(sc);
3871 else
3872 ifp->if_hwassist &= ~HN_CSUM_IP_HWASSIST(sc);
3873 }
3874 if (mask & IFCAP_TXCSUM_IPV6) {
3875 ifp->if_capenable ^= IFCAP_TXCSUM_IPV6;
3876 if (ifp->if_capenable & IFCAP_TXCSUM_IPV6)
3877 ifp->if_hwassist |= HN_CSUM_IP6_HWASSIST(sc);
3878 else
3879 ifp->if_hwassist &= ~HN_CSUM_IP6_HWASSIST(sc);
3880 }
3881
3882 /* TODO: flip RNDIS offload parameters for RXCSUM. */
3883 if (mask & IFCAP_RXCSUM)
3884 ifp->if_capenable ^= IFCAP_RXCSUM;
3885 #ifdef foo
3886 /* We can't diff IPv6 packets from IPv4 packets on RX path. */
3887 if (mask & IFCAP_RXCSUM_IPV6)
3888 ifp->if_capenable ^= IFCAP_RXCSUM_IPV6;
3889 #endif
3890
3891 if (mask & IFCAP_LRO)
3892 ifp->if_capenable ^= IFCAP_LRO;
3893
3894 if (mask & IFCAP_TSO4) {
3895 ifp->if_capenable ^= IFCAP_TSO4;
3896 if (ifp->if_capenable & IFCAP_TSO4)
3897 ifp->if_hwassist |= CSUM_IP_TSO;
3898 else
3899 ifp->if_hwassist &= ~CSUM_IP_TSO;
3900 }
3901 if (mask & IFCAP_TSO6) {
3902 ifp->if_capenable ^= IFCAP_TSO6;
3903 if (ifp->if_capenable & IFCAP_TSO6)
3904 ifp->if_hwassist |= CSUM_IP6_TSO;
3905 else
3906 ifp->if_hwassist &= ~CSUM_IP6_TSO;
3907 }
3908
3909 HN_UNLOCK(sc);
3910 break;
3911
3912 case SIOCADDMULTI:
3913 case SIOCDELMULTI:
3914 HN_LOCK(sc);
3915
3916 if ((sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) == 0) {
3917 HN_UNLOCK(sc);
3918 break;
3919 }
3920 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
3921 /*
3922 * Multicast uses mutex; use busy-wait for
3923 * the RNDIS reply.
3924 */
3925 HN_NO_SLEEPING(sc);
3926 hn_rxfilter_config(sc);
3927 HN_SLEEPING_OK(sc);
3928 }
3929
3930 /* XXX vlan(4) style mcast addr maintenance */
3931 if (hn_xpnt_vf_isready(sc)) {
3932 int old_if_flags;
3933
3934 old_if_flags = sc->hn_vf_ifp->if_flags;
3935 hn_xpnt_vf_saveifflags(sc);
3936
3937 if ((sc->hn_xvf_flags & HN_XVFFLAG_ENABLED) &&
3938 ((old_if_flags ^ sc->hn_vf_ifp->if_flags) &
3939 IFF_ALLMULTI))
3940 error = hn_xpnt_vf_iocsetflags(sc);
3941 }
3942
3943 HN_UNLOCK(sc);
3944 break;
3945
3946 case SIOCSIFMEDIA:
3947 case SIOCGIFMEDIA:
3948 HN_LOCK(sc);
3949 if (hn_xpnt_vf_isready(sc)) {
3950 /*
3951 * SIOCGIFMEDIA expects ifmediareq, so don't
3952 * create and pass ifr_vf to the VF here; just
3953 * replace the ifr_name.
3954 */
3955 vf_ifp = sc->hn_vf_ifp;
3956 strlcpy(ifr->ifr_name, vf_ifp->if_xname,
3957 sizeof(ifr->ifr_name));
3958 error = vf_ifp->if_ioctl(vf_ifp, cmd, data);
3959 /* Restore the ifr_name. */
3960 strlcpy(ifr->ifr_name, ifp->if_xname,
3961 sizeof(ifr->ifr_name));
3962 HN_UNLOCK(sc);
3963 break;
3964 }
3965 HN_UNLOCK(sc);
3966 error = ifmedia_ioctl(ifp, ifr, &sc->hn_media, cmd);
3967 break;
3968
3969 case SIOCGIFRSSHASH:
3970 ifrh = (struct ifrsshash *)data;
3971 HN_LOCK(sc);
3972 if (sc->hn_rx_ring_inuse == 1) {
3973 HN_UNLOCK(sc);
3974 ifrh->ifrh_func = RSS_FUNC_NONE;
3975 ifrh->ifrh_types = 0;
3976 break;
3977 }
3978
3979 if (sc->hn_rss_hash & NDIS_HASH_FUNCTION_TOEPLITZ)
3980 ifrh->ifrh_func = RSS_FUNC_TOEPLITZ;
3981 else
3982 ifrh->ifrh_func = RSS_FUNC_PRIVATE;
3983 ifrh->ifrh_types = hn_rss_type_fromndis(sc->hn_rss_hash);
3984 HN_UNLOCK(sc);
3985 break;
3986
3987 case SIOCGIFRSSKEY:
3988 ifrk = (struct ifrsskey *)data;
3989 HN_LOCK(sc);
3990 if (sc->hn_rx_ring_inuse == 1) {
3991 HN_UNLOCK(sc);
3992 ifrk->ifrk_func = RSS_FUNC_NONE;
3993 ifrk->ifrk_keylen = 0;
3994 break;
3995 }
3996 if (sc->hn_rss_hash & NDIS_HASH_FUNCTION_TOEPLITZ)
3997 ifrk->ifrk_func = RSS_FUNC_TOEPLITZ;
3998 else
3999 ifrk->ifrk_func = RSS_FUNC_PRIVATE;
4000 ifrk->ifrk_keylen = NDIS_HASH_KEYSIZE_TOEPLITZ;
4001 memcpy(ifrk->ifrk_key, sc->hn_rss.rss_key,
4002 NDIS_HASH_KEYSIZE_TOEPLITZ);
4003 HN_UNLOCK(sc);
4004 break;
4005
4006 default:
4007 error = ether_ioctl(ifp, cmd, data);
4008 break;
4009 }
4010 return (error);
4011 }
4012
4013 static void
hn_stop(struct hn_softc * sc,bool detaching)4014 hn_stop(struct hn_softc *sc, bool detaching)
4015 {
4016 struct ifnet *ifp = sc->hn_ifp;
4017 int i;
4018
4019 HN_LOCK_ASSERT(sc);
4020
4021 KASSERT(sc->hn_flags & HN_FLAG_SYNTH_ATTACHED,
4022 ("synthetic parts were not attached"));
4023
4024 /* Clear RUNNING bit ASAP. */
4025 atomic_clear_int(&ifp->if_drv_flags, IFF_DRV_RUNNING);
4026
4027 /* Disable polling. */
4028 hn_polling(sc, 0);
4029
4030 if (sc->hn_xvf_flags & HN_XVFFLAG_ENABLED) {
4031 KASSERT(sc->hn_vf_ifp != NULL,
4032 ("%s: VF is not attached", ifp->if_xname));
4033
4034 /* Mark transparent mode VF as disabled. */
4035 hn_xpnt_vf_setdisable(sc, false /* keep hn_vf_ifp */);
4036
4037 /*
4038 * NOTE:
4039 * Datapath setting must happen _before_ bringing
4040 * the VF down.
4041 */
4042 hn_nvs_set_datapath(sc, HN_NVS_DATAPATH_SYNTH);
4043
4044 /*
4045 * Bring the VF down.
4046 */
4047 hn_xpnt_vf_saveifflags(sc);
4048 sc->hn_vf_ifp->if_flags &= ~IFF_UP;
4049 hn_xpnt_vf_iocsetflags(sc);
4050 }
4051
4052 /* Suspend data transfers. */
4053 hn_suspend_data(sc);
4054
4055 /* Clear OACTIVE bit. */
4056 atomic_clear_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
4057 for (i = 0; i < sc->hn_tx_ring_inuse; ++i)
4058 sc->hn_tx_ring[i].hn_oactive = 0;
4059
4060 /*
4061 * If the non-transparent mode VF is active, make sure
4062 * that the RX filter still allows packet reception.
4063 */
4064 if (!detaching && (sc->hn_flags & HN_FLAG_RXVF))
4065 hn_rxfilter_config(sc);
4066 }
4067
4068 static void
hn_init_locked(struct hn_softc * sc)4069 hn_init_locked(struct hn_softc *sc)
4070 {
4071 struct ifnet *ifp = sc->hn_ifp;
4072 int i;
4073
4074 HN_LOCK_ASSERT(sc);
4075
4076 if ((sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) == 0)
4077 return;
4078
4079 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
4080 return;
4081
4082 /* Configure RX filter */
4083 hn_rxfilter_config(sc);
4084
4085 /* Clear OACTIVE bit. */
4086 atomic_clear_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
4087 for (i = 0; i < sc->hn_tx_ring_inuse; ++i)
4088 sc->hn_tx_ring[i].hn_oactive = 0;
4089
4090 /* Clear TX 'suspended' bit. */
4091 hn_resume_tx(sc, sc->hn_tx_ring_inuse);
4092
4093 if (hn_xpnt_vf_isready(sc)) {
4094 /* Initialize transparent VF. */
4095 hn_xpnt_vf_init(sc);
4096 }
4097
4098 /* Everything is ready; unleash! */
4099 atomic_set_int(&ifp->if_drv_flags, IFF_DRV_RUNNING);
4100
4101 /* Re-enable polling if requested. */
4102 if (sc->hn_pollhz > 0)
4103 hn_polling(sc, sc->hn_pollhz);
4104 }
4105
4106 static void
hn_init(void * xsc)4107 hn_init(void *xsc)
4108 {
4109 struct hn_softc *sc = xsc;
4110
4111 HN_LOCK(sc);
4112 hn_init_locked(sc);
4113 HN_UNLOCK(sc);
4114 }
4115
4116 #if __FreeBSD_version >= 1100099
4117
4118 static int
hn_lro_lenlim_sysctl(SYSCTL_HANDLER_ARGS)4119 hn_lro_lenlim_sysctl(SYSCTL_HANDLER_ARGS)
4120 {
4121 struct hn_softc *sc = arg1;
4122 unsigned int lenlim;
4123 int error;
4124
4125 lenlim = sc->hn_rx_ring[0].hn_lro.lro_length_lim;
4126 error = sysctl_handle_int(oidp, &lenlim, 0, req);
4127 if (error || req->newptr == NULL)
4128 return error;
4129
4130 HN_LOCK(sc);
4131 if (lenlim < HN_LRO_LENLIM_MIN(sc->hn_ifp) ||
4132 lenlim > TCP_LRO_LENGTH_MAX) {
4133 HN_UNLOCK(sc);
4134 return EINVAL;
4135 }
4136 hn_set_lro_lenlim(sc, lenlim);
4137 HN_UNLOCK(sc);
4138
4139 return 0;
4140 }
4141
4142 static int
hn_lro_ackcnt_sysctl(SYSCTL_HANDLER_ARGS)4143 hn_lro_ackcnt_sysctl(SYSCTL_HANDLER_ARGS)
4144 {
4145 struct hn_softc *sc = arg1;
4146 int ackcnt, error, i;
4147
4148 /*
4149 * lro_ackcnt_lim is append count limit,
4150 * +1 to turn it into aggregation limit.
4151 */
4152 ackcnt = sc->hn_rx_ring[0].hn_lro.lro_ackcnt_lim + 1;
4153 error = sysctl_handle_int(oidp, &ackcnt, 0, req);
4154 if (error || req->newptr == NULL)
4155 return error;
4156
4157 if (ackcnt < 2 || ackcnt > (TCP_LRO_ACKCNT_MAX + 1))
4158 return EINVAL;
4159
4160 /*
4161 * Convert aggregation limit back to append
4162 * count limit.
4163 */
4164 --ackcnt;
4165 HN_LOCK(sc);
4166 for (i = 0; i < sc->hn_rx_ring_cnt; ++i)
4167 sc->hn_rx_ring[i].hn_lro.lro_ackcnt_lim = ackcnt;
4168 HN_UNLOCK(sc);
4169 return 0;
4170 }
4171
4172 #endif
4173
4174 static int
hn_trust_hcsum_sysctl(SYSCTL_HANDLER_ARGS)4175 hn_trust_hcsum_sysctl(SYSCTL_HANDLER_ARGS)
4176 {
4177 struct hn_softc *sc = arg1;
4178 int hcsum = arg2;
4179 int on, error, i;
4180
4181 on = 0;
4182 if (sc->hn_rx_ring[0].hn_trust_hcsum & hcsum)
4183 on = 1;
4184
4185 error = sysctl_handle_int(oidp, &on, 0, req);
4186 if (error || req->newptr == NULL)
4187 return error;
4188
4189 HN_LOCK(sc);
4190 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
4191 struct hn_rx_ring *rxr = &sc->hn_rx_ring[i];
4192
4193 if (on)
4194 rxr->hn_trust_hcsum |= hcsum;
4195 else
4196 rxr->hn_trust_hcsum &= ~hcsum;
4197 }
4198 HN_UNLOCK(sc);
4199 return 0;
4200 }
4201
4202 static int
hn_chim_size_sysctl(SYSCTL_HANDLER_ARGS)4203 hn_chim_size_sysctl(SYSCTL_HANDLER_ARGS)
4204 {
4205 struct hn_softc *sc = arg1;
4206 int chim_size, error;
4207
4208 chim_size = sc->hn_tx_ring[0].hn_chim_size;
4209 error = sysctl_handle_int(oidp, &chim_size, 0, req);
4210 if (error || req->newptr == NULL)
4211 return error;
4212
4213 if (chim_size > sc->hn_chim_szmax || chim_size <= 0)
4214 return EINVAL;
4215
4216 HN_LOCK(sc);
4217 hn_set_chim_size(sc, chim_size);
4218 HN_UNLOCK(sc);
4219 return 0;
4220 }
4221
4222 #if __FreeBSD_version < 1100095
4223 static int
hn_rx_stat_int_sysctl(SYSCTL_HANDLER_ARGS)4224 hn_rx_stat_int_sysctl(SYSCTL_HANDLER_ARGS)
4225 {
4226 struct hn_softc *sc = arg1;
4227 int ofs = arg2, i, error;
4228 struct hn_rx_ring *rxr;
4229 uint64_t stat;
4230
4231 stat = 0;
4232 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
4233 rxr = &sc->hn_rx_ring[i];
4234 stat += *((int *)((uint8_t *)rxr + ofs));
4235 }
4236
4237 error = sysctl_handle_64(oidp, &stat, 0, req);
4238 if (error || req->newptr == NULL)
4239 return error;
4240
4241 /* Zero out this stat. */
4242 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
4243 rxr = &sc->hn_rx_ring[i];
4244 *((int *)((uint8_t *)rxr + ofs)) = 0;
4245 }
4246 return 0;
4247 }
4248 #else
4249 static int
hn_rx_stat_u64_sysctl(SYSCTL_HANDLER_ARGS)4250 hn_rx_stat_u64_sysctl(SYSCTL_HANDLER_ARGS)
4251 {
4252 struct hn_softc *sc = arg1;
4253 int ofs = arg2, i, error;
4254 struct hn_rx_ring *rxr;
4255 uint64_t stat;
4256
4257 stat = 0;
4258 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
4259 rxr = &sc->hn_rx_ring[i];
4260 stat += *((uint64_t *)((uint8_t *)rxr + ofs));
4261 }
4262
4263 error = sysctl_handle_64(oidp, &stat, 0, req);
4264 if (error || req->newptr == NULL)
4265 return error;
4266
4267 /* Zero out this stat. */
4268 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
4269 rxr = &sc->hn_rx_ring[i];
4270 *((uint64_t *)((uint8_t *)rxr + ofs)) = 0;
4271 }
4272 return 0;
4273 }
4274
4275 #endif
4276
4277 static int
hn_rx_stat_ulong_sysctl(SYSCTL_HANDLER_ARGS)4278 hn_rx_stat_ulong_sysctl(SYSCTL_HANDLER_ARGS)
4279 {
4280 struct hn_softc *sc = arg1;
4281 int ofs = arg2, i, error;
4282 struct hn_rx_ring *rxr;
4283 u_long stat;
4284
4285 stat = 0;
4286 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
4287 rxr = &sc->hn_rx_ring[i];
4288 stat += *((u_long *)((uint8_t *)rxr + ofs));
4289 }
4290
4291 error = sysctl_handle_long(oidp, &stat, 0, req);
4292 if (error || req->newptr == NULL)
4293 return error;
4294
4295 /* Zero out this stat. */
4296 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
4297 rxr = &sc->hn_rx_ring[i];
4298 *((u_long *)((uint8_t *)rxr + ofs)) = 0;
4299 }
4300 return 0;
4301 }
4302
4303 static int
hn_tx_stat_ulong_sysctl(SYSCTL_HANDLER_ARGS)4304 hn_tx_stat_ulong_sysctl(SYSCTL_HANDLER_ARGS)
4305 {
4306 struct hn_softc *sc = arg1;
4307 int ofs = arg2, i, error;
4308 struct hn_tx_ring *txr;
4309 u_long stat;
4310
4311 stat = 0;
4312 for (i = 0; i < sc->hn_tx_ring_cnt; ++i) {
4313 txr = &sc->hn_tx_ring[i];
4314 stat += *((u_long *)((uint8_t *)txr + ofs));
4315 }
4316
4317 error = sysctl_handle_long(oidp, &stat, 0, req);
4318 if (error || req->newptr == NULL)
4319 return error;
4320
4321 /* Zero out this stat. */
4322 for (i = 0; i < sc->hn_tx_ring_cnt; ++i) {
4323 txr = &sc->hn_tx_ring[i];
4324 *((u_long *)((uint8_t *)txr + ofs)) = 0;
4325 }
4326 return 0;
4327 }
4328
4329 static int
hn_tx_conf_int_sysctl(SYSCTL_HANDLER_ARGS)4330 hn_tx_conf_int_sysctl(SYSCTL_HANDLER_ARGS)
4331 {
4332 struct hn_softc *sc = arg1;
4333 int ofs = arg2, i, error, conf;
4334 struct hn_tx_ring *txr;
4335
4336 txr = &sc->hn_tx_ring[0];
4337 conf = *((int *)((uint8_t *)txr + ofs));
4338
4339 error = sysctl_handle_int(oidp, &conf, 0, req);
4340 if (error || req->newptr == NULL)
4341 return error;
4342
4343 HN_LOCK(sc);
4344 for (i = 0; i < sc->hn_tx_ring_cnt; ++i) {
4345 txr = &sc->hn_tx_ring[i];
4346 *((int *)((uint8_t *)txr + ofs)) = conf;
4347 }
4348 HN_UNLOCK(sc);
4349
4350 return 0;
4351 }
4352
4353 static int
hn_txagg_size_sysctl(SYSCTL_HANDLER_ARGS)4354 hn_txagg_size_sysctl(SYSCTL_HANDLER_ARGS)
4355 {
4356 struct hn_softc *sc = arg1;
4357 int error, size;
4358
4359 size = sc->hn_agg_size;
4360 error = sysctl_handle_int(oidp, &size, 0, req);
4361 if (error || req->newptr == NULL)
4362 return (error);
4363
4364 HN_LOCK(sc);
4365 sc->hn_agg_size = size;
4366 hn_set_txagg(sc);
4367 HN_UNLOCK(sc);
4368
4369 return (0);
4370 }
4371
4372 static int
hn_txagg_pkts_sysctl(SYSCTL_HANDLER_ARGS)4373 hn_txagg_pkts_sysctl(SYSCTL_HANDLER_ARGS)
4374 {
4375 struct hn_softc *sc = arg1;
4376 int error, pkts;
4377
4378 pkts = sc->hn_agg_pkts;
4379 error = sysctl_handle_int(oidp, &pkts, 0, req);
4380 if (error || req->newptr == NULL)
4381 return (error);
4382
4383 HN_LOCK(sc);
4384 sc->hn_agg_pkts = pkts;
4385 hn_set_txagg(sc);
4386 HN_UNLOCK(sc);
4387
4388 return (0);
4389 }
4390
4391 static int
hn_txagg_pktmax_sysctl(SYSCTL_HANDLER_ARGS)4392 hn_txagg_pktmax_sysctl(SYSCTL_HANDLER_ARGS)
4393 {
4394 struct hn_softc *sc = arg1;
4395 int pkts;
4396
4397 pkts = sc->hn_tx_ring[0].hn_agg_pktmax;
4398 return (sysctl_handle_int(oidp, &pkts, 0, req));
4399 }
4400
4401 static int
hn_txagg_align_sysctl(SYSCTL_HANDLER_ARGS)4402 hn_txagg_align_sysctl(SYSCTL_HANDLER_ARGS)
4403 {
4404 struct hn_softc *sc = arg1;
4405 int align;
4406
4407 align = sc->hn_tx_ring[0].hn_agg_align;
4408 return (sysctl_handle_int(oidp, &align, 0, req));
4409 }
4410
4411 static void
hn_chan_polling(struct vmbus_channel * chan,u_int pollhz)4412 hn_chan_polling(struct vmbus_channel *chan, u_int pollhz)
4413 {
4414 if (pollhz == 0)
4415 vmbus_chan_poll_disable(chan);
4416 else
4417 vmbus_chan_poll_enable(chan, pollhz);
4418 }
4419
4420 static void
hn_polling(struct hn_softc * sc,u_int pollhz)4421 hn_polling(struct hn_softc *sc, u_int pollhz)
4422 {
4423 int nsubch = sc->hn_rx_ring_inuse - 1;
4424
4425 HN_LOCK_ASSERT(sc);
4426
4427 if (nsubch > 0) {
4428 struct vmbus_channel **subch;
4429 int i;
4430
4431 subch = vmbus_subchan_get(sc->hn_prichan, nsubch);
4432 for (i = 0; i < nsubch; ++i)
4433 hn_chan_polling(subch[i], pollhz);
4434 vmbus_subchan_rel(subch, nsubch);
4435 }
4436 hn_chan_polling(sc->hn_prichan, pollhz);
4437 }
4438
4439 static int
hn_polling_sysctl(SYSCTL_HANDLER_ARGS)4440 hn_polling_sysctl(SYSCTL_HANDLER_ARGS)
4441 {
4442 struct hn_softc *sc = arg1;
4443 int pollhz, error;
4444
4445 pollhz = sc->hn_pollhz;
4446 error = sysctl_handle_int(oidp, &pollhz, 0, req);
4447 if (error || req->newptr == NULL)
4448 return (error);
4449
4450 if (pollhz != 0 &&
4451 (pollhz < VMBUS_CHAN_POLLHZ_MIN || pollhz > VMBUS_CHAN_POLLHZ_MAX))
4452 return (EINVAL);
4453
4454 HN_LOCK(sc);
4455 if (sc->hn_pollhz != pollhz) {
4456 sc->hn_pollhz = pollhz;
4457 if ((sc->hn_ifp->if_drv_flags & IFF_DRV_RUNNING) &&
4458 (sc->hn_flags & HN_FLAG_SYNTH_ATTACHED))
4459 hn_polling(sc, sc->hn_pollhz);
4460 }
4461 HN_UNLOCK(sc);
4462
4463 return (0);
4464 }
4465
4466 static int
hn_ndis_version_sysctl(SYSCTL_HANDLER_ARGS)4467 hn_ndis_version_sysctl(SYSCTL_HANDLER_ARGS)
4468 {
4469 struct hn_softc *sc = arg1;
4470 char verstr[16];
4471
4472 snprintf(verstr, sizeof(verstr), "%u.%u",
4473 HN_NDIS_VERSION_MAJOR(sc->hn_ndis_ver),
4474 HN_NDIS_VERSION_MINOR(sc->hn_ndis_ver));
4475 return sysctl_handle_string(oidp, verstr, sizeof(verstr), req);
4476 }
4477
4478 static int
hn_caps_sysctl(SYSCTL_HANDLER_ARGS)4479 hn_caps_sysctl(SYSCTL_HANDLER_ARGS)
4480 {
4481 struct hn_softc *sc = arg1;
4482 char caps_str[128];
4483 uint32_t caps;
4484
4485 HN_LOCK(sc);
4486 caps = sc->hn_caps;
4487 HN_UNLOCK(sc);
4488 snprintf(caps_str, sizeof(caps_str), "%b", caps, HN_CAP_BITS);
4489 return sysctl_handle_string(oidp, caps_str, sizeof(caps_str), req);
4490 }
4491
4492 static int
hn_hwassist_sysctl(SYSCTL_HANDLER_ARGS)4493 hn_hwassist_sysctl(SYSCTL_HANDLER_ARGS)
4494 {
4495 struct hn_softc *sc = arg1;
4496 char assist_str[128];
4497 uint32_t hwassist;
4498
4499 HN_LOCK(sc);
4500 hwassist = sc->hn_ifp->if_hwassist;
4501 HN_UNLOCK(sc);
4502 snprintf(assist_str, sizeof(assist_str), "%b", hwassist, CSUM_BITS);
4503 return sysctl_handle_string(oidp, assist_str, sizeof(assist_str), req);
4504 }
4505
4506 static int
hn_rxfilter_sysctl(SYSCTL_HANDLER_ARGS)4507 hn_rxfilter_sysctl(SYSCTL_HANDLER_ARGS)
4508 {
4509 struct hn_softc *sc = arg1;
4510 char filter_str[128];
4511 uint32_t filter;
4512
4513 HN_LOCK(sc);
4514 filter = sc->hn_rx_filter;
4515 HN_UNLOCK(sc);
4516 snprintf(filter_str, sizeof(filter_str), "%b", filter,
4517 NDIS_PACKET_TYPES);
4518 return sysctl_handle_string(oidp, filter_str, sizeof(filter_str), req);
4519 }
4520
4521 #ifndef RSS
4522
4523 static int
hn_rss_key_sysctl(SYSCTL_HANDLER_ARGS)4524 hn_rss_key_sysctl(SYSCTL_HANDLER_ARGS)
4525 {
4526 struct hn_softc *sc = arg1;
4527 int error;
4528
4529 HN_LOCK(sc);
4530
4531 error = SYSCTL_OUT(req, sc->hn_rss.rss_key, sizeof(sc->hn_rss.rss_key));
4532 if (error || req->newptr == NULL)
4533 goto back;
4534
4535 if ((sc->hn_flags & HN_FLAG_RXVF) ||
4536 (hn_xpnt_vf && sc->hn_vf_ifp != NULL)) {
4537 /*
4538 * RSS key is synchronized w/ VF's, don't allow users
4539 * to change it.
4540 */
4541 error = EBUSY;
4542 goto back;
4543 }
4544
4545 error = SYSCTL_IN(req, sc->hn_rss.rss_key, sizeof(sc->hn_rss.rss_key));
4546 if (error)
4547 goto back;
4548 sc->hn_flags |= HN_FLAG_HAS_RSSKEY;
4549
4550 if (sc->hn_rx_ring_inuse > 1) {
4551 error = hn_rss_reconfig(sc);
4552 } else {
4553 /* Not RSS capable, at least for now; just save the RSS key. */
4554 error = 0;
4555 }
4556 back:
4557 HN_UNLOCK(sc);
4558 return (error);
4559 }
4560
4561 static int
hn_rss_ind_sysctl(SYSCTL_HANDLER_ARGS)4562 hn_rss_ind_sysctl(SYSCTL_HANDLER_ARGS)
4563 {
4564 struct hn_softc *sc = arg1;
4565 int error;
4566
4567 HN_LOCK(sc);
4568
4569 error = SYSCTL_OUT(req, sc->hn_rss.rss_ind, sizeof(sc->hn_rss.rss_ind));
4570 if (error || req->newptr == NULL)
4571 goto back;
4572
4573 /*
4574 * Don't allow RSS indirect table change, if this interface is not
4575 * RSS capable currently.
4576 */
4577 if (sc->hn_rx_ring_inuse == 1) {
4578 error = EOPNOTSUPP;
4579 goto back;
4580 }
4581
4582 error = SYSCTL_IN(req, sc->hn_rss.rss_ind, sizeof(sc->hn_rss.rss_ind));
4583 if (error)
4584 goto back;
4585 sc->hn_flags |= HN_FLAG_HAS_RSSIND;
4586
4587 hn_rss_ind_fixup(sc);
4588 error = hn_rss_reconfig(sc);
4589 back:
4590 HN_UNLOCK(sc);
4591 return (error);
4592 }
4593
4594 #endif /* !RSS */
4595
4596 static int
hn_rss_hash_sysctl(SYSCTL_HANDLER_ARGS)4597 hn_rss_hash_sysctl(SYSCTL_HANDLER_ARGS)
4598 {
4599 struct hn_softc *sc = arg1;
4600 char hash_str[128];
4601 uint32_t hash;
4602
4603 HN_LOCK(sc);
4604 hash = sc->hn_rss_hash;
4605 HN_UNLOCK(sc);
4606 snprintf(hash_str, sizeof(hash_str), "%b", hash, NDIS_HASH_BITS);
4607 return sysctl_handle_string(oidp, hash_str, sizeof(hash_str), req);
4608 }
4609
4610 static int
hn_rss_hcap_sysctl(SYSCTL_HANDLER_ARGS)4611 hn_rss_hcap_sysctl(SYSCTL_HANDLER_ARGS)
4612 {
4613 struct hn_softc *sc = arg1;
4614 char hash_str[128];
4615 uint32_t hash;
4616
4617 HN_LOCK(sc);
4618 hash = sc->hn_rss_hcap;
4619 HN_UNLOCK(sc);
4620 snprintf(hash_str, sizeof(hash_str), "%b", hash, NDIS_HASH_BITS);
4621 return sysctl_handle_string(oidp, hash_str, sizeof(hash_str), req);
4622 }
4623
4624 static int
hn_rss_mbuf_sysctl(SYSCTL_HANDLER_ARGS)4625 hn_rss_mbuf_sysctl(SYSCTL_HANDLER_ARGS)
4626 {
4627 struct hn_softc *sc = arg1;
4628 char hash_str[128];
4629 uint32_t hash;
4630
4631 HN_LOCK(sc);
4632 hash = sc->hn_rx_ring[0].hn_mbuf_hash;
4633 HN_UNLOCK(sc);
4634 snprintf(hash_str, sizeof(hash_str), "%b", hash, NDIS_HASH_BITS);
4635 return sysctl_handle_string(oidp, hash_str, sizeof(hash_str), req);
4636 }
4637
4638 static int
hn_vf_sysctl(SYSCTL_HANDLER_ARGS)4639 hn_vf_sysctl(SYSCTL_HANDLER_ARGS)
4640 {
4641 struct hn_softc *sc = arg1;
4642 char vf_name[IFNAMSIZ + 1];
4643 struct ifnet *vf_ifp;
4644
4645 HN_LOCK(sc);
4646 vf_name[0] = '\0';
4647 vf_ifp = sc->hn_vf_ifp;
4648 if (vf_ifp != NULL)
4649 snprintf(vf_name, sizeof(vf_name), "%s", vf_ifp->if_xname);
4650 HN_UNLOCK(sc);
4651 return sysctl_handle_string(oidp, vf_name, sizeof(vf_name), req);
4652 }
4653
4654 static int
hn_rxvf_sysctl(SYSCTL_HANDLER_ARGS)4655 hn_rxvf_sysctl(SYSCTL_HANDLER_ARGS)
4656 {
4657 struct hn_softc *sc = arg1;
4658 char vf_name[IFNAMSIZ + 1];
4659 struct ifnet *vf_ifp;
4660
4661 HN_LOCK(sc);
4662 vf_name[0] = '\0';
4663 vf_ifp = sc->hn_rx_ring[0].hn_rxvf_ifp;
4664 if (vf_ifp != NULL)
4665 snprintf(vf_name, sizeof(vf_name), "%s", vf_ifp->if_xname);
4666 HN_UNLOCK(sc);
4667 return sysctl_handle_string(oidp, vf_name, sizeof(vf_name), req);
4668 }
4669
4670 static int
hn_vflist_sysctl(SYSCTL_HANDLER_ARGS)4671 hn_vflist_sysctl(SYSCTL_HANDLER_ARGS)
4672 {
4673 struct rm_priotracker pt;
4674 struct sbuf *sb;
4675 int error, i;
4676 bool first;
4677
4678 error = sysctl_wire_old_buffer(req, 0);
4679 if (error != 0)
4680 return (error);
4681
4682 sb = sbuf_new_for_sysctl(NULL, NULL, 128, req);
4683 if (sb == NULL)
4684 return (ENOMEM);
4685
4686 rm_rlock(&hn_vfmap_lock, &pt);
4687
4688 first = true;
4689 for (i = 0; i < hn_vfmap_size; ++i) {
4690 struct ifnet *ifp;
4691
4692 if (hn_vfmap[i] == NULL)
4693 continue;
4694
4695 ifp = ifnet_byindex(i);
4696 if (ifp != NULL) {
4697 if (first)
4698 sbuf_printf(sb, "%s", ifp->if_xname);
4699 else
4700 sbuf_printf(sb, " %s", ifp->if_xname);
4701 first = false;
4702 }
4703 }
4704
4705 rm_runlock(&hn_vfmap_lock, &pt);
4706
4707 error = sbuf_finish(sb);
4708 sbuf_delete(sb);
4709 return (error);
4710 }
4711
4712 static int
hn_vfmap_sysctl(SYSCTL_HANDLER_ARGS)4713 hn_vfmap_sysctl(SYSCTL_HANDLER_ARGS)
4714 {
4715 struct rm_priotracker pt;
4716 struct sbuf *sb;
4717 int error, i;
4718 bool first;
4719
4720 error = sysctl_wire_old_buffer(req, 0);
4721 if (error != 0)
4722 return (error);
4723
4724 sb = sbuf_new_for_sysctl(NULL, NULL, 128, req);
4725 if (sb == NULL)
4726 return (ENOMEM);
4727
4728 rm_rlock(&hn_vfmap_lock, &pt);
4729
4730 first = true;
4731 for (i = 0; i < hn_vfmap_size; ++i) {
4732 struct ifnet *ifp, *hn_ifp;
4733
4734 hn_ifp = hn_vfmap[i];
4735 if (hn_ifp == NULL)
4736 continue;
4737
4738 ifp = ifnet_byindex(i);
4739 if (ifp != NULL) {
4740 if (first) {
4741 sbuf_printf(sb, "%s:%s", ifp->if_xname,
4742 hn_ifp->if_xname);
4743 } else {
4744 sbuf_printf(sb, " %s:%s", ifp->if_xname,
4745 hn_ifp->if_xname);
4746 }
4747 first = false;
4748 }
4749 }
4750
4751 rm_runlock(&hn_vfmap_lock, &pt);
4752
4753 error = sbuf_finish(sb);
4754 sbuf_delete(sb);
4755 return (error);
4756 }
4757
4758 static int
hn_xpnt_vf_accbpf_sysctl(SYSCTL_HANDLER_ARGS)4759 hn_xpnt_vf_accbpf_sysctl(SYSCTL_HANDLER_ARGS)
4760 {
4761 struct hn_softc *sc = arg1;
4762 int error, onoff = 0;
4763
4764 if (sc->hn_xvf_flags & HN_XVFFLAG_ACCBPF)
4765 onoff = 1;
4766 error = sysctl_handle_int(oidp, &onoff, 0, req);
4767 if (error || req->newptr == NULL)
4768 return (error);
4769
4770 HN_LOCK(sc);
4771 /* NOTE: hn_vf_lock for hn_transmit() */
4772 rm_wlock(&sc->hn_vf_lock);
4773 if (onoff)
4774 sc->hn_xvf_flags |= HN_XVFFLAG_ACCBPF;
4775 else
4776 sc->hn_xvf_flags &= ~HN_XVFFLAG_ACCBPF;
4777 rm_wunlock(&sc->hn_vf_lock);
4778 HN_UNLOCK(sc);
4779
4780 return (0);
4781 }
4782
4783 static int
hn_xpnt_vf_enabled_sysctl(SYSCTL_HANDLER_ARGS)4784 hn_xpnt_vf_enabled_sysctl(SYSCTL_HANDLER_ARGS)
4785 {
4786 struct hn_softc *sc = arg1;
4787 int enabled = 0;
4788
4789 if (sc->hn_xvf_flags & HN_XVFFLAG_ENABLED)
4790 enabled = 1;
4791 return (sysctl_handle_int(oidp, &enabled, 0, req));
4792 }
4793
4794 static int
hn_check_iplen(const struct mbuf * m,int hoff)4795 hn_check_iplen(const struct mbuf *m, int hoff)
4796 {
4797 const struct ip *ip;
4798 int len, iphlen, iplen;
4799 const struct tcphdr *th;
4800 int thoff; /* TCP data offset */
4801
4802 len = hoff + sizeof(struct ip);
4803
4804 /* The packet must be at least the size of an IP header. */
4805 if (m->m_pkthdr.len < len)
4806 return IPPROTO_DONE;
4807
4808 /* The fixed IP header must reside completely in the first mbuf. */
4809 if (m->m_len < len)
4810 return IPPROTO_DONE;
4811
4812 ip = mtodo(m, hoff);
4813
4814 /* Bound check the packet's stated IP header length. */
4815 iphlen = ip->ip_hl << 2;
4816 if (iphlen < sizeof(struct ip)) /* minimum header length */
4817 return IPPROTO_DONE;
4818
4819 /* The full IP header must reside completely in the one mbuf. */
4820 if (m->m_len < hoff + iphlen)
4821 return IPPROTO_DONE;
4822
4823 iplen = ntohs(ip->ip_len);
4824
4825 /*
4826 * Check that the amount of data in the buffers is as
4827 * at least much as the IP header would have us expect.
4828 */
4829 if (m->m_pkthdr.len < hoff + iplen)
4830 return IPPROTO_DONE;
4831
4832 /*
4833 * Ignore IP fragments.
4834 */
4835 if (ntohs(ip->ip_off) & (IP_OFFMASK | IP_MF))
4836 return IPPROTO_DONE;
4837
4838 /*
4839 * The TCP/IP or UDP/IP header must be entirely contained within
4840 * the first fragment of a packet.
4841 */
4842 switch (ip->ip_p) {
4843 case IPPROTO_TCP:
4844 if (iplen < iphlen + sizeof(struct tcphdr))
4845 return IPPROTO_DONE;
4846 if (m->m_len < hoff + iphlen + sizeof(struct tcphdr))
4847 return IPPROTO_DONE;
4848 th = (const struct tcphdr *)((const uint8_t *)ip + iphlen);
4849 thoff = th->th_off << 2;
4850 if (thoff < sizeof(struct tcphdr) || thoff + iphlen > iplen)
4851 return IPPROTO_DONE;
4852 if (m->m_len < hoff + iphlen + thoff)
4853 return IPPROTO_DONE;
4854 break;
4855 case IPPROTO_UDP:
4856 if (iplen < iphlen + sizeof(struct udphdr))
4857 return IPPROTO_DONE;
4858 if (m->m_len < hoff + iphlen + sizeof(struct udphdr))
4859 return IPPROTO_DONE;
4860 break;
4861 default:
4862 if (iplen < iphlen)
4863 return IPPROTO_DONE;
4864 break;
4865 }
4866 return ip->ip_p;
4867 }
4868
4869 static void
hn_rxpkt_proto(const struct mbuf * m_new,int * l3proto,int * l4proto)4870 hn_rxpkt_proto(const struct mbuf *m_new, int *l3proto, int *l4proto)
4871 {
4872 const struct ether_header *eh;
4873 uint16_t etype;
4874 int hoff;
4875
4876 hoff = sizeof(*eh);
4877 /* Checked at the beginning of this function. */
4878 KASSERT(m_new->m_len >= hoff, ("not ethernet frame"));
4879
4880 eh = mtod(m_new, const struct ether_header *);
4881 etype = ntohs(eh->ether_type);
4882 if (etype == ETHERTYPE_VLAN) {
4883 const struct ether_vlan_header *evl;
4884
4885 hoff = sizeof(*evl);
4886 if (m_new->m_len < hoff)
4887 return;
4888 evl = mtod(m_new, const struct ether_vlan_header *);
4889 etype = ntohs(evl->evl_proto);
4890 }
4891 *l3proto = etype;
4892
4893 if (etype == ETHERTYPE_IP)
4894 *l4proto = hn_check_iplen(m_new, hoff);
4895 else
4896 *l4proto = IPPROTO_DONE;
4897 }
4898
4899 static int
hn_create_rx_data(struct hn_softc * sc,int ring_cnt)4900 hn_create_rx_data(struct hn_softc *sc, int ring_cnt)
4901 {
4902 struct sysctl_oid_list *child;
4903 struct sysctl_ctx_list *ctx;
4904 device_t dev = sc->hn_dev;
4905 #if defined(INET) || defined(INET6)
4906 #if __FreeBSD_version >= 1100095
4907 int lroent_cnt;
4908 #endif
4909 #endif
4910 int i;
4911
4912 /*
4913 * Create RXBUF for reception.
4914 *
4915 * NOTE:
4916 * - It is shared by all channels.
4917 * - A large enough buffer is allocated, certain version of NVSes
4918 * may further limit the usable space.
4919 */
4920 sc->hn_rxbuf = hyperv_dmamem_alloc(bus_get_dma_tag(dev),
4921 PAGE_SIZE, 0, HN_RXBUF_SIZE, &sc->hn_rxbuf_dma,
4922 BUS_DMA_WAITOK | BUS_DMA_ZERO);
4923 if (sc->hn_rxbuf == NULL) {
4924 device_printf(sc->hn_dev, "allocate rxbuf failed\n");
4925 return (ENOMEM);
4926 }
4927
4928 sc->hn_rx_ring_cnt = ring_cnt;
4929 sc->hn_rx_ring_inuse = sc->hn_rx_ring_cnt;
4930
4931 sc->hn_rx_ring = malloc(sizeof(struct hn_rx_ring) * sc->hn_rx_ring_cnt,
4932 M_DEVBUF, M_WAITOK | M_ZERO);
4933
4934 #if defined(INET) || defined(INET6)
4935 #if __FreeBSD_version >= 1100095
4936 lroent_cnt = hn_lro_entry_count;
4937 if (lroent_cnt < TCP_LRO_ENTRIES)
4938 lroent_cnt = TCP_LRO_ENTRIES;
4939 if (bootverbose)
4940 device_printf(dev, "LRO: entry count %d\n", lroent_cnt);
4941 #endif
4942 #endif /* INET || INET6 */
4943
4944 ctx = device_get_sysctl_ctx(dev);
4945 child = SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
4946
4947 /* Create dev.hn.UNIT.rx sysctl tree */
4948 sc->hn_rx_sysctl_tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "rx",
4949 CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
4950
4951 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
4952 struct hn_rx_ring *rxr = &sc->hn_rx_ring[i];
4953
4954 rxr->hn_br = hyperv_dmamem_alloc(bus_get_dma_tag(dev),
4955 PAGE_SIZE, 0, HN_TXBR_SIZE + HN_RXBR_SIZE,
4956 &rxr->hn_br_dma, BUS_DMA_WAITOK);
4957 if (rxr->hn_br == NULL) {
4958 device_printf(dev, "allocate bufring failed\n");
4959 return (ENOMEM);
4960 }
4961
4962 if (hn_trust_hosttcp)
4963 rxr->hn_trust_hcsum |= HN_TRUST_HCSUM_TCP;
4964 if (hn_trust_hostudp)
4965 rxr->hn_trust_hcsum |= HN_TRUST_HCSUM_UDP;
4966 if (hn_trust_hostip)
4967 rxr->hn_trust_hcsum |= HN_TRUST_HCSUM_IP;
4968 rxr->hn_mbuf_hash = NDIS_HASH_ALL;
4969 rxr->hn_ifp = sc->hn_ifp;
4970 if (i < sc->hn_tx_ring_cnt)
4971 rxr->hn_txr = &sc->hn_tx_ring[i];
4972 rxr->hn_pktbuf_len = HN_PKTBUF_LEN_DEF;
4973 rxr->hn_pktbuf = malloc(rxr->hn_pktbuf_len, M_DEVBUF, M_WAITOK);
4974 rxr->hn_rx_idx = i;
4975 rxr->hn_rxbuf = sc->hn_rxbuf;
4976
4977 /*
4978 * Initialize LRO.
4979 */
4980 #if defined(INET) || defined(INET6)
4981 #if __FreeBSD_version >= 1100095
4982 tcp_lro_init_args(&rxr->hn_lro, sc->hn_ifp, lroent_cnt,
4983 hn_lro_mbufq_depth);
4984 #else
4985 tcp_lro_init(&rxr->hn_lro);
4986 rxr->hn_lro.ifp = sc->hn_ifp;
4987 #endif
4988 #if __FreeBSD_version >= 1100099
4989 rxr->hn_lro.lro_length_lim = HN_LRO_LENLIM_DEF;
4990 rxr->hn_lro.lro_ackcnt_lim = HN_LRO_ACKCNT_DEF;
4991 #endif
4992 #endif /* INET || INET6 */
4993
4994 if (sc->hn_rx_sysctl_tree != NULL) {
4995 char name[16];
4996
4997 /*
4998 * Create per RX ring sysctl tree:
4999 * dev.hn.UNIT.rx.RINGID
5000 */
5001 snprintf(name, sizeof(name), "%d", i);
5002 rxr->hn_rx_sysctl_tree = SYSCTL_ADD_NODE(ctx,
5003 SYSCTL_CHILDREN(sc->hn_rx_sysctl_tree),
5004 OID_AUTO, name, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
5005
5006 if (rxr->hn_rx_sysctl_tree != NULL) {
5007 SYSCTL_ADD_ULONG(ctx,
5008 SYSCTL_CHILDREN(rxr->hn_rx_sysctl_tree),
5009 OID_AUTO, "packets", CTLFLAG_RW,
5010 &rxr->hn_pkts, "# of packets received");
5011 SYSCTL_ADD_ULONG(ctx,
5012 SYSCTL_CHILDREN(rxr->hn_rx_sysctl_tree),
5013 OID_AUTO, "rss_pkts", CTLFLAG_RW,
5014 &rxr->hn_rss_pkts,
5015 "# of packets w/ RSS info received");
5016 SYSCTL_ADD_INT(ctx,
5017 SYSCTL_CHILDREN(rxr->hn_rx_sysctl_tree),
5018 OID_AUTO, "pktbuf_len", CTLFLAG_RD,
5019 &rxr->hn_pktbuf_len, 0,
5020 "Temporary channel packet buffer length");
5021 }
5022 }
5023 }
5024
5025 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "lro_queued",
5026 CTLTYPE_U64 | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5027 __offsetof(struct hn_rx_ring, hn_lro.lro_queued),
5028 #if __FreeBSD_version < 1100095
5029 hn_rx_stat_int_sysctl,
5030 #else
5031 hn_rx_stat_u64_sysctl,
5032 #endif
5033 "LU", "LRO queued");
5034 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "lro_flushed",
5035 CTLTYPE_U64 | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5036 __offsetof(struct hn_rx_ring, hn_lro.lro_flushed),
5037 #if __FreeBSD_version < 1100095
5038 hn_rx_stat_int_sysctl,
5039 #else
5040 hn_rx_stat_u64_sysctl,
5041 #endif
5042 "LU", "LRO flushed");
5043 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "lro_tried",
5044 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5045 __offsetof(struct hn_rx_ring, hn_lro_tried),
5046 hn_rx_stat_ulong_sysctl, "LU", "# of LRO tries");
5047 #if __FreeBSD_version >= 1100099
5048 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "lro_length_lim",
5049 CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
5050 hn_lro_lenlim_sysctl, "IU",
5051 "Max # of data bytes to be aggregated by LRO");
5052 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "lro_ackcnt_lim",
5053 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
5054 hn_lro_ackcnt_sysctl, "I",
5055 "Max # of ACKs to be aggregated by LRO");
5056 #endif
5057 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "trust_hosttcp",
5058 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, HN_TRUST_HCSUM_TCP,
5059 hn_trust_hcsum_sysctl, "I",
5060 "Trust tcp segement verification on host side, "
5061 "when csum info is missing");
5062 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "trust_hostudp",
5063 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, HN_TRUST_HCSUM_UDP,
5064 hn_trust_hcsum_sysctl, "I",
5065 "Trust udp datagram verification on host side, "
5066 "when csum info is missing");
5067 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "trust_hostip",
5068 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, HN_TRUST_HCSUM_IP,
5069 hn_trust_hcsum_sysctl, "I",
5070 "Trust ip packet verification on host side, "
5071 "when csum info is missing");
5072 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "csum_ip",
5073 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5074 __offsetof(struct hn_rx_ring, hn_csum_ip),
5075 hn_rx_stat_ulong_sysctl, "LU", "RXCSUM IP");
5076 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "csum_tcp",
5077 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5078 __offsetof(struct hn_rx_ring, hn_csum_tcp),
5079 hn_rx_stat_ulong_sysctl, "LU", "RXCSUM TCP");
5080 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "csum_udp",
5081 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5082 __offsetof(struct hn_rx_ring, hn_csum_udp),
5083 hn_rx_stat_ulong_sysctl, "LU", "RXCSUM UDP");
5084 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "csum_trusted",
5085 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5086 __offsetof(struct hn_rx_ring, hn_csum_trusted),
5087 hn_rx_stat_ulong_sysctl, "LU",
5088 "# of packets that we trust host's csum verification");
5089 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "small_pkts",
5090 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5091 __offsetof(struct hn_rx_ring, hn_small_pkts),
5092 hn_rx_stat_ulong_sysctl, "LU", "# of small packets received");
5093 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rx_ack_failed",
5094 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5095 __offsetof(struct hn_rx_ring, hn_ack_failed),
5096 hn_rx_stat_ulong_sysctl, "LU", "# of RXBUF ack failures");
5097 SYSCTL_ADD_INT(ctx, child, OID_AUTO, "rx_ring_cnt",
5098 CTLFLAG_RD, &sc->hn_rx_ring_cnt, 0, "# created RX rings");
5099 SYSCTL_ADD_INT(ctx, child, OID_AUTO, "rx_ring_inuse",
5100 CTLFLAG_RD, &sc->hn_rx_ring_inuse, 0, "# used RX rings");
5101
5102 return (0);
5103 }
5104
5105 static void
hn_destroy_rx_data(struct hn_softc * sc)5106 hn_destroy_rx_data(struct hn_softc *sc)
5107 {
5108 int i;
5109
5110 if (sc->hn_rxbuf != NULL) {
5111 if ((sc->hn_flags & HN_FLAG_RXBUF_REF) == 0)
5112 hyperv_dmamem_free(&sc->hn_rxbuf_dma, sc->hn_rxbuf);
5113 else
5114 device_printf(sc->hn_dev, "RXBUF is referenced\n");
5115 sc->hn_rxbuf = NULL;
5116 }
5117
5118 if (sc->hn_rx_ring_cnt == 0)
5119 return;
5120
5121 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
5122 struct hn_rx_ring *rxr = &sc->hn_rx_ring[i];
5123
5124 if (rxr->hn_br == NULL)
5125 continue;
5126 if ((rxr->hn_rx_flags & HN_RX_FLAG_BR_REF) == 0) {
5127 hyperv_dmamem_free(&rxr->hn_br_dma, rxr->hn_br);
5128 } else {
5129 device_printf(sc->hn_dev,
5130 "%dth channel bufring is referenced", i);
5131 }
5132 rxr->hn_br = NULL;
5133
5134 #if defined(INET) || defined(INET6)
5135 tcp_lro_free(&rxr->hn_lro);
5136 #endif
5137 free(rxr->hn_pktbuf, M_DEVBUF);
5138 }
5139 free(sc->hn_rx_ring, M_DEVBUF);
5140 sc->hn_rx_ring = NULL;
5141
5142 sc->hn_rx_ring_cnt = 0;
5143 sc->hn_rx_ring_inuse = 0;
5144 }
5145
5146 static int
hn_tx_ring_create(struct hn_softc * sc,int id)5147 hn_tx_ring_create(struct hn_softc *sc, int id)
5148 {
5149 struct hn_tx_ring *txr = &sc->hn_tx_ring[id];
5150 device_t dev = sc->hn_dev;
5151 bus_dma_tag_t parent_dtag;
5152 int error, i;
5153
5154 txr->hn_sc = sc;
5155 txr->hn_tx_idx = id;
5156
5157 #ifndef HN_USE_TXDESC_BUFRING
5158 mtx_init(&txr->hn_txlist_spin, "hn txlist", NULL, MTX_SPIN);
5159 #endif
5160 mtx_init(&txr->hn_tx_lock, "hn tx", NULL, MTX_DEF);
5161
5162 txr->hn_txdesc_cnt = HN_TX_DESC_CNT;
5163 txr->hn_txdesc = malloc(sizeof(struct hn_txdesc) * txr->hn_txdesc_cnt,
5164 M_DEVBUF, M_WAITOK | M_ZERO);
5165 #ifndef HN_USE_TXDESC_BUFRING
5166 SLIST_INIT(&txr->hn_txlist);
5167 #else
5168 txr->hn_txdesc_br = buf_ring_alloc(txr->hn_txdesc_cnt, M_DEVBUF,
5169 M_WAITOK, &txr->hn_tx_lock);
5170 #endif
5171
5172 if (hn_tx_taskq_mode == HN_TX_TASKQ_M_EVTTQ) {
5173 txr->hn_tx_taskq = VMBUS_GET_EVENT_TASKQ(
5174 device_get_parent(dev), dev, HN_RING_IDX2CPU(sc, id));
5175 } else {
5176 txr->hn_tx_taskq = sc->hn_tx_taskqs[id % hn_tx_taskq_cnt];
5177 }
5178
5179 #ifdef HN_IFSTART_SUPPORT
5180 if (hn_use_if_start) {
5181 txr->hn_txeof = hn_start_txeof;
5182 TASK_INIT(&txr->hn_tx_task, 0, hn_start_taskfunc, txr);
5183 TASK_INIT(&txr->hn_txeof_task, 0, hn_start_txeof_taskfunc, txr);
5184 } else
5185 #endif
5186 {
5187 int br_depth;
5188
5189 txr->hn_txeof = hn_xmit_txeof;
5190 TASK_INIT(&txr->hn_tx_task, 0, hn_xmit_taskfunc, txr);
5191 TASK_INIT(&txr->hn_txeof_task, 0, hn_xmit_txeof_taskfunc, txr);
5192
5193 br_depth = hn_get_txswq_depth(txr);
5194 txr->hn_mbuf_br = buf_ring_alloc(br_depth, M_DEVBUF,
5195 M_WAITOK, &txr->hn_tx_lock);
5196 }
5197
5198 txr->hn_direct_tx_size = hn_direct_tx_size;
5199
5200 /*
5201 * Always schedule transmission instead of trying to do direct
5202 * transmission. This one gives the best performance so far.
5203 */
5204 txr->hn_sched_tx = 1;
5205
5206 parent_dtag = bus_get_dma_tag(dev);
5207
5208 /* DMA tag for RNDIS packet messages. */
5209 error = bus_dma_tag_create(parent_dtag, /* parent */
5210 HN_RNDIS_PKT_ALIGN, /* alignment */
5211 HN_RNDIS_PKT_BOUNDARY, /* boundary */
5212 BUS_SPACE_MAXADDR, /* lowaddr */
5213 BUS_SPACE_MAXADDR, /* highaddr */
5214 NULL, NULL, /* filter, filterarg */
5215 HN_RNDIS_PKT_LEN, /* maxsize */
5216 1, /* nsegments */
5217 HN_RNDIS_PKT_LEN, /* maxsegsize */
5218 0, /* flags */
5219 NULL, /* lockfunc */
5220 NULL, /* lockfuncarg */
5221 &txr->hn_tx_rndis_dtag);
5222 if (error) {
5223 device_printf(dev, "failed to create rndis dmatag\n");
5224 return error;
5225 }
5226
5227 /* DMA tag for data. */
5228 error = bus_dma_tag_create(parent_dtag, /* parent */
5229 1, /* alignment */
5230 HN_TX_DATA_BOUNDARY, /* boundary */
5231 BUS_SPACE_MAXADDR, /* lowaddr */
5232 BUS_SPACE_MAXADDR, /* highaddr */
5233 NULL, NULL, /* filter, filterarg */
5234 HN_TX_DATA_MAXSIZE, /* maxsize */
5235 HN_TX_DATA_SEGCNT_MAX, /* nsegments */
5236 HN_TX_DATA_SEGSIZE, /* maxsegsize */
5237 0, /* flags */
5238 NULL, /* lockfunc */
5239 NULL, /* lockfuncarg */
5240 &txr->hn_tx_data_dtag);
5241 if (error) {
5242 device_printf(dev, "failed to create data dmatag\n");
5243 return error;
5244 }
5245
5246 for (i = 0; i < txr->hn_txdesc_cnt; ++i) {
5247 struct hn_txdesc *txd = &txr->hn_txdesc[i];
5248
5249 txd->txr = txr;
5250 txd->chim_index = HN_NVS_CHIM_IDX_INVALID;
5251 STAILQ_INIT(&txd->agg_list);
5252
5253 /*
5254 * Allocate and load RNDIS packet message.
5255 */
5256 error = bus_dmamem_alloc(txr->hn_tx_rndis_dtag,
5257 (void **)&txd->rndis_pkt,
5258 BUS_DMA_WAITOK | BUS_DMA_COHERENT | BUS_DMA_ZERO,
5259 &txd->rndis_pkt_dmap);
5260 if (error) {
5261 device_printf(dev,
5262 "failed to allocate rndis_packet_msg, %d\n", i);
5263 return error;
5264 }
5265
5266 error = bus_dmamap_load(txr->hn_tx_rndis_dtag,
5267 txd->rndis_pkt_dmap,
5268 txd->rndis_pkt, HN_RNDIS_PKT_LEN,
5269 hyperv_dma_map_paddr, &txd->rndis_pkt_paddr,
5270 BUS_DMA_NOWAIT);
5271 if (error) {
5272 device_printf(dev,
5273 "failed to load rndis_packet_msg, %d\n", i);
5274 bus_dmamem_free(txr->hn_tx_rndis_dtag,
5275 txd->rndis_pkt, txd->rndis_pkt_dmap);
5276 return error;
5277 }
5278
5279 /* DMA map for TX data. */
5280 error = bus_dmamap_create(txr->hn_tx_data_dtag, 0,
5281 &txd->data_dmap);
5282 if (error) {
5283 device_printf(dev,
5284 "failed to allocate tx data dmamap\n");
5285 bus_dmamap_unload(txr->hn_tx_rndis_dtag,
5286 txd->rndis_pkt_dmap);
5287 bus_dmamem_free(txr->hn_tx_rndis_dtag,
5288 txd->rndis_pkt, txd->rndis_pkt_dmap);
5289 return error;
5290 }
5291
5292 /* All set, put it to list */
5293 txd->flags |= HN_TXD_FLAG_ONLIST;
5294 #ifndef HN_USE_TXDESC_BUFRING
5295 SLIST_INSERT_HEAD(&txr->hn_txlist, txd, link);
5296 #else
5297 buf_ring_enqueue(txr->hn_txdesc_br, txd);
5298 #endif
5299 }
5300 txr->hn_txdesc_avail = txr->hn_txdesc_cnt;
5301
5302 if (sc->hn_tx_sysctl_tree != NULL) {
5303 struct sysctl_oid_list *child;
5304 struct sysctl_ctx_list *ctx;
5305 char name[16];
5306
5307 /*
5308 * Create per TX ring sysctl tree:
5309 * dev.hn.UNIT.tx.RINGID
5310 */
5311 ctx = device_get_sysctl_ctx(dev);
5312 child = SYSCTL_CHILDREN(sc->hn_tx_sysctl_tree);
5313
5314 snprintf(name, sizeof(name), "%d", id);
5315 txr->hn_tx_sysctl_tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO,
5316 name, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
5317
5318 if (txr->hn_tx_sysctl_tree != NULL) {
5319 child = SYSCTL_CHILDREN(txr->hn_tx_sysctl_tree);
5320
5321 #ifdef HN_DEBUG
5322 SYSCTL_ADD_INT(ctx, child, OID_AUTO, "txdesc_avail",
5323 CTLFLAG_RD, &txr->hn_txdesc_avail, 0,
5324 "# of available TX descs");
5325 #endif
5326 #ifdef HN_IFSTART_SUPPORT
5327 if (!hn_use_if_start)
5328 #endif
5329 {
5330 SYSCTL_ADD_INT(ctx, child, OID_AUTO, "oactive",
5331 CTLFLAG_RD, &txr->hn_oactive, 0,
5332 "over active");
5333 }
5334 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "packets",
5335 CTLFLAG_RW, &txr->hn_pkts,
5336 "# of packets transmitted");
5337 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "sends",
5338 CTLFLAG_RW, &txr->hn_sends, "# of sends");
5339 }
5340 }
5341
5342 return 0;
5343 }
5344
5345 static void
hn_txdesc_dmamap_destroy(struct hn_txdesc * txd)5346 hn_txdesc_dmamap_destroy(struct hn_txdesc *txd)
5347 {
5348 struct hn_tx_ring *txr = txd->txr;
5349
5350 KASSERT(txd->m == NULL, ("still has mbuf installed"));
5351 KASSERT((txd->flags & HN_TXD_FLAG_DMAMAP) == 0, ("still dma mapped"));
5352
5353 bus_dmamap_unload(txr->hn_tx_rndis_dtag, txd->rndis_pkt_dmap);
5354 bus_dmamem_free(txr->hn_tx_rndis_dtag, txd->rndis_pkt,
5355 txd->rndis_pkt_dmap);
5356 bus_dmamap_destroy(txr->hn_tx_data_dtag, txd->data_dmap);
5357 }
5358
5359 static void
hn_txdesc_gc(struct hn_tx_ring * txr,struct hn_txdesc * txd)5360 hn_txdesc_gc(struct hn_tx_ring *txr, struct hn_txdesc *txd)
5361 {
5362
5363 KASSERT(txd->refs == 0 || txd->refs == 1,
5364 ("invalid txd refs %d", txd->refs));
5365
5366 /* Aggregated txds will be freed by their aggregating txd. */
5367 if (txd->refs > 0 && (txd->flags & HN_TXD_FLAG_ONAGG) == 0) {
5368 int freed;
5369
5370 freed = hn_txdesc_put(txr, txd);
5371 KASSERT(freed, ("can't free txdesc"));
5372 }
5373 }
5374
5375 static void
hn_tx_ring_destroy(struct hn_tx_ring * txr)5376 hn_tx_ring_destroy(struct hn_tx_ring *txr)
5377 {
5378 int i;
5379
5380 if (txr->hn_txdesc == NULL)
5381 return;
5382
5383 /*
5384 * NOTE:
5385 * Because the freeing of aggregated txds will be deferred
5386 * to the aggregating txd, two passes are used here:
5387 * - The first pass GCes any pending txds. This GC is necessary,
5388 * since if the channels are revoked, hypervisor will not
5389 * deliver send-done for all pending txds.
5390 * - The second pass frees the busdma stuffs, i.e. after all txds
5391 * were freed.
5392 */
5393 for (i = 0; i < txr->hn_txdesc_cnt; ++i)
5394 hn_txdesc_gc(txr, &txr->hn_txdesc[i]);
5395 for (i = 0; i < txr->hn_txdesc_cnt; ++i)
5396 hn_txdesc_dmamap_destroy(&txr->hn_txdesc[i]);
5397
5398 if (txr->hn_tx_data_dtag != NULL)
5399 bus_dma_tag_destroy(txr->hn_tx_data_dtag);
5400 if (txr->hn_tx_rndis_dtag != NULL)
5401 bus_dma_tag_destroy(txr->hn_tx_rndis_dtag);
5402
5403 #ifdef HN_USE_TXDESC_BUFRING
5404 buf_ring_free(txr->hn_txdesc_br, M_DEVBUF);
5405 #endif
5406
5407 free(txr->hn_txdesc, M_DEVBUF);
5408 txr->hn_txdesc = NULL;
5409
5410 if (txr->hn_mbuf_br != NULL)
5411 buf_ring_free(txr->hn_mbuf_br, M_DEVBUF);
5412
5413 #ifndef HN_USE_TXDESC_BUFRING
5414 mtx_destroy(&txr->hn_txlist_spin);
5415 #endif
5416 mtx_destroy(&txr->hn_tx_lock);
5417 }
5418
5419 static int
hn_create_tx_data(struct hn_softc * sc,int ring_cnt)5420 hn_create_tx_data(struct hn_softc *sc, int ring_cnt)
5421 {
5422 struct sysctl_oid_list *child;
5423 struct sysctl_ctx_list *ctx;
5424 int i;
5425
5426 /*
5427 * Create TXBUF for chimney sending.
5428 *
5429 * NOTE: It is shared by all channels.
5430 */
5431 sc->hn_chim = hyperv_dmamem_alloc(bus_get_dma_tag(sc->hn_dev),
5432 PAGE_SIZE, 0, HN_CHIM_SIZE, &sc->hn_chim_dma,
5433 BUS_DMA_WAITOK | BUS_DMA_ZERO);
5434 if (sc->hn_chim == NULL) {
5435 device_printf(sc->hn_dev, "allocate txbuf failed\n");
5436 return (ENOMEM);
5437 }
5438
5439 sc->hn_tx_ring_cnt = ring_cnt;
5440 sc->hn_tx_ring_inuse = sc->hn_tx_ring_cnt;
5441
5442 sc->hn_tx_ring = malloc(sizeof(struct hn_tx_ring) * sc->hn_tx_ring_cnt,
5443 M_DEVBUF, M_WAITOK | M_ZERO);
5444
5445 ctx = device_get_sysctl_ctx(sc->hn_dev);
5446 child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->hn_dev));
5447
5448 /* Create dev.hn.UNIT.tx sysctl tree */
5449 sc->hn_tx_sysctl_tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "tx",
5450 CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "");
5451
5452 for (i = 0; i < sc->hn_tx_ring_cnt; ++i) {
5453 int error;
5454
5455 error = hn_tx_ring_create(sc, i);
5456 if (error)
5457 return error;
5458 }
5459
5460 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "no_txdescs",
5461 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5462 __offsetof(struct hn_tx_ring, hn_no_txdescs),
5463 hn_tx_stat_ulong_sysctl, "LU", "# of times short of TX descs");
5464 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "send_failed",
5465 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5466 __offsetof(struct hn_tx_ring, hn_send_failed),
5467 hn_tx_stat_ulong_sysctl, "LU", "# of hyper-v sending failure");
5468 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "txdma_failed",
5469 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5470 __offsetof(struct hn_tx_ring, hn_txdma_failed),
5471 hn_tx_stat_ulong_sysctl, "LU", "# of TX DMA failure");
5472 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "agg_flush_failed",
5473 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5474 __offsetof(struct hn_tx_ring, hn_flush_failed),
5475 hn_tx_stat_ulong_sysctl, "LU",
5476 "# of packet transmission aggregation flush failure");
5477 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tx_collapsed",
5478 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5479 __offsetof(struct hn_tx_ring, hn_tx_collapsed),
5480 hn_tx_stat_ulong_sysctl, "LU", "# of TX mbuf collapsed");
5481 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tx_chimney",
5482 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5483 __offsetof(struct hn_tx_ring, hn_tx_chimney),
5484 hn_tx_stat_ulong_sysctl, "LU", "# of chimney send");
5485 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tx_chimney_tried",
5486 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5487 __offsetof(struct hn_tx_ring, hn_tx_chimney_tried),
5488 hn_tx_stat_ulong_sysctl, "LU", "# of chimney send tries");
5489 SYSCTL_ADD_INT(ctx, child, OID_AUTO, "txdesc_cnt",
5490 CTLFLAG_RD, &sc->hn_tx_ring[0].hn_txdesc_cnt, 0,
5491 "# of total TX descs");
5492 SYSCTL_ADD_INT(ctx, child, OID_AUTO, "tx_chimney_max",
5493 CTLFLAG_RD, &sc->hn_chim_szmax, 0,
5494 "Chimney send packet size upper boundary");
5495 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "tx_chimney_size",
5496 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc, 0,
5497 hn_chim_size_sysctl, "I", "Chimney send packet size limit");
5498 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "direct_tx_size",
5499 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5500 __offsetof(struct hn_tx_ring, hn_direct_tx_size),
5501 hn_tx_conf_int_sysctl, "I",
5502 "Size of the packet for direct transmission");
5503 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sched_tx",
5504 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, sc,
5505 __offsetof(struct hn_tx_ring, hn_sched_tx),
5506 hn_tx_conf_int_sysctl, "I",
5507 "Always schedule transmission "
5508 "instead of doing direct transmission");
5509 SYSCTL_ADD_INT(ctx, child, OID_AUTO, "tx_ring_cnt",
5510 CTLFLAG_RD, &sc->hn_tx_ring_cnt, 0, "# created TX rings");
5511 SYSCTL_ADD_INT(ctx, child, OID_AUTO, "tx_ring_inuse",
5512 CTLFLAG_RD, &sc->hn_tx_ring_inuse, 0, "# used TX rings");
5513 SYSCTL_ADD_INT(ctx, child, OID_AUTO, "agg_szmax",
5514 CTLFLAG_RD, &sc->hn_tx_ring[0].hn_agg_szmax, 0,
5515 "Applied packet transmission aggregation size");
5516 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "agg_pktmax",
5517 CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
5518 hn_txagg_pktmax_sysctl, "I",
5519 "Applied packet transmission aggregation packets");
5520 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "agg_align",
5521 CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
5522 hn_txagg_align_sysctl, "I",
5523 "Applied packet transmission aggregation alignment");
5524
5525 return 0;
5526 }
5527
5528 static void
hn_set_chim_size(struct hn_softc * sc,int chim_size)5529 hn_set_chim_size(struct hn_softc *sc, int chim_size)
5530 {
5531 int i;
5532
5533 for (i = 0; i < sc->hn_tx_ring_cnt; ++i)
5534 sc->hn_tx_ring[i].hn_chim_size = chim_size;
5535 }
5536
5537 static void
hn_set_tso_maxsize(struct hn_softc * sc,int tso_maxlen,int mtu)5538 hn_set_tso_maxsize(struct hn_softc *sc, int tso_maxlen, int mtu)
5539 {
5540 struct ifnet *ifp = sc->hn_ifp;
5541 u_int hw_tsomax;
5542 int tso_minlen;
5543
5544 HN_LOCK_ASSERT(sc);
5545
5546 if ((ifp->if_capabilities & (IFCAP_TSO4 | IFCAP_TSO6)) == 0)
5547 return;
5548
5549 KASSERT(sc->hn_ndis_tso_sgmin >= 2,
5550 ("invalid NDIS tso sgmin %d", sc->hn_ndis_tso_sgmin));
5551 tso_minlen = sc->hn_ndis_tso_sgmin * mtu;
5552
5553 KASSERT(sc->hn_ndis_tso_szmax >= tso_minlen &&
5554 sc->hn_ndis_tso_szmax <= IP_MAXPACKET,
5555 ("invalid NDIS tso szmax %d", sc->hn_ndis_tso_szmax));
5556
5557 if (tso_maxlen < tso_minlen)
5558 tso_maxlen = tso_minlen;
5559 else if (tso_maxlen > IP_MAXPACKET)
5560 tso_maxlen = IP_MAXPACKET;
5561 if (tso_maxlen > sc->hn_ndis_tso_szmax)
5562 tso_maxlen = sc->hn_ndis_tso_szmax;
5563 hw_tsomax = tso_maxlen - (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
5564
5565 if (hn_xpnt_vf_isready(sc)) {
5566 if (hw_tsomax > sc->hn_vf_ifp->if_hw_tsomax)
5567 hw_tsomax = sc->hn_vf_ifp->if_hw_tsomax;
5568 }
5569 ifp->if_hw_tsomax = hw_tsomax;
5570 if (bootverbose)
5571 if_printf(ifp, "TSO size max %u\n", ifp->if_hw_tsomax);
5572 }
5573
5574 static void
hn_fixup_tx_data(struct hn_softc * sc)5575 hn_fixup_tx_data(struct hn_softc *sc)
5576 {
5577 uint64_t csum_assist;
5578 int i;
5579
5580 hn_set_chim_size(sc, sc->hn_chim_szmax);
5581 if (hn_tx_chimney_size > 0 &&
5582 hn_tx_chimney_size < sc->hn_chim_szmax)
5583 hn_set_chim_size(sc, hn_tx_chimney_size);
5584
5585 csum_assist = 0;
5586 if (sc->hn_caps & HN_CAP_IPCS)
5587 csum_assist |= CSUM_IP;
5588 if (sc->hn_caps & HN_CAP_TCP4CS)
5589 csum_assist |= CSUM_IP_TCP;
5590 if ((sc->hn_caps & HN_CAP_UDP4CS) && hn_enable_udp4cs)
5591 csum_assist |= CSUM_IP_UDP;
5592 if (sc->hn_caps & HN_CAP_TCP6CS)
5593 csum_assist |= CSUM_IP6_TCP;
5594 if ((sc->hn_caps & HN_CAP_UDP6CS) && hn_enable_udp6cs)
5595 csum_assist |= CSUM_IP6_UDP;
5596 for (i = 0; i < sc->hn_tx_ring_cnt; ++i)
5597 sc->hn_tx_ring[i].hn_csum_assist = csum_assist;
5598
5599 if (sc->hn_caps & HN_CAP_HASHVAL) {
5600 /*
5601 * Support HASHVAL pktinfo on TX path.
5602 */
5603 if (bootverbose)
5604 if_printf(sc->hn_ifp, "support HASHVAL pktinfo\n");
5605 for (i = 0; i < sc->hn_tx_ring_cnt; ++i)
5606 sc->hn_tx_ring[i].hn_tx_flags |= HN_TX_FLAG_HASHVAL;
5607 }
5608 }
5609
5610 static void
hn_fixup_rx_data(struct hn_softc * sc)5611 hn_fixup_rx_data(struct hn_softc *sc)
5612 {
5613
5614 if (sc->hn_caps & HN_CAP_UDPHASH) {
5615 int i;
5616
5617 for (i = 0; i < sc->hn_rx_ring_cnt; ++i)
5618 sc->hn_rx_ring[i].hn_rx_flags |= HN_RX_FLAG_UDP_HASH;
5619 }
5620 }
5621
5622 static void
hn_destroy_tx_data(struct hn_softc * sc)5623 hn_destroy_tx_data(struct hn_softc *sc)
5624 {
5625 int i;
5626
5627 if (sc->hn_chim != NULL) {
5628 if ((sc->hn_flags & HN_FLAG_CHIM_REF) == 0) {
5629 hyperv_dmamem_free(&sc->hn_chim_dma, sc->hn_chim);
5630 } else {
5631 device_printf(sc->hn_dev,
5632 "chimney sending buffer is referenced");
5633 }
5634 sc->hn_chim = NULL;
5635 }
5636
5637 if (sc->hn_tx_ring_cnt == 0)
5638 return;
5639
5640 for (i = 0; i < sc->hn_tx_ring_cnt; ++i)
5641 hn_tx_ring_destroy(&sc->hn_tx_ring[i]);
5642
5643 free(sc->hn_tx_ring, M_DEVBUF);
5644 sc->hn_tx_ring = NULL;
5645
5646 sc->hn_tx_ring_cnt = 0;
5647 sc->hn_tx_ring_inuse = 0;
5648 }
5649
5650 #ifdef HN_IFSTART_SUPPORT
5651
5652 static void
hn_start_taskfunc(void * xtxr,int pending __unused)5653 hn_start_taskfunc(void *xtxr, int pending __unused)
5654 {
5655 struct hn_tx_ring *txr = xtxr;
5656
5657 mtx_lock(&txr->hn_tx_lock);
5658 hn_start_locked(txr, 0);
5659 mtx_unlock(&txr->hn_tx_lock);
5660 }
5661
5662 static int
hn_start_locked(struct hn_tx_ring * txr,int len)5663 hn_start_locked(struct hn_tx_ring *txr, int len)
5664 {
5665 struct hn_softc *sc = txr->hn_sc;
5666 struct ifnet *ifp = sc->hn_ifp;
5667 int sched = 0;
5668
5669 KASSERT(hn_use_if_start,
5670 ("hn_start_locked is called, when if_start is disabled"));
5671 KASSERT(txr == &sc->hn_tx_ring[0], ("not the first TX ring"));
5672 mtx_assert(&txr->hn_tx_lock, MA_OWNED);
5673 KASSERT(txr->hn_agg_txd == NULL, ("lingering aggregating txdesc"));
5674
5675 if (__predict_false(txr->hn_suspended))
5676 return (0);
5677
5678 if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
5679 IFF_DRV_RUNNING)
5680 return (0);
5681
5682 while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
5683 struct hn_txdesc *txd;
5684 struct mbuf *m_head;
5685 int error;
5686
5687 IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
5688 if (m_head == NULL)
5689 break;
5690
5691 if (len > 0 && m_head->m_pkthdr.len > len) {
5692 /*
5693 * This sending could be time consuming; let callers
5694 * dispatch this packet sending (and sending of any
5695 * following up packets) to tx taskqueue.
5696 */
5697 IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
5698 sched = 1;
5699 break;
5700 }
5701
5702 #if defined(INET6) || defined(INET)
5703 if (m_head->m_pkthdr.csum_flags & CSUM_TSO) {
5704 m_head = hn_tso_fixup(m_head);
5705 if (__predict_false(m_head == NULL)) {
5706 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
5707 continue;
5708 }
5709 } else if (m_head->m_pkthdr.csum_flags &
5710 (CSUM_IP_UDP | CSUM_IP_TCP | CSUM_IP6_UDP | CSUM_IP6_TCP)) {
5711 m_head = hn_set_hlen(m_head);
5712 if (__predict_false(m_head == NULL)) {
5713 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
5714 continue;
5715 }
5716 }
5717 #endif
5718
5719 txd = hn_txdesc_get(txr);
5720 if (txd == NULL) {
5721 txr->hn_no_txdescs++;
5722 IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
5723 atomic_set_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
5724 break;
5725 }
5726
5727 error = hn_encap(ifp, txr, txd, &m_head);
5728 if (error) {
5729 /* Both txd and m_head are freed */
5730 KASSERT(txr->hn_agg_txd == NULL,
5731 ("encap failed w/ pending aggregating txdesc"));
5732 continue;
5733 }
5734
5735 if (txr->hn_agg_pktleft == 0) {
5736 if (txr->hn_agg_txd != NULL) {
5737 KASSERT(m_head == NULL,
5738 ("pending mbuf for aggregating txdesc"));
5739 error = hn_flush_txagg(ifp, txr);
5740 if (__predict_false(error)) {
5741 atomic_set_int(&ifp->if_drv_flags,
5742 IFF_DRV_OACTIVE);
5743 break;
5744 }
5745 } else {
5746 KASSERT(m_head != NULL, ("mbuf was freed"));
5747 error = hn_txpkt(ifp, txr, txd);
5748 if (__predict_false(error)) {
5749 /* txd is freed, but m_head is not */
5750 IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
5751 atomic_set_int(&ifp->if_drv_flags,
5752 IFF_DRV_OACTIVE);
5753 break;
5754 }
5755 }
5756 }
5757 #ifdef INVARIANTS
5758 else {
5759 KASSERT(txr->hn_agg_txd != NULL,
5760 ("no aggregating txdesc"));
5761 KASSERT(m_head == NULL,
5762 ("pending mbuf for aggregating txdesc"));
5763 }
5764 #endif
5765 }
5766
5767 /* Flush pending aggerated transmission. */
5768 if (txr->hn_agg_txd != NULL)
5769 hn_flush_txagg(ifp, txr);
5770 return (sched);
5771 }
5772
5773 static void
hn_start(struct ifnet * ifp)5774 hn_start(struct ifnet *ifp)
5775 {
5776 struct hn_softc *sc = ifp->if_softc;
5777 struct hn_tx_ring *txr = &sc->hn_tx_ring[0];
5778
5779 if (txr->hn_sched_tx)
5780 goto do_sched;
5781
5782 if (mtx_trylock(&txr->hn_tx_lock)) {
5783 int sched;
5784
5785 sched = hn_start_locked(txr, txr->hn_direct_tx_size);
5786 mtx_unlock(&txr->hn_tx_lock);
5787 if (!sched)
5788 return;
5789 }
5790 do_sched:
5791 taskqueue_enqueue(txr->hn_tx_taskq, &txr->hn_tx_task);
5792 }
5793
5794 static void
hn_start_txeof_taskfunc(void * xtxr,int pending __unused)5795 hn_start_txeof_taskfunc(void *xtxr, int pending __unused)
5796 {
5797 struct hn_tx_ring *txr = xtxr;
5798
5799 mtx_lock(&txr->hn_tx_lock);
5800 atomic_clear_int(&txr->hn_sc->hn_ifp->if_drv_flags, IFF_DRV_OACTIVE);
5801 hn_start_locked(txr, 0);
5802 mtx_unlock(&txr->hn_tx_lock);
5803 }
5804
5805 static void
hn_start_txeof(struct hn_tx_ring * txr)5806 hn_start_txeof(struct hn_tx_ring *txr)
5807 {
5808 struct hn_softc *sc = txr->hn_sc;
5809 struct ifnet *ifp = sc->hn_ifp;
5810
5811 KASSERT(txr == &sc->hn_tx_ring[0], ("not the first TX ring"));
5812
5813 if (txr->hn_sched_tx)
5814 goto do_sched;
5815
5816 if (mtx_trylock(&txr->hn_tx_lock)) {
5817 int sched;
5818
5819 atomic_clear_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
5820 sched = hn_start_locked(txr, txr->hn_direct_tx_size);
5821 mtx_unlock(&txr->hn_tx_lock);
5822 if (sched) {
5823 taskqueue_enqueue(txr->hn_tx_taskq,
5824 &txr->hn_tx_task);
5825 }
5826 } else {
5827 do_sched:
5828 /*
5829 * Release the OACTIVE earlier, with the hope, that
5830 * others could catch up. The task will clear the
5831 * flag again with the hn_tx_lock to avoid possible
5832 * races.
5833 */
5834 atomic_clear_int(&ifp->if_drv_flags, IFF_DRV_OACTIVE);
5835 taskqueue_enqueue(txr->hn_tx_taskq, &txr->hn_txeof_task);
5836 }
5837 }
5838
5839 #endif /* HN_IFSTART_SUPPORT */
5840
5841 static int
hn_xmit(struct hn_tx_ring * txr,int len)5842 hn_xmit(struct hn_tx_ring *txr, int len)
5843 {
5844 struct hn_softc *sc = txr->hn_sc;
5845 struct ifnet *ifp = sc->hn_ifp;
5846 struct mbuf *m_head;
5847 int sched = 0;
5848
5849 mtx_assert(&txr->hn_tx_lock, MA_OWNED);
5850 #ifdef HN_IFSTART_SUPPORT
5851 KASSERT(hn_use_if_start == 0,
5852 ("hn_xmit is called, when if_start is enabled"));
5853 #endif
5854 KASSERT(txr->hn_agg_txd == NULL, ("lingering aggregating txdesc"));
5855
5856 if (__predict_false(txr->hn_suspended))
5857 return (0);
5858
5859 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || txr->hn_oactive)
5860 return (0);
5861
5862 while ((m_head = drbr_peek(ifp, txr->hn_mbuf_br)) != NULL) {
5863 struct hn_txdesc *txd;
5864 int error;
5865
5866 if (len > 0 && m_head->m_pkthdr.len > len) {
5867 /*
5868 * This sending could be time consuming; let callers
5869 * dispatch this packet sending (and sending of any
5870 * following up packets) to tx taskqueue.
5871 */
5872 drbr_putback(ifp, txr->hn_mbuf_br, m_head);
5873 sched = 1;
5874 break;
5875 }
5876
5877 txd = hn_txdesc_get(txr);
5878 if (txd == NULL) {
5879 txr->hn_no_txdescs++;
5880 drbr_putback(ifp, txr->hn_mbuf_br, m_head);
5881 txr->hn_oactive = 1;
5882 break;
5883 }
5884
5885 error = hn_encap(ifp, txr, txd, &m_head);
5886 if (error) {
5887 /* Both txd and m_head are freed; discard */
5888 KASSERT(txr->hn_agg_txd == NULL,
5889 ("encap failed w/ pending aggregating txdesc"));
5890 drbr_advance(ifp, txr->hn_mbuf_br);
5891 continue;
5892 }
5893
5894 if (txr->hn_agg_pktleft == 0) {
5895 if (txr->hn_agg_txd != NULL) {
5896 KASSERT(m_head == NULL,
5897 ("pending mbuf for aggregating txdesc"));
5898 error = hn_flush_txagg(ifp, txr);
5899 if (__predict_false(error)) {
5900 txr->hn_oactive = 1;
5901 break;
5902 }
5903 } else {
5904 KASSERT(m_head != NULL, ("mbuf was freed"));
5905 error = hn_txpkt(ifp, txr, txd);
5906 if (__predict_false(error)) {
5907 /* txd is freed, but m_head is not */
5908 drbr_putback(ifp, txr->hn_mbuf_br,
5909 m_head);
5910 txr->hn_oactive = 1;
5911 break;
5912 }
5913 }
5914 }
5915 #ifdef INVARIANTS
5916 else {
5917 KASSERT(txr->hn_agg_txd != NULL,
5918 ("no aggregating txdesc"));
5919 KASSERT(m_head == NULL,
5920 ("pending mbuf for aggregating txdesc"));
5921 }
5922 #endif
5923
5924 /* Sent */
5925 drbr_advance(ifp, txr->hn_mbuf_br);
5926 }
5927
5928 /* Flush pending aggerated transmission. */
5929 if (txr->hn_agg_txd != NULL)
5930 hn_flush_txagg(ifp, txr);
5931 return (sched);
5932 }
5933
5934 static int
hn_transmit(struct ifnet * ifp,struct mbuf * m)5935 hn_transmit(struct ifnet *ifp, struct mbuf *m)
5936 {
5937 struct hn_softc *sc = ifp->if_softc;
5938 struct hn_tx_ring *txr;
5939 int error, idx = 0;
5940
5941 if (sc->hn_xvf_flags & HN_XVFFLAG_ENABLED) {
5942 struct rm_priotracker pt;
5943
5944 rm_rlock(&sc->hn_vf_lock, &pt);
5945 if (__predict_true(sc->hn_xvf_flags & HN_XVFFLAG_ENABLED)) {
5946 struct mbuf *m_bpf = NULL;
5947 int obytes, omcast;
5948
5949 obytes = m->m_pkthdr.len;
5950 omcast = (m->m_flags & M_MCAST) != 0;
5951
5952 if (sc->hn_xvf_flags & HN_XVFFLAG_ACCBPF) {
5953 if (bpf_peers_present(ifp->if_bpf)) {
5954 m_bpf = m_copypacket(m, M_NOWAIT);
5955 if (m_bpf == NULL) {
5956 /*
5957 * Failed to grab a shallow
5958 * copy; tap now.
5959 */
5960 ETHER_BPF_MTAP(ifp, m);
5961 }
5962 }
5963 } else {
5964 ETHER_BPF_MTAP(ifp, m);
5965 }
5966
5967 error = sc->hn_vf_ifp->if_transmit(sc->hn_vf_ifp, m);
5968 rm_runlock(&sc->hn_vf_lock, &pt);
5969
5970 if (m_bpf != NULL) {
5971 if (!error)
5972 ETHER_BPF_MTAP(ifp, m_bpf);
5973 m_freem(m_bpf);
5974 }
5975
5976 if (error == ENOBUFS) {
5977 if_inc_counter(ifp, IFCOUNTER_OQDROPS, 1);
5978 } else if (error) {
5979 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
5980 } else {
5981 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
5982 if_inc_counter(ifp, IFCOUNTER_OBYTES, obytes);
5983 if (omcast) {
5984 if_inc_counter(ifp, IFCOUNTER_OMCASTS,
5985 omcast);
5986 }
5987 }
5988 return (error);
5989 }
5990 rm_runlock(&sc->hn_vf_lock, &pt);
5991 }
5992
5993 #if defined(INET6) || defined(INET)
5994 /*
5995 * Perform TSO packet header fixup or get l2/l3 header length now,
5996 * since packet headers should be cache-hot.
5997 */
5998 if (m->m_pkthdr.csum_flags & CSUM_TSO) {
5999 m = hn_tso_fixup(m);
6000 if (__predict_false(m == NULL)) {
6001 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
6002 return EIO;
6003 }
6004 } else if (m->m_pkthdr.csum_flags &
6005 (CSUM_IP_UDP | CSUM_IP_TCP | CSUM_IP6_UDP | CSUM_IP6_TCP)) {
6006 m = hn_set_hlen(m);
6007 if (__predict_false(m == NULL)) {
6008 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
6009 return EIO;
6010 }
6011 }
6012 #endif
6013
6014 /*
6015 * Select the TX ring based on flowid
6016 */
6017 if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) {
6018 #ifdef RSS
6019 uint32_t bid;
6020
6021 if (rss_hash2bucket(m->m_pkthdr.flowid, M_HASHTYPE_GET(m),
6022 &bid) == 0)
6023 idx = bid % sc->hn_tx_ring_inuse;
6024 else
6025 #endif
6026 {
6027 #if defined(INET6) || defined(INET)
6028 int tcpsyn = 0;
6029
6030 if (m->m_pkthdr.len < 128 &&
6031 (m->m_pkthdr.csum_flags &
6032 (CSUM_IP_TCP | CSUM_IP6_TCP)) &&
6033 (m->m_pkthdr.csum_flags & CSUM_TSO) == 0) {
6034 m = hn_check_tcpsyn(m, &tcpsyn);
6035 if (__predict_false(m == NULL)) {
6036 if_inc_counter(ifp,
6037 IFCOUNTER_OERRORS, 1);
6038 return (EIO);
6039 }
6040 }
6041 #else
6042 const int tcpsyn = 0;
6043 #endif
6044 if (tcpsyn)
6045 idx = 0;
6046 else
6047 idx = m->m_pkthdr.flowid % sc->hn_tx_ring_inuse;
6048 }
6049 }
6050 txr = &sc->hn_tx_ring[idx];
6051
6052 error = drbr_enqueue(ifp, txr->hn_mbuf_br, m);
6053 if (error) {
6054 if_inc_counter(ifp, IFCOUNTER_OQDROPS, 1);
6055 return error;
6056 }
6057
6058 if (txr->hn_oactive)
6059 return 0;
6060
6061 if (txr->hn_sched_tx)
6062 goto do_sched;
6063
6064 if (mtx_trylock(&txr->hn_tx_lock)) {
6065 int sched;
6066
6067 sched = hn_xmit(txr, txr->hn_direct_tx_size);
6068 mtx_unlock(&txr->hn_tx_lock);
6069 if (!sched)
6070 return 0;
6071 }
6072 do_sched:
6073 taskqueue_enqueue(txr->hn_tx_taskq, &txr->hn_tx_task);
6074 return 0;
6075 }
6076
6077 static void
hn_tx_ring_qflush(struct hn_tx_ring * txr)6078 hn_tx_ring_qflush(struct hn_tx_ring *txr)
6079 {
6080 struct mbuf *m;
6081
6082 mtx_lock(&txr->hn_tx_lock);
6083 while ((m = buf_ring_dequeue_sc(txr->hn_mbuf_br)) != NULL)
6084 m_freem(m);
6085 mtx_unlock(&txr->hn_tx_lock);
6086 }
6087
6088 static void
hn_xmit_qflush(struct ifnet * ifp)6089 hn_xmit_qflush(struct ifnet *ifp)
6090 {
6091 struct hn_softc *sc = ifp->if_softc;
6092 struct rm_priotracker pt;
6093 int i;
6094
6095 for (i = 0; i < sc->hn_tx_ring_inuse; ++i)
6096 hn_tx_ring_qflush(&sc->hn_tx_ring[i]);
6097 if_qflush(ifp);
6098
6099 rm_rlock(&sc->hn_vf_lock, &pt);
6100 if (sc->hn_xvf_flags & HN_XVFFLAG_ENABLED)
6101 sc->hn_vf_ifp->if_qflush(sc->hn_vf_ifp);
6102 rm_runlock(&sc->hn_vf_lock, &pt);
6103 }
6104
6105 static void
hn_xmit_txeof(struct hn_tx_ring * txr)6106 hn_xmit_txeof(struct hn_tx_ring *txr)
6107 {
6108
6109 if (txr->hn_sched_tx)
6110 goto do_sched;
6111
6112 if (mtx_trylock(&txr->hn_tx_lock)) {
6113 int sched;
6114
6115 txr->hn_oactive = 0;
6116 sched = hn_xmit(txr, txr->hn_direct_tx_size);
6117 mtx_unlock(&txr->hn_tx_lock);
6118 if (sched) {
6119 taskqueue_enqueue(txr->hn_tx_taskq,
6120 &txr->hn_tx_task);
6121 }
6122 } else {
6123 do_sched:
6124 /*
6125 * Release the oactive earlier, with the hope, that
6126 * others could catch up. The task will clear the
6127 * oactive again with the hn_tx_lock to avoid possible
6128 * races.
6129 */
6130 txr->hn_oactive = 0;
6131 taskqueue_enqueue(txr->hn_tx_taskq, &txr->hn_txeof_task);
6132 }
6133 }
6134
6135 static void
hn_xmit_taskfunc(void * xtxr,int pending __unused)6136 hn_xmit_taskfunc(void *xtxr, int pending __unused)
6137 {
6138 struct hn_tx_ring *txr = xtxr;
6139
6140 mtx_lock(&txr->hn_tx_lock);
6141 hn_xmit(txr, 0);
6142 mtx_unlock(&txr->hn_tx_lock);
6143 }
6144
6145 static void
hn_xmit_txeof_taskfunc(void * xtxr,int pending __unused)6146 hn_xmit_txeof_taskfunc(void *xtxr, int pending __unused)
6147 {
6148 struct hn_tx_ring *txr = xtxr;
6149
6150 mtx_lock(&txr->hn_tx_lock);
6151 txr->hn_oactive = 0;
6152 hn_xmit(txr, 0);
6153 mtx_unlock(&txr->hn_tx_lock);
6154 }
6155
6156 static int
hn_chan_attach(struct hn_softc * sc,struct vmbus_channel * chan)6157 hn_chan_attach(struct hn_softc *sc, struct vmbus_channel *chan)
6158 {
6159 struct vmbus_chan_br cbr;
6160 struct hn_rx_ring *rxr;
6161 struct hn_tx_ring *txr = NULL;
6162 int idx, error;
6163
6164 idx = vmbus_chan_subidx(chan);
6165
6166 /*
6167 * Link this channel to RX/TX ring.
6168 */
6169 KASSERT(idx >= 0 && idx < sc->hn_rx_ring_inuse,
6170 ("invalid channel index %d, should > 0 && < %d",
6171 idx, sc->hn_rx_ring_inuse));
6172 rxr = &sc->hn_rx_ring[idx];
6173 KASSERT((rxr->hn_rx_flags & HN_RX_FLAG_ATTACHED) == 0,
6174 ("RX ring %d already attached", idx));
6175 rxr->hn_rx_flags |= HN_RX_FLAG_ATTACHED;
6176 rxr->hn_chan = chan;
6177
6178 if (bootverbose) {
6179 if_printf(sc->hn_ifp, "link RX ring %d to chan%u\n",
6180 idx, vmbus_chan_id(chan));
6181 }
6182
6183 if (idx < sc->hn_tx_ring_inuse) {
6184 txr = &sc->hn_tx_ring[idx];
6185 KASSERT((txr->hn_tx_flags & HN_TX_FLAG_ATTACHED) == 0,
6186 ("TX ring %d already attached", idx));
6187 txr->hn_tx_flags |= HN_TX_FLAG_ATTACHED;
6188
6189 txr->hn_chan = chan;
6190 if (bootverbose) {
6191 if_printf(sc->hn_ifp, "link TX ring %d to chan%u\n",
6192 idx, vmbus_chan_id(chan));
6193 }
6194 }
6195
6196 /* Bind this channel to a proper CPU. */
6197 vmbus_chan_cpu_set(chan, HN_RING_IDX2CPU(sc, idx));
6198
6199 /*
6200 * Open this channel
6201 */
6202 cbr.cbr = rxr->hn_br;
6203 cbr.cbr_paddr = rxr->hn_br_dma.hv_paddr;
6204 cbr.cbr_txsz = HN_TXBR_SIZE;
6205 cbr.cbr_rxsz = HN_RXBR_SIZE;
6206 error = vmbus_chan_open_br(chan, &cbr, NULL, 0, hn_chan_callback, rxr);
6207 if (error) {
6208 if (error == EISCONN) {
6209 if_printf(sc->hn_ifp, "bufring is connected after "
6210 "chan%u open failure\n", vmbus_chan_id(chan));
6211 rxr->hn_rx_flags |= HN_RX_FLAG_BR_REF;
6212 } else {
6213 if_printf(sc->hn_ifp, "open chan%u failed: %d\n",
6214 vmbus_chan_id(chan), error);
6215 }
6216 }
6217 return (error);
6218 }
6219
6220 static void
hn_chan_detach(struct hn_softc * sc,struct vmbus_channel * chan)6221 hn_chan_detach(struct hn_softc *sc, struct vmbus_channel *chan)
6222 {
6223 struct hn_rx_ring *rxr;
6224 int idx, error;
6225
6226 idx = vmbus_chan_subidx(chan);
6227
6228 /*
6229 * Link this channel to RX/TX ring.
6230 */
6231 KASSERT(idx >= 0 && idx < sc->hn_rx_ring_inuse,
6232 ("invalid channel index %d, should > 0 && < %d",
6233 idx, sc->hn_rx_ring_inuse));
6234 rxr = &sc->hn_rx_ring[idx];
6235 KASSERT((rxr->hn_rx_flags & HN_RX_FLAG_ATTACHED),
6236 ("RX ring %d is not attached", idx));
6237 rxr->hn_rx_flags &= ~HN_RX_FLAG_ATTACHED;
6238
6239 if (idx < sc->hn_tx_ring_inuse) {
6240 struct hn_tx_ring *txr = &sc->hn_tx_ring[idx];
6241
6242 KASSERT((txr->hn_tx_flags & HN_TX_FLAG_ATTACHED),
6243 ("TX ring %d is not attached attached", idx));
6244 txr->hn_tx_flags &= ~HN_TX_FLAG_ATTACHED;
6245 }
6246
6247 /*
6248 * Close this channel.
6249 *
6250 * NOTE:
6251 * Channel closing does _not_ destroy the target channel.
6252 */
6253 error = vmbus_chan_close_direct(chan);
6254 if (error == EISCONN) {
6255 if_printf(sc->hn_ifp, "chan%u bufring is connected "
6256 "after being closed\n", vmbus_chan_id(chan));
6257 rxr->hn_rx_flags |= HN_RX_FLAG_BR_REF;
6258 } else if (error) {
6259 if_printf(sc->hn_ifp, "chan%u close failed: %d\n",
6260 vmbus_chan_id(chan), error);
6261 }
6262 }
6263
6264 static int
hn_attach_subchans(struct hn_softc * sc)6265 hn_attach_subchans(struct hn_softc *sc)
6266 {
6267 struct vmbus_channel **subchans;
6268 int subchan_cnt = sc->hn_rx_ring_inuse - 1;
6269 int i, error = 0;
6270
6271 KASSERT(subchan_cnt > 0, ("no sub-channels"));
6272
6273 /* Attach the sub-channels. */
6274 subchans = vmbus_subchan_get(sc->hn_prichan, subchan_cnt);
6275 for (i = 0; i < subchan_cnt; ++i) {
6276 int error1;
6277
6278 error1 = hn_chan_attach(sc, subchans[i]);
6279 if (error1) {
6280 error = error1;
6281 /* Move on; all channels will be detached later. */
6282 }
6283 }
6284 vmbus_subchan_rel(subchans, subchan_cnt);
6285
6286 if (error) {
6287 if_printf(sc->hn_ifp, "sub-channels attach failed: %d\n", error);
6288 } else {
6289 if (bootverbose) {
6290 if_printf(sc->hn_ifp, "%d sub-channels attached\n",
6291 subchan_cnt);
6292 }
6293 }
6294 return (error);
6295 }
6296
6297 static void
hn_detach_allchans(struct hn_softc * sc)6298 hn_detach_allchans(struct hn_softc *sc)
6299 {
6300 struct vmbus_channel **subchans;
6301 int subchan_cnt = sc->hn_rx_ring_inuse - 1;
6302 int i;
6303
6304 if (subchan_cnt == 0)
6305 goto back;
6306
6307 /* Detach the sub-channels. */
6308 subchans = vmbus_subchan_get(sc->hn_prichan, subchan_cnt);
6309 for (i = 0; i < subchan_cnt; ++i)
6310 hn_chan_detach(sc, subchans[i]);
6311 vmbus_subchan_rel(subchans, subchan_cnt);
6312
6313 back:
6314 /*
6315 * Detach the primary channel, _after_ all sub-channels
6316 * are detached.
6317 */
6318 hn_chan_detach(sc, sc->hn_prichan);
6319
6320 /* Wait for sub-channels to be destroyed, if any. */
6321 vmbus_subchan_drain(sc->hn_prichan);
6322
6323 #ifdef INVARIANTS
6324 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
6325 KASSERT((sc->hn_rx_ring[i].hn_rx_flags &
6326 HN_RX_FLAG_ATTACHED) == 0,
6327 ("%dth RX ring is still attached", i));
6328 }
6329 for (i = 0; i < sc->hn_tx_ring_cnt; ++i) {
6330 KASSERT((sc->hn_tx_ring[i].hn_tx_flags &
6331 HN_TX_FLAG_ATTACHED) == 0,
6332 ("%dth TX ring is still attached", i));
6333 }
6334 #endif
6335 }
6336
6337 static int
hn_synth_alloc_subchans(struct hn_softc * sc,int * nsubch)6338 hn_synth_alloc_subchans(struct hn_softc *sc, int *nsubch)
6339 {
6340 struct vmbus_channel **subchans;
6341 int nchan, rxr_cnt, error;
6342
6343 nchan = *nsubch + 1;
6344 if (nchan == 1) {
6345 /*
6346 * Multiple RX/TX rings are not requested.
6347 */
6348 *nsubch = 0;
6349 return (0);
6350 }
6351
6352 /*
6353 * Query RSS capabilities, e.g. # of RX rings, and # of indirect
6354 * table entries.
6355 */
6356 error = hn_rndis_query_rsscaps(sc, &rxr_cnt);
6357 if (error) {
6358 /* No RSS; this is benign. */
6359 *nsubch = 0;
6360 return (0);
6361 }
6362 if (bootverbose) {
6363 if_printf(sc->hn_ifp, "RX rings offered %u, requested %d\n",
6364 rxr_cnt, nchan);
6365 }
6366
6367 if (nchan > rxr_cnt)
6368 nchan = rxr_cnt;
6369 if (nchan == 1) {
6370 if_printf(sc->hn_ifp, "only 1 channel is supported, no vRSS\n");
6371 *nsubch = 0;
6372 return (0);
6373 }
6374
6375 /*
6376 * Allocate sub-channels from NVS.
6377 */
6378 *nsubch = nchan - 1;
6379 error = hn_nvs_alloc_subchans(sc, nsubch);
6380 if (error || *nsubch == 0) {
6381 /* Failed to allocate sub-channels. */
6382 *nsubch = 0;
6383 return (0);
6384 }
6385
6386 /*
6387 * Wait for all sub-channels to become ready before moving on.
6388 */
6389 subchans = vmbus_subchan_get(sc->hn_prichan, *nsubch);
6390 vmbus_subchan_rel(subchans, *nsubch);
6391 return (0);
6392 }
6393
6394 static bool
hn_synth_attachable(const struct hn_softc * sc)6395 hn_synth_attachable(const struct hn_softc *sc)
6396 {
6397 int i;
6398
6399 if (sc->hn_flags & HN_FLAG_ERRORS)
6400 return (false);
6401
6402 for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
6403 const struct hn_rx_ring *rxr = &sc->hn_rx_ring[i];
6404
6405 if (rxr->hn_rx_flags & HN_RX_FLAG_BR_REF)
6406 return (false);
6407 }
6408 return (true);
6409 }
6410
6411 /*
6412 * Make sure that the RX filter is zero after the successful
6413 * RNDIS initialization.
6414 *
6415 * NOTE:
6416 * Under certain conditions on certain versions of Hyper-V,
6417 * the RNDIS rxfilter is _not_ zero on the hypervisor side
6418 * after the successful RNDIS initialization, which breaks
6419 * the assumption of any following code (well, it breaks the
6420 * RNDIS API contract actually). Clear the RNDIS rxfilter
6421 * explicitly, drain packets sneaking through, and drain the
6422 * interrupt taskqueues scheduled due to the stealth packets.
6423 */
6424 static void
hn_rndis_init_fixat(struct hn_softc * sc,int nchan)6425 hn_rndis_init_fixat(struct hn_softc *sc, int nchan)
6426 {
6427
6428 hn_disable_rx(sc);
6429 hn_drain_rxtx(sc, nchan);
6430 }
6431
6432 static int
hn_synth_attach(struct hn_softc * sc,int mtu)6433 hn_synth_attach(struct hn_softc *sc, int mtu)
6434 {
6435 #define ATTACHED_NVS 0x0002
6436 #define ATTACHED_RNDIS 0x0004
6437
6438 struct ndis_rssprm_toeplitz *rss = &sc->hn_rss;
6439 int error, nsubch, nchan = 1, i, rndis_inited;
6440 uint32_t old_caps, attached = 0;
6441
6442 KASSERT((sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) == 0,
6443 ("synthetic parts were attached"));
6444
6445 if (!hn_synth_attachable(sc))
6446 return (ENXIO);
6447
6448 /* Save capabilities for later verification. */
6449 old_caps = sc->hn_caps;
6450 sc->hn_caps = 0;
6451
6452 /* Clear RSS stuffs. */
6453 sc->hn_rss_ind_size = 0;
6454 sc->hn_rss_hash = 0;
6455 sc->hn_rss_hcap = 0;
6456
6457 /*
6458 * Attach the primary channel _before_ attaching NVS and RNDIS.
6459 */
6460 error = hn_chan_attach(sc, sc->hn_prichan);
6461 if (error)
6462 goto failed;
6463
6464 /*
6465 * Attach NVS.
6466 */
6467 error = hn_nvs_attach(sc, mtu);
6468 if (error)
6469 goto failed;
6470 attached |= ATTACHED_NVS;
6471
6472 /*
6473 * Attach RNDIS _after_ NVS is attached.
6474 */
6475 error = hn_rndis_attach(sc, mtu, &rndis_inited);
6476 if (rndis_inited)
6477 attached |= ATTACHED_RNDIS;
6478 if (error)
6479 goto failed;
6480
6481 /*
6482 * Make sure capabilities are not changed.
6483 */
6484 if (device_is_attached(sc->hn_dev) && old_caps != sc->hn_caps) {
6485 if_printf(sc->hn_ifp, "caps mismatch old 0x%08x, new 0x%08x\n",
6486 old_caps, sc->hn_caps);
6487 error = ENXIO;
6488 goto failed;
6489 }
6490
6491 /*
6492 * Allocate sub-channels for multi-TX/RX rings.
6493 *
6494 * NOTE:
6495 * The # of RX rings that can be used is equivalent to the # of
6496 * channels to be requested.
6497 */
6498 nsubch = sc->hn_rx_ring_cnt - 1;
6499 error = hn_synth_alloc_subchans(sc, &nsubch);
6500 if (error)
6501 goto failed;
6502 /* NOTE: _Full_ synthetic parts detach is required now. */
6503 sc->hn_flags |= HN_FLAG_SYNTH_ATTACHED;
6504
6505 /*
6506 * Set the # of TX/RX rings that could be used according to
6507 * the # of channels that NVS offered.
6508 */
6509 nchan = nsubch + 1;
6510 hn_set_ring_inuse(sc, nchan);
6511 if (nchan == 1) {
6512 /* Only the primary channel can be used; done */
6513 goto back;
6514 }
6515
6516 /*
6517 * Attach the sub-channels.
6518 *
6519 * NOTE: hn_set_ring_inuse() _must_ have been called.
6520 */
6521 error = hn_attach_subchans(sc);
6522 if (error)
6523 goto failed;
6524
6525 /*
6526 * Configure RSS key and indirect table _after_ all sub-channels
6527 * are attached.
6528 */
6529 if ((sc->hn_flags & HN_FLAG_HAS_RSSKEY) == 0) {
6530 /*
6531 * RSS key is not set yet; set it to the default RSS key.
6532 */
6533 if (bootverbose)
6534 if_printf(sc->hn_ifp, "setup default RSS key\n");
6535 #ifdef RSS
6536 rss_getkey(rss->rss_key);
6537 #else
6538 memcpy(rss->rss_key, hn_rss_key_default, sizeof(rss->rss_key));
6539 #endif
6540 sc->hn_flags |= HN_FLAG_HAS_RSSKEY;
6541 }
6542
6543 if ((sc->hn_flags & HN_FLAG_HAS_RSSIND) == 0) {
6544 /*
6545 * RSS indirect table is not set yet; set it up in round-
6546 * robin fashion.
6547 */
6548 if (bootverbose) {
6549 if_printf(sc->hn_ifp, "setup default RSS indirect "
6550 "table\n");
6551 }
6552 for (i = 0; i < NDIS_HASH_INDCNT; ++i) {
6553 uint32_t subidx;
6554
6555 #ifdef RSS
6556 subidx = rss_get_indirection_to_bucket(i);
6557 #else
6558 subidx = i;
6559 #endif
6560 rss->rss_ind[i] = subidx % nchan;
6561 }
6562 sc->hn_flags |= HN_FLAG_HAS_RSSIND;
6563 } else {
6564 /*
6565 * # of usable channels may be changed, so we have to
6566 * make sure that all entries in RSS indirect table
6567 * are valid.
6568 *
6569 * NOTE: hn_set_ring_inuse() _must_ have been called.
6570 */
6571 hn_rss_ind_fixup(sc);
6572 }
6573
6574 sc->hn_rss_hash = sc->hn_rss_hcap;
6575 if ((sc->hn_flags & HN_FLAG_RXVF) ||
6576 (sc->hn_xvf_flags & HN_XVFFLAG_ENABLED)) {
6577 /* NOTE: Don't reconfigure RSS; will do immediately. */
6578 hn_vf_rss_fixup(sc, false);
6579 }
6580 error = hn_rndis_conf_rss(sc, NDIS_RSS_FLAG_NONE);
6581 if (error)
6582 goto failed;
6583 back:
6584 /*
6585 * Fixup transmission aggregation setup.
6586 */
6587 hn_set_txagg(sc);
6588 hn_rndis_init_fixat(sc, nchan);
6589 return (0);
6590
6591 failed:
6592 if (sc->hn_flags & HN_FLAG_SYNTH_ATTACHED) {
6593 hn_rndis_init_fixat(sc, nchan);
6594 hn_synth_detach(sc);
6595 } else {
6596 if (attached & ATTACHED_RNDIS) {
6597 hn_rndis_init_fixat(sc, nchan);
6598 hn_rndis_detach(sc);
6599 }
6600 if (attached & ATTACHED_NVS)
6601 hn_nvs_detach(sc);
6602 hn_chan_detach(sc, sc->hn_prichan);
6603 /* Restore old capabilities. */
6604 sc->hn_caps = old_caps;
6605 }
6606 return (error);
6607
6608 #undef ATTACHED_RNDIS
6609 #undef ATTACHED_NVS
6610 }
6611
6612 /*
6613 * NOTE:
6614 * The interface must have been suspended though hn_suspend(), before
6615 * this function get called.
6616 */
6617 static void
hn_synth_detach(struct hn_softc * sc)6618 hn_synth_detach(struct hn_softc *sc)
6619 {
6620
6621 KASSERT(sc->hn_flags & HN_FLAG_SYNTH_ATTACHED,
6622 ("synthetic parts were not attached"));
6623
6624 /* Detach the RNDIS first. */
6625 hn_rndis_detach(sc);
6626
6627 /* Detach NVS. */
6628 hn_nvs_detach(sc);
6629
6630 /* Detach all of the channels. */
6631 hn_detach_allchans(sc);
6632
6633 sc->hn_flags &= ~HN_FLAG_SYNTH_ATTACHED;
6634 }
6635
6636 static void
hn_set_ring_inuse(struct hn_softc * sc,int ring_cnt)6637 hn_set_ring_inuse(struct hn_softc *sc, int ring_cnt)
6638 {
6639 KASSERT(ring_cnt > 0 && ring_cnt <= sc->hn_rx_ring_cnt,
6640 ("invalid ring count %d", ring_cnt));
6641
6642 if (sc->hn_tx_ring_cnt > ring_cnt)
6643 sc->hn_tx_ring_inuse = ring_cnt;
6644 else
6645 sc->hn_tx_ring_inuse = sc->hn_tx_ring_cnt;
6646 sc->hn_rx_ring_inuse = ring_cnt;
6647
6648 #ifdef RSS
6649 if (sc->hn_rx_ring_inuse != rss_getnumbuckets()) {
6650 if_printf(sc->hn_ifp, "# of RX rings (%d) does not match "
6651 "# of RSS buckets (%d)\n", sc->hn_rx_ring_inuse,
6652 rss_getnumbuckets());
6653 }
6654 #endif
6655
6656 if (bootverbose) {
6657 if_printf(sc->hn_ifp, "%d TX ring, %d RX ring\n",
6658 sc->hn_tx_ring_inuse, sc->hn_rx_ring_inuse);
6659 }
6660 }
6661
6662 static void
hn_chan_drain(struct hn_softc * sc,struct vmbus_channel * chan)6663 hn_chan_drain(struct hn_softc *sc, struct vmbus_channel *chan)
6664 {
6665
6666 /*
6667 * NOTE:
6668 * The TX bufring will not be drained by the hypervisor,
6669 * if the primary channel is revoked.
6670 */
6671 while (!vmbus_chan_rx_empty(chan) ||
6672 (!vmbus_chan_is_revoked(sc->hn_prichan) &&
6673 !vmbus_chan_tx_empty(chan)))
6674 pause("waitch", 1);
6675 vmbus_chan_intr_drain(chan);
6676 }
6677
6678 static void
hn_disable_rx(struct hn_softc * sc)6679 hn_disable_rx(struct hn_softc *sc)
6680 {
6681
6682 /*
6683 * Disable RX by clearing RX filter forcefully.
6684 */
6685 sc->hn_rx_filter = NDIS_PACKET_TYPE_NONE;
6686 hn_rndis_set_rxfilter(sc, sc->hn_rx_filter); /* ignore error */
6687
6688 /*
6689 * Give RNDIS enough time to flush all pending data packets.
6690 */
6691 pause("waitrx", (200 * hz) / 1000);
6692 }
6693
6694 /*
6695 * NOTE:
6696 * RX/TX _must_ have been suspended/disabled, before this function
6697 * is called.
6698 */
6699 static void
hn_drain_rxtx(struct hn_softc * sc,int nchan)6700 hn_drain_rxtx(struct hn_softc *sc, int nchan)
6701 {
6702 struct vmbus_channel **subch = NULL;
6703 int nsubch;
6704
6705 /*
6706 * Drain RX/TX bufrings and interrupts.
6707 */
6708 nsubch = nchan - 1;
6709 if (nsubch > 0)
6710 subch = vmbus_subchan_get(sc->hn_prichan, nsubch);
6711
6712 if (subch != NULL) {
6713 int i;
6714
6715 for (i = 0; i < nsubch; ++i)
6716 hn_chan_drain(sc, subch[i]);
6717 }
6718 hn_chan_drain(sc, sc->hn_prichan);
6719
6720 if (subch != NULL)
6721 vmbus_subchan_rel(subch, nsubch);
6722 }
6723
6724 static void
hn_suspend_data(struct hn_softc * sc)6725 hn_suspend_data(struct hn_softc *sc)
6726 {
6727 struct hn_tx_ring *txr;
6728 int i;
6729
6730 HN_LOCK_ASSERT(sc);
6731
6732 /*
6733 * Suspend TX.
6734 */
6735 for (i = 0; i < sc->hn_tx_ring_inuse; ++i) {
6736 txr = &sc->hn_tx_ring[i];
6737
6738 mtx_lock(&txr->hn_tx_lock);
6739 txr->hn_suspended = 1;
6740 mtx_unlock(&txr->hn_tx_lock);
6741 /* No one is able send more packets now. */
6742
6743 /*
6744 * Wait for all pending sends to finish.
6745 *
6746 * NOTE:
6747 * We will _not_ receive all pending send-done, if the
6748 * primary channel is revoked.
6749 */
6750 while (hn_tx_ring_pending(txr) &&
6751 !vmbus_chan_is_revoked(sc->hn_prichan))
6752 pause("hnwtx", 1 /* 1 tick */);
6753 }
6754
6755 /*
6756 * Disable RX.
6757 */
6758 hn_disable_rx(sc);
6759
6760 /*
6761 * Drain RX/TX.
6762 */
6763 hn_drain_rxtx(sc, sc->hn_rx_ring_inuse);
6764
6765 /*
6766 * Drain any pending TX tasks.
6767 *
6768 * NOTE:
6769 * The above hn_drain_rxtx() can dispatch TX tasks, so the TX
6770 * tasks will have to be drained _after_ the above hn_drain_rxtx().
6771 */
6772 for (i = 0; i < sc->hn_tx_ring_inuse; ++i) {
6773 txr = &sc->hn_tx_ring[i];
6774
6775 taskqueue_drain(txr->hn_tx_taskq, &txr->hn_tx_task);
6776 taskqueue_drain(txr->hn_tx_taskq, &txr->hn_txeof_task);
6777 }
6778 }
6779
6780 static void
hn_suspend_mgmt_taskfunc(void * xsc,int pending __unused)6781 hn_suspend_mgmt_taskfunc(void *xsc, int pending __unused)
6782 {
6783
6784 ((struct hn_softc *)xsc)->hn_mgmt_taskq = NULL;
6785 }
6786
6787 static void
hn_suspend_mgmt(struct hn_softc * sc)6788 hn_suspend_mgmt(struct hn_softc *sc)
6789 {
6790 struct task task;
6791
6792 HN_LOCK_ASSERT(sc);
6793
6794 /*
6795 * Make sure that hn_mgmt_taskq0 can nolonger be accessed
6796 * through hn_mgmt_taskq.
6797 */
6798 TASK_INIT(&task, 0, hn_suspend_mgmt_taskfunc, sc);
6799 vmbus_chan_run_task(sc->hn_prichan, &task);
6800
6801 /*
6802 * Make sure that all pending management tasks are completed.
6803 */
6804 taskqueue_drain(sc->hn_mgmt_taskq0, &sc->hn_netchg_init);
6805 taskqueue_drain_timeout(sc->hn_mgmt_taskq0, &sc->hn_netchg_status);
6806 taskqueue_drain_all(sc->hn_mgmt_taskq0);
6807 }
6808
6809 static void
hn_suspend(struct hn_softc * sc)6810 hn_suspend(struct hn_softc *sc)
6811 {
6812
6813 /* Disable polling. */
6814 hn_polling(sc, 0);
6815
6816 /*
6817 * If the non-transparent mode VF is activated, the synthetic
6818 * device is receiving packets, so the data path of the
6819 * synthetic device must be suspended.
6820 */
6821 if ((sc->hn_ifp->if_drv_flags & IFF_DRV_RUNNING) ||
6822 (sc->hn_flags & HN_FLAG_RXVF))
6823 hn_suspend_data(sc);
6824 hn_suspend_mgmt(sc);
6825 }
6826
6827 static void
hn_resume_tx(struct hn_softc * sc,int tx_ring_cnt)6828 hn_resume_tx(struct hn_softc *sc, int tx_ring_cnt)
6829 {
6830 int i;
6831
6832 KASSERT(tx_ring_cnt <= sc->hn_tx_ring_cnt,
6833 ("invalid TX ring count %d", tx_ring_cnt));
6834
6835 for (i = 0; i < tx_ring_cnt; ++i) {
6836 struct hn_tx_ring *txr = &sc->hn_tx_ring[i];
6837
6838 mtx_lock(&txr->hn_tx_lock);
6839 txr->hn_suspended = 0;
6840 mtx_unlock(&txr->hn_tx_lock);
6841 }
6842 }
6843
6844 static void
hn_resume_data(struct hn_softc * sc)6845 hn_resume_data(struct hn_softc *sc)
6846 {
6847 int i;
6848
6849 HN_LOCK_ASSERT(sc);
6850
6851 /*
6852 * Re-enable RX.
6853 */
6854 hn_rxfilter_config(sc);
6855
6856 /*
6857 * Make sure to clear suspend status on "all" TX rings,
6858 * since hn_tx_ring_inuse can be changed after
6859 * hn_suspend_data().
6860 */
6861 hn_resume_tx(sc, sc->hn_tx_ring_cnt);
6862
6863 #ifdef HN_IFSTART_SUPPORT
6864 if (!hn_use_if_start)
6865 #endif
6866 {
6867 /*
6868 * Flush unused drbrs, since hn_tx_ring_inuse may be
6869 * reduced.
6870 */
6871 for (i = sc->hn_tx_ring_inuse; i < sc->hn_tx_ring_cnt; ++i)
6872 hn_tx_ring_qflush(&sc->hn_tx_ring[i]);
6873 }
6874
6875 /*
6876 * Kick start TX.
6877 */
6878 for (i = 0; i < sc->hn_tx_ring_inuse; ++i) {
6879 struct hn_tx_ring *txr = &sc->hn_tx_ring[i];
6880
6881 /*
6882 * Use txeof task, so that any pending oactive can be
6883 * cleared properly.
6884 */
6885 taskqueue_enqueue(txr->hn_tx_taskq, &txr->hn_txeof_task);
6886 }
6887 }
6888
6889 static void
hn_resume_mgmt(struct hn_softc * sc)6890 hn_resume_mgmt(struct hn_softc *sc)
6891 {
6892
6893 sc->hn_mgmt_taskq = sc->hn_mgmt_taskq0;
6894
6895 /*
6896 * Kick off network change detection, if it was pending.
6897 * If no network change was pending, start link status
6898 * checks, which is more lightweight than network change
6899 * detection.
6900 */
6901 if (sc->hn_link_flags & HN_LINK_FLAG_NETCHG)
6902 hn_change_network(sc);
6903 else
6904 hn_update_link_status(sc);
6905 }
6906
6907 static void
hn_resume(struct hn_softc * sc)6908 hn_resume(struct hn_softc *sc)
6909 {
6910
6911 /*
6912 * If the non-transparent mode VF is activated, the synthetic
6913 * device have to receive packets, so the data path of the
6914 * synthetic device must be resumed.
6915 */
6916 if ((sc->hn_ifp->if_drv_flags & IFF_DRV_RUNNING) ||
6917 (sc->hn_flags & HN_FLAG_RXVF))
6918 hn_resume_data(sc);
6919
6920 /*
6921 * Don't resume link status change if VF is attached/activated.
6922 * - In the non-transparent VF mode, the synthetic device marks
6923 * link down until the VF is deactivated; i.e. VF is down.
6924 * - In transparent VF mode, VF's media status is used until
6925 * the VF is detached.
6926 */
6927 if ((sc->hn_flags & HN_FLAG_RXVF) == 0 &&
6928 !(hn_xpnt_vf && sc->hn_vf_ifp != NULL))
6929 hn_resume_mgmt(sc);
6930
6931 /*
6932 * Re-enable polling if this interface is running and
6933 * the polling is requested.
6934 */
6935 if ((sc->hn_ifp->if_drv_flags & IFF_DRV_RUNNING) && sc->hn_pollhz > 0)
6936 hn_polling(sc, sc->hn_pollhz);
6937 }
6938
6939 static void
hn_rndis_rx_status(struct hn_softc * sc,const void * data,int dlen)6940 hn_rndis_rx_status(struct hn_softc *sc, const void *data, int dlen)
6941 {
6942 const struct rndis_status_msg *msg;
6943 int ofs;
6944
6945 if (dlen < sizeof(*msg)) {
6946 if_printf(sc->hn_ifp, "invalid RNDIS status\n");
6947 return;
6948 }
6949 msg = data;
6950
6951 switch (msg->rm_status) {
6952 case RNDIS_STATUS_MEDIA_CONNECT:
6953 case RNDIS_STATUS_MEDIA_DISCONNECT:
6954 hn_update_link_status(sc);
6955 break;
6956
6957 case RNDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG:
6958 case RNDIS_STATUS_LINK_SPEED_CHANGE:
6959 /* Not really useful; ignore. */
6960 break;
6961
6962 case RNDIS_STATUS_NETWORK_CHANGE:
6963 ofs = RNDIS_STBUFOFFSET_ABS(msg->rm_stbufoffset);
6964 if (dlen < ofs + msg->rm_stbuflen ||
6965 msg->rm_stbuflen < sizeof(uint32_t)) {
6966 if_printf(sc->hn_ifp, "network changed\n");
6967 } else {
6968 uint32_t change;
6969
6970 memcpy(&change, ((const uint8_t *)msg) + ofs,
6971 sizeof(change));
6972 if_printf(sc->hn_ifp, "network changed, change %u\n",
6973 change);
6974 }
6975 hn_change_network(sc);
6976 break;
6977
6978 default:
6979 if_printf(sc->hn_ifp, "unknown RNDIS status 0x%08x\n",
6980 msg->rm_status);
6981 break;
6982 }
6983 }
6984
6985 static int
hn_rndis_rxinfo(const void * info_data,int info_dlen,struct hn_rxinfo * info)6986 hn_rndis_rxinfo(const void *info_data, int info_dlen, struct hn_rxinfo *info)
6987 {
6988 const struct rndis_pktinfo *pi = info_data;
6989 uint32_t mask = 0;
6990
6991 while (info_dlen != 0) {
6992 const void *data;
6993 uint32_t dlen;
6994
6995 if (__predict_false(info_dlen < sizeof(*pi)))
6996 return (EINVAL);
6997 if (__predict_false(info_dlen < pi->rm_size))
6998 return (EINVAL);
6999 info_dlen -= pi->rm_size;
7000
7001 if (__predict_false(pi->rm_size & RNDIS_PKTINFO_SIZE_ALIGNMASK))
7002 return (EINVAL);
7003 if (__predict_false(pi->rm_size < pi->rm_pktinfooffset))
7004 return (EINVAL);
7005 dlen = pi->rm_size - pi->rm_pktinfooffset;
7006 data = pi->rm_data;
7007
7008 switch (pi->rm_type) {
7009 case NDIS_PKTINFO_TYPE_VLAN:
7010 if (__predict_false(dlen < NDIS_VLAN_INFO_SIZE))
7011 return (EINVAL);
7012 info->vlan_info = *((const uint32_t *)data);
7013 mask |= HN_RXINFO_VLAN;
7014 break;
7015
7016 case NDIS_PKTINFO_TYPE_CSUM:
7017 if (__predict_false(dlen < NDIS_RXCSUM_INFO_SIZE))
7018 return (EINVAL);
7019 info->csum_info = *((const uint32_t *)data);
7020 mask |= HN_RXINFO_CSUM;
7021 break;
7022
7023 case HN_NDIS_PKTINFO_TYPE_HASHVAL:
7024 if (__predict_false(dlen < HN_NDIS_HASH_VALUE_SIZE))
7025 return (EINVAL);
7026 info->hash_value = *((const uint32_t *)data);
7027 mask |= HN_RXINFO_HASHVAL;
7028 break;
7029
7030 case HN_NDIS_PKTINFO_TYPE_HASHINF:
7031 if (__predict_false(dlen < HN_NDIS_HASH_INFO_SIZE))
7032 return (EINVAL);
7033 info->hash_info = *((const uint32_t *)data);
7034 mask |= HN_RXINFO_HASHINF;
7035 break;
7036
7037 default:
7038 goto next;
7039 }
7040
7041 if (mask == HN_RXINFO_ALL) {
7042 /* All found; done */
7043 break;
7044 }
7045 next:
7046 pi = (const struct rndis_pktinfo *)
7047 ((const uint8_t *)pi + pi->rm_size);
7048 }
7049
7050 /*
7051 * Final fixup.
7052 * - If there is no hash value, invalidate the hash info.
7053 */
7054 if ((mask & HN_RXINFO_HASHVAL) == 0)
7055 info->hash_info = HN_NDIS_HASH_INFO_INVALID;
7056 return (0);
7057 }
7058
7059 static __inline bool
hn_rndis_check_overlap(int off,int len,int check_off,int check_len)7060 hn_rndis_check_overlap(int off, int len, int check_off, int check_len)
7061 {
7062
7063 if (off < check_off) {
7064 if (__predict_true(off + len <= check_off))
7065 return (false);
7066 } else if (off > check_off) {
7067 if (__predict_true(check_off + check_len <= off))
7068 return (false);
7069 }
7070 return (true);
7071 }
7072
7073 static void
hn_rndis_rx_data(struct hn_rx_ring * rxr,const void * data,int dlen)7074 hn_rndis_rx_data(struct hn_rx_ring *rxr, const void *data, int dlen)
7075 {
7076 const struct rndis_packet_msg *pkt;
7077 struct hn_rxinfo info;
7078 int data_off, pktinfo_off, data_len, pktinfo_len;
7079
7080 /*
7081 * Check length.
7082 */
7083 if (__predict_false(dlen < sizeof(*pkt))) {
7084 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg\n");
7085 return;
7086 }
7087 pkt = data;
7088
7089 if (__predict_false(dlen < pkt->rm_len)) {
7090 if_printf(rxr->hn_ifp, "truncated RNDIS packet msg, "
7091 "dlen %d, msglen %u\n", dlen, pkt->rm_len);
7092 return;
7093 }
7094 if (__predict_false(pkt->rm_len <
7095 pkt->rm_datalen + pkt->rm_oobdatalen + pkt->rm_pktinfolen)) {
7096 if_printf(rxr->hn_ifp, "invalid RNDIS packet msglen, "
7097 "msglen %u, data %u, oob %u, pktinfo %u\n",
7098 pkt->rm_len, pkt->rm_datalen, pkt->rm_oobdatalen,
7099 pkt->rm_pktinfolen);
7100 return;
7101 }
7102 if (__predict_false(pkt->rm_datalen == 0)) {
7103 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg, no data\n");
7104 return;
7105 }
7106
7107 /*
7108 * Check offests.
7109 */
7110 #define IS_OFFSET_INVALID(ofs) \
7111 ((ofs) < RNDIS_PACKET_MSG_OFFSET_MIN || \
7112 ((ofs) & RNDIS_PACKET_MSG_OFFSET_ALIGNMASK))
7113
7114 /* XXX Hyper-V does not meet data offset alignment requirement */
7115 if (__predict_false(pkt->rm_dataoffset < RNDIS_PACKET_MSG_OFFSET_MIN)) {
7116 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg, "
7117 "data offset %u\n", pkt->rm_dataoffset);
7118 return;
7119 }
7120 if (__predict_false(pkt->rm_oobdataoffset > 0 &&
7121 IS_OFFSET_INVALID(pkt->rm_oobdataoffset))) {
7122 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg, "
7123 "oob offset %u\n", pkt->rm_oobdataoffset);
7124 return;
7125 }
7126 if (__predict_true(pkt->rm_pktinfooffset > 0) &&
7127 __predict_false(IS_OFFSET_INVALID(pkt->rm_pktinfooffset))) {
7128 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg, "
7129 "pktinfo offset %u\n", pkt->rm_pktinfooffset);
7130 return;
7131 }
7132
7133 #undef IS_OFFSET_INVALID
7134
7135 data_off = RNDIS_PACKET_MSG_OFFSET_ABS(pkt->rm_dataoffset);
7136 data_len = pkt->rm_datalen;
7137 pktinfo_off = RNDIS_PACKET_MSG_OFFSET_ABS(pkt->rm_pktinfooffset);
7138 pktinfo_len = pkt->rm_pktinfolen;
7139
7140 /*
7141 * Check OOB coverage.
7142 */
7143 if (__predict_false(pkt->rm_oobdatalen != 0)) {
7144 int oob_off, oob_len;
7145
7146 if_printf(rxr->hn_ifp, "got oobdata\n");
7147 oob_off = RNDIS_PACKET_MSG_OFFSET_ABS(pkt->rm_oobdataoffset);
7148 oob_len = pkt->rm_oobdatalen;
7149
7150 if (__predict_false(oob_off + oob_len > pkt->rm_len)) {
7151 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg, "
7152 "oob overflow, msglen %u, oob abs %d len %d\n",
7153 pkt->rm_len, oob_off, oob_len);
7154 return;
7155 }
7156
7157 /*
7158 * Check against data.
7159 */
7160 if (hn_rndis_check_overlap(oob_off, oob_len,
7161 data_off, data_len)) {
7162 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg, "
7163 "oob overlaps data, oob abs %d len %d, "
7164 "data abs %d len %d\n",
7165 oob_off, oob_len, data_off, data_len);
7166 return;
7167 }
7168
7169 /*
7170 * Check against pktinfo.
7171 */
7172 if (pktinfo_len != 0 &&
7173 hn_rndis_check_overlap(oob_off, oob_len,
7174 pktinfo_off, pktinfo_len)) {
7175 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg, "
7176 "oob overlaps pktinfo, oob abs %d len %d, "
7177 "pktinfo abs %d len %d\n",
7178 oob_off, oob_len, pktinfo_off, pktinfo_len);
7179 return;
7180 }
7181 }
7182
7183 /*
7184 * Check per-packet-info coverage and find useful per-packet-info.
7185 */
7186 info.vlan_info = HN_NDIS_VLAN_INFO_INVALID;
7187 info.csum_info = HN_NDIS_RXCSUM_INFO_INVALID;
7188 info.hash_info = HN_NDIS_HASH_INFO_INVALID;
7189 if (__predict_true(pktinfo_len != 0)) {
7190 bool overlap;
7191 int error;
7192
7193 if (__predict_false(pktinfo_off + pktinfo_len > pkt->rm_len)) {
7194 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg, "
7195 "pktinfo overflow, msglen %u, "
7196 "pktinfo abs %d len %d\n",
7197 pkt->rm_len, pktinfo_off, pktinfo_len);
7198 return;
7199 }
7200
7201 /*
7202 * Check packet info coverage.
7203 */
7204 overlap = hn_rndis_check_overlap(pktinfo_off, pktinfo_len,
7205 data_off, data_len);
7206 if (__predict_false(overlap)) {
7207 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg, "
7208 "pktinfo overlap data, pktinfo abs %d len %d, "
7209 "data abs %d len %d\n",
7210 pktinfo_off, pktinfo_len, data_off, data_len);
7211 return;
7212 }
7213
7214 /*
7215 * Find useful per-packet-info.
7216 */
7217 error = hn_rndis_rxinfo(((const uint8_t *)pkt) + pktinfo_off,
7218 pktinfo_len, &info);
7219 if (__predict_false(error)) {
7220 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg "
7221 "pktinfo\n");
7222 return;
7223 }
7224 }
7225
7226 if (__predict_false(data_off + data_len > pkt->rm_len)) {
7227 if_printf(rxr->hn_ifp, "invalid RNDIS packet msg, "
7228 "data overflow, msglen %u, data abs %d len %d\n",
7229 pkt->rm_len, data_off, data_len);
7230 return;
7231 }
7232 hn_rxpkt(rxr, ((const uint8_t *)pkt) + data_off, data_len, &info);
7233 }
7234
7235 static __inline void
hn_rndis_rxpkt(struct hn_rx_ring * rxr,const void * data,int dlen)7236 hn_rndis_rxpkt(struct hn_rx_ring *rxr, const void *data, int dlen)
7237 {
7238 const struct rndis_msghdr *hdr;
7239
7240 if (__predict_false(dlen < sizeof(*hdr))) {
7241 if_printf(rxr->hn_ifp, "invalid RNDIS msg\n");
7242 return;
7243 }
7244 hdr = data;
7245
7246 if (__predict_true(hdr->rm_type == REMOTE_NDIS_PACKET_MSG)) {
7247 /* Hot data path. */
7248 hn_rndis_rx_data(rxr, data, dlen);
7249 /* Done! */
7250 return;
7251 }
7252
7253 if (hdr->rm_type == REMOTE_NDIS_INDICATE_STATUS_MSG)
7254 hn_rndis_rx_status(rxr->hn_ifp->if_softc, data, dlen);
7255 else
7256 hn_rndis_rx_ctrl(rxr->hn_ifp->if_softc, data, dlen);
7257 }
7258
7259 static void
hn_nvs_handle_notify(struct hn_softc * sc,const struct vmbus_chanpkt_hdr * pkt)7260 hn_nvs_handle_notify(struct hn_softc *sc, const struct vmbus_chanpkt_hdr *pkt)
7261 {
7262 const struct hn_nvs_hdr *hdr;
7263
7264 if (VMBUS_CHANPKT_DATALEN(pkt) < sizeof(*hdr)) {
7265 if_printf(sc->hn_ifp, "invalid nvs notify\n");
7266 return;
7267 }
7268 hdr = VMBUS_CHANPKT_CONST_DATA(pkt);
7269
7270 if (hdr->nvs_type == HN_NVS_TYPE_TXTBL_NOTE) {
7271 /* Useless; ignore */
7272 return;
7273 }
7274 if_printf(sc->hn_ifp, "got notify, nvs type %u\n", hdr->nvs_type);
7275 }
7276
7277 static void
hn_nvs_handle_comp(struct hn_softc * sc,struct vmbus_channel * chan,const struct vmbus_chanpkt_hdr * pkt)7278 hn_nvs_handle_comp(struct hn_softc *sc, struct vmbus_channel *chan,
7279 const struct vmbus_chanpkt_hdr *pkt)
7280 {
7281 struct hn_nvs_sendctx *sndc;
7282
7283 sndc = (struct hn_nvs_sendctx *)(uintptr_t)pkt->cph_xactid;
7284 sndc->hn_cb(sndc, sc, chan, VMBUS_CHANPKT_CONST_DATA(pkt),
7285 VMBUS_CHANPKT_DATALEN(pkt));
7286 /*
7287 * NOTE:
7288 * 'sndc' CAN NOT be accessed anymore, since it can be freed by
7289 * its callback.
7290 */
7291 }
7292
7293 static void
hn_nvs_handle_rxbuf(struct hn_rx_ring * rxr,struct vmbus_channel * chan,const struct vmbus_chanpkt_hdr * pkthdr)7294 hn_nvs_handle_rxbuf(struct hn_rx_ring *rxr, struct vmbus_channel *chan,
7295 const struct vmbus_chanpkt_hdr *pkthdr)
7296 {
7297 const struct vmbus_chanpkt_rxbuf *pkt;
7298 const struct hn_nvs_hdr *nvs_hdr;
7299 int count, i, hlen;
7300
7301 if (__predict_false(VMBUS_CHANPKT_DATALEN(pkthdr) < sizeof(*nvs_hdr))) {
7302 if_printf(rxr->hn_ifp, "invalid nvs RNDIS\n");
7303 return;
7304 }
7305 nvs_hdr = VMBUS_CHANPKT_CONST_DATA(pkthdr);
7306
7307 /* Make sure that this is a RNDIS message. */
7308 if (__predict_false(nvs_hdr->nvs_type != HN_NVS_TYPE_RNDIS)) {
7309 if_printf(rxr->hn_ifp, "nvs type %u, not RNDIS\n",
7310 nvs_hdr->nvs_type);
7311 return;
7312 }
7313
7314 hlen = VMBUS_CHANPKT_GETLEN(pkthdr->cph_hlen);
7315 if (__predict_false(hlen < sizeof(*pkt))) {
7316 if_printf(rxr->hn_ifp, "invalid rxbuf chanpkt\n");
7317 return;
7318 }
7319 pkt = (const struct vmbus_chanpkt_rxbuf *)pkthdr;
7320
7321 if (__predict_false(pkt->cp_rxbuf_id != HN_NVS_RXBUF_SIG)) {
7322 if_printf(rxr->hn_ifp, "invalid rxbuf_id 0x%08x\n",
7323 pkt->cp_rxbuf_id);
7324 return;
7325 }
7326
7327 count = pkt->cp_rxbuf_cnt;
7328 if (__predict_false(hlen <
7329 __offsetof(struct vmbus_chanpkt_rxbuf, cp_rxbuf[count]))) {
7330 if_printf(rxr->hn_ifp, "invalid rxbuf_cnt %d\n", count);
7331 return;
7332 }
7333
7334 /* Each range represents 1 RNDIS pkt that contains 1 Ethernet frame */
7335 for (i = 0; i < count; ++i) {
7336 int ofs, len;
7337
7338 ofs = pkt->cp_rxbuf[i].rb_ofs;
7339 len = pkt->cp_rxbuf[i].rb_len;
7340 if (__predict_false(ofs + len > HN_RXBUF_SIZE)) {
7341 if_printf(rxr->hn_ifp, "%dth RNDIS msg overflow rxbuf, "
7342 "ofs %d, len %d\n", i, ofs, len);
7343 continue;
7344 }
7345 hn_rndis_rxpkt(rxr, rxr->hn_rxbuf + ofs, len);
7346 }
7347
7348 /*
7349 * Ack the consumed RXBUF associated w/ this channel packet,
7350 * so that this RXBUF can be recycled by the hypervisor.
7351 */
7352 hn_nvs_ack_rxbuf(rxr, chan, pkt->cp_hdr.cph_xactid);
7353 }
7354
7355 static void
hn_nvs_ack_rxbuf(struct hn_rx_ring * rxr,struct vmbus_channel * chan,uint64_t tid)7356 hn_nvs_ack_rxbuf(struct hn_rx_ring *rxr, struct vmbus_channel *chan,
7357 uint64_t tid)
7358 {
7359 struct hn_nvs_rndis_ack ack;
7360 int retries, error;
7361
7362 ack.nvs_type = HN_NVS_TYPE_RNDIS_ACK;
7363 ack.nvs_status = HN_NVS_STATUS_OK;
7364
7365 retries = 0;
7366 again:
7367 error = vmbus_chan_send(chan, VMBUS_CHANPKT_TYPE_COMP,
7368 VMBUS_CHANPKT_FLAG_NONE, &ack, sizeof(ack), tid);
7369 if (__predict_false(error == EAGAIN)) {
7370 /*
7371 * NOTE:
7372 * This should _not_ happen in real world, since the
7373 * consumption of the TX bufring from the TX path is
7374 * controlled.
7375 */
7376 if (rxr->hn_ack_failed == 0)
7377 if_printf(rxr->hn_ifp, "RXBUF ack retry\n");
7378 rxr->hn_ack_failed++;
7379 retries++;
7380 if (retries < 10) {
7381 DELAY(100);
7382 goto again;
7383 }
7384 /* RXBUF leaks! */
7385 if_printf(rxr->hn_ifp, "RXBUF ack failed\n");
7386 }
7387 }
7388
7389 static void
hn_chan_callback(struct vmbus_channel * chan,void * xrxr)7390 hn_chan_callback(struct vmbus_channel *chan, void *xrxr)
7391 {
7392 struct hn_rx_ring *rxr = xrxr;
7393 struct hn_softc *sc = rxr->hn_ifp->if_softc;
7394
7395 for (;;) {
7396 struct vmbus_chanpkt_hdr *pkt = rxr->hn_pktbuf;
7397 int error, pktlen;
7398
7399 pktlen = rxr->hn_pktbuf_len;
7400 error = vmbus_chan_recv_pkt(chan, pkt, &pktlen);
7401 if (__predict_false(error == ENOBUFS)) {
7402 void *nbuf;
7403 int nlen;
7404
7405 /*
7406 * Expand channel packet buffer.
7407 *
7408 * XXX
7409 * Use M_WAITOK here, since allocation failure
7410 * is fatal.
7411 */
7412 nlen = rxr->hn_pktbuf_len * 2;
7413 while (nlen < pktlen)
7414 nlen *= 2;
7415 nbuf = malloc(nlen, M_DEVBUF, M_WAITOK);
7416
7417 if_printf(rxr->hn_ifp, "expand pktbuf %d -> %d\n",
7418 rxr->hn_pktbuf_len, nlen);
7419
7420 free(rxr->hn_pktbuf, M_DEVBUF);
7421 rxr->hn_pktbuf = nbuf;
7422 rxr->hn_pktbuf_len = nlen;
7423 /* Retry! */
7424 continue;
7425 } else if (__predict_false(error == EAGAIN)) {
7426 /* No more channel packets; done! */
7427 break;
7428 }
7429 KASSERT(!error, ("vmbus_chan_recv_pkt failed: %d", error));
7430
7431 switch (pkt->cph_type) {
7432 case VMBUS_CHANPKT_TYPE_COMP:
7433 hn_nvs_handle_comp(sc, chan, pkt);
7434 break;
7435
7436 case VMBUS_CHANPKT_TYPE_RXBUF:
7437 hn_nvs_handle_rxbuf(rxr, chan, pkt);
7438 break;
7439
7440 case VMBUS_CHANPKT_TYPE_INBAND:
7441 hn_nvs_handle_notify(sc, pkt);
7442 break;
7443
7444 default:
7445 if_printf(rxr->hn_ifp, "unknown chan pkt %u\n",
7446 pkt->cph_type);
7447 break;
7448 }
7449 }
7450 hn_chan_rollup(rxr, rxr->hn_txr);
7451 }
7452
7453 static void
hn_sysinit(void * arg __unused)7454 hn_sysinit(void *arg __unused)
7455 {
7456 int i;
7457
7458 hn_udpcs_fixup = counter_u64_alloc(M_WAITOK);
7459
7460 #ifdef HN_IFSTART_SUPPORT
7461 /*
7462 * Don't use ifnet.if_start if transparent VF mode is requested;
7463 * mainly due to the IFF_DRV_OACTIVE flag.
7464 */
7465 if (hn_xpnt_vf && hn_use_if_start) {
7466 hn_use_if_start = 0;
7467 printf("hn: tranparent VF mode, if_transmit will be used, "
7468 "instead of if_start\n");
7469 }
7470 #endif
7471 if (hn_xpnt_vf_attwait < HN_XPNT_VF_ATTWAIT_MIN) {
7472 printf("hn: invalid transparent VF attach routing "
7473 "wait timeout %d, reset to %d\n",
7474 hn_xpnt_vf_attwait, HN_XPNT_VF_ATTWAIT_MIN);
7475 hn_xpnt_vf_attwait = HN_XPNT_VF_ATTWAIT_MIN;
7476 }
7477
7478 /*
7479 * Initialize VF map.
7480 */
7481 rm_init_flags(&hn_vfmap_lock, "hn_vfmap", RM_SLEEPABLE);
7482 hn_vfmap_size = HN_VFMAP_SIZE_DEF;
7483 hn_vfmap = malloc(sizeof(struct ifnet *) * hn_vfmap_size, M_DEVBUF,
7484 M_WAITOK | M_ZERO);
7485
7486 /*
7487 * Fix the # of TX taskqueues.
7488 */
7489 if (hn_tx_taskq_cnt <= 0)
7490 hn_tx_taskq_cnt = 1;
7491 else if (hn_tx_taskq_cnt > mp_ncpus)
7492 hn_tx_taskq_cnt = mp_ncpus;
7493
7494 /*
7495 * Fix the TX taskqueue mode.
7496 */
7497 switch (hn_tx_taskq_mode) {
7498 case HN_TX_TASKQ_M_INDEP:
7499 case HN_TX_TASKQ_M_GLOBAL:
7500 case HN_TX_TASKQ_M_EVTTQ:
7501 break;
7502 default:
7503 hn_tx_taskq_mode = HN_TX_TASKQ_M_INDEP;
7504 break;
7505 }
7506
7507 if (vm_guest != VM_GUEST_HV)
7508 return;
7509
7510 if (hn_tx_taskq_mode != HN_TX_TASKQ_M_GLOBAL)
7511 return;
7512
7513 hn_tx_taskque = malloc(hn_tx_taskq_cnt * sizeof(struct taskqueue *),
7514 M_DEVBUF, M_WAITOK);
7515 for (i = 0; i < hn_tx_taskq_cnt; ++i) {
7516 hn_tx_taskque[i] = taskqueue_create("hn_tx", M_WAITOK,
7517 taskqueue_thread_enqueue, &hn_tx_taskque[i]);
7518 taskqueue_start_threads(&hn_tx_taskque[i], 1, PI_NET,
7519 "hn tx%d", i);
7520 }
7521 }
7522 SYSINIT(hn_sysinit, SI_SUB_DRIVERS, SI_ORDER_SECOND, hn_sysinit, NULL);
7523
7524 static void
hn_sysuninit(void * arg __unused)7525 hn_sysuninit(void *arg __unused)
7526 {
7527
7528 if (hn_tx_taskque != NULL) {
7529 int i;
7530
7531 for (i = 0; i < hn_tx_taskq_cnt; ++i)
7532 taskqueue_free(hn_tx_taskque[i]);
7533 free(hn_tx_taskque, M_DEVBUF);
7534 }
7535
7536 if (hn_vfmap != NULL)
7537 free(hn_vfmap, M_DEVBUF);
7538 rm_destroy(&hn_vfmap_lock);
7539
7540 counter_u64_free(hn_udpcs_fixup);
7541 }
7542 SYSUNINIT(hn_sysuninit, SI_SUB_DRIVERS, SI_ORDER_SECOND, hn_sysuninit, NULL);
7543