svn commit: r305047 - head/sys/dev/hyperv/netvsc
Sepherosa Ziehau
sephe at FreeBSD.org
Tue Aug 30 03:40:24 UTC 2016
Author: sephe
Date: Tue Aug 30 03:40:22 2016
New Revision: 305047
URL: https://svnweb.freebsd.org/changeset/base/305047
Log:
hyperv/hn: Switch to new RNDIS set for RX filters.
MFC after: 1 week
Sponsored by: Microsoft
Differential Revision: https://reviews.freebsd.org/D7683
Modified:
head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
Modified: head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis_filter.c Tue Aug 30 03:11:07 2016 (r305046)
+++ head/sys/dev/hyperv/netvsc/hv_rndis_filter.c Tue Aug 30 03:40:22 2016 (r305047)
@@ -81,10 +81,7 @@ static void hv_rf_receive_data(struct hn
const void *data, int dlen);
static inline int hv_rf_query_device_mac(rndis_device *device);
static inline int hv_rf_query_device_link_status(rndis_device *device);
-static int hv_rf_set_packet_filter(rndis_device *device, uint32_t new_filter);
static int hv_rf_init_device(rndis_device *device);
-static int hv_rf_open_device(rndis_device *device);
-static int hv_rf_close_device(rndis_device *device);
int
hv_rf_send_offload_request(struct hn_softc *sc,
rndis_offload_params *offloads);
@@ -679,72 +676,6 @@ static uint8_t netvsc_hash_key[NDIS_HASH
0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa
};
-/*
- * RNDIS filter set packet filter
- * Sends an rndis request with the new filter, then waits for a response
- * from the host.
- * Returns zero on success, non-zero on failure.
- */
-static int
-hv_rf_set_packet_filter(rndis_device *device, uint32_t new_filter)
-{
- rndis_request *request;
- rndis_set_request *set;
- rndis_set_complete *set_complete;
- uint32_t status;
- int ret;
-
- request = hv_rndis_request(device, REMOTE_NDIS_SET_MSG,
- RNDIS_MESSAGE_SIZE(rndis_set_request) + sizeof(uint32_t));
- if (request == NULL) {
- ret = -1;
- goto cleanup;
- }
-
- /* Set up the rndis set */
- set = &request->request_msg.msg.set_request;
- set->oid = RNDIS_OID_GEN_CURRENT_PACKET_FILTER;
- set->info_buffer_length = sizeof(uint32_t);
- set->info_buffer_offset = sizeof(rndis_set_request);
-
- memcpy((void *)((unsigned long)set + sizeof(rndis_set_request)),
- &new_filter, sizeof(uint32_t));
-
- ret = hv_rf_send_request(device, request, REMOTE_NDIS_SET_MSG);
- if (ret != 0) {
- goto cleanup;
- }
-
- /*
- * Wait for the response from the host. Another thread will signal
- * us when the response has arrived. In the failure case,
- * sema_timedwait() returns a non-zero status after waiting 5 seconds.
- */
- ret = sema_timedwait(&request->wait_sema, 5 * hz);
- if (ret == 0) {
- /* Response received, check status */
- set_complete = &request->response_msg.msg.set_complete;
- status = set_complete->status;
- if (status != RNDIS_STATUS_SUCCESS) {
- /* Bad response status, return error */
- ret = -2;
- }
- } else {
- /*
- * We cannot deallocate the request since we may still
- * receive a send completion for it.
- */
- goto exit;
- }
-
-cleanup:
- if (request != NULL) {
- hv_put_rndis_request(device, request);
- }
-exit:
- return (ret);
-}
-
static const void *
hn_rndis_xact_execute(struct hn_softc *sc, struct vmbus_xact *xact, uint32_t rid,
size_t reqlen, size_t *comp_len0, uint32_t comp_type)
@@ -1103,6 +1034,25 @@ hn_rndis_conf_rss(struct hn_softc *sc, i
return (error);
}
+static int
+hn_rndis_set_rxfilter(struct hn_softc *sc, uint32_t filter)
+{
+ int error;
+
+ error = hn_rndis_set(sc, OID_GEN_CURRENT_PACKET_FILTER,
+ &filter, sizeof(filter));
+ if (error) {
+ if_printf(sc->hn_ifp, "set RX filter 0x%08x failed: %d\n",
+ filter, error);
+ } else {
+ if (bootverbose) {
+ if_printf(sc->hn_ifp, "set RX filter 0x%08x done\n",
+ filter);
+ }
+ }
+ return (error);
+}
+
/*
* RNDIS filter init device
*/
@@ -1211,55 +1161,6 @@ hv_rf_halt_device(rndis_device *device)
}
/*
- * RNDIS filter open device
- */
-static int
-hv_rf_open_device(rndis_device *device)
-{
- int ret;
-
- if (device->state != RNDIS_DEV_INITIALIZED) {
- return (0);
- }
-
- if (hv_promisc_mode != 1) {
- ret = hv_rf_set_packet_filter(device,
- NDIS_PACKET_TYPE_BROADCAST |
- NDIS_PACKET_TYPE_ALL_MULTICAST |
- NDIS_PACKET_TYPE_DIRECTED);
- } else {
- ret = hv_rf_set_packet_filter(device,
- NDIS_PACKET_TYPE_PROMISCUOUS);
- }
-
- if (ret == 0) {
- device->state = RNDIS_DEV_DATAINITIALIZED;
- }
-
- return (ret);
-}
-
-/*
- * RNDIS filter close device
- */
-static int
-hv_rf_close_device(rndis_device *device)
-{
- int ret;
-
- if (device->state != RNDIS_DEV_DATAINITIALIZED) {
- return (0);
- }
-
- ret = hv_rf_set_packet_filter(device, 0);
- if (ret == 0) {
- device->state = RNDIS_DEV_INITIALIZED;
- }
-
- return (ret);
-}
-
-/*
* RNDIS filter on device add
*/
int
@@ -1442,8 +1343,17 @@ hv_rf_on_device_remove(struct hn_softc *
int
hv_rf_on_open(struct hn_softc *sc)
{
+ uint32_t filter;
- return (hv_rf_open_device(sc->rndis_dev));
+ /* XXX */
+ if (hv_promisc_mode != 1) {
+ filter = NDIS_PACKET_TYPE_BROADCAST |
+ NDIS_PACKET_TYPE_ALL_MULTICAST |
+ NDIS_PACKET_TYPE_DIRECTED;
+ } else {
+ filter = NDIS_PACKET_TYPE_PROMISCUOUS;
+ }
+ return (hn_rndis_set_rxfilter(sc, filter));
}
/*
@@ -1453,7 +1363,7 @@ int
hv_rf_on_close(struct hn_softc *sc)
{
- return (hv_rf_close_device(sc->rndis_dev));
+ return (hn_rndis_set_rxfilter(sc, 0));
}
static void
More information about the svn-src-head
mailing list