summaryrefslogtreecommitdiffstats
path: root/drivers/staging/hv/include/NetVscApi.h
blob: 8e780b0fc660a3317eb80cb4143cf8fd81c8ee67 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
 *
 * Copyright (c) 2009, Microsoft Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place - Suite 330, Boston, MA 02111-1307 USA.
 *
 * Authors:
 *   Haiyang Zhang <haiyangz@microsoft.com>
 *   Hank Janssen  <hjanssen@microsoft.com>
 *
 */


#ifndef _NETVSC_API_H_
#define _NETVSC_API_H_

#include "VmbusApi.h"

//
// Defines
//
#define NETVSC_DEVICE_RING_BUFFER_SIZE			64*PAGE_SIZE

#define HW_MACADDR_LEN		6

//
// Fwd declaration
//
typedef struct _NETVSC_PACKET	*PNETVSC_PACKET;


//
// Data types
//

typedef int (*PFN_ON_OPEN)(DEVICE_OBJECT *Device);
typedef int (*PFN_ON_CLOSE)(DEVICE_OBJECT *Device);

typedef void (*PFN_QUERY_LINKSTATUS)(DEVICE_OBJECT *Device);
typedef int (*PFN_ON_SEND)(DEVICE_OBJECT *dev, PNETVSC_PACKET packet);
typedef void (*PFN_ON_SENDRECVCOMPLETION)(PVOID Context);

typedef int (*PFN_ON_RECVCALLBACK)(DEVICE_OBJECT *dev, PNETVSC_PACKET packet);
typedef void (*PFN_ON_LINKSTATUS_CHANGED)(DEVICE_OBJECT *dev, UINT32 Status);

// Represent the xfer page packet which contains 1 or more netvsc packet
typedef struct _XFERPAGE_PACKET {
	DLIST_ENTRY			ListEntry;

	// # of netvsc packets this xfer packet contains
	UINT32				Count;
} XFERPAGE_PACKET;


// The number of pages which are enough to cover jumbo frame buffer.
#define NETVSC_PACKET_MAXPAGE  4

// Represent netvsc packet which contains 1 RNDIS and 1 ethernet frame within the RNDIS
typedef struct _NETVSC_PACKET {
	// Bookkeeping stuff
	DLIST_ENTRY				ListEntry;

	DEVICE_OBJECT			*Device;
	BOOL					IsDataPacket;

	// Valid only for receives when we break a xfer page packet into multiple netvsc packets
	XFERPAGE_PACKET		*XferPagePacket;

	union {
		struct{
			UINT64						ReceiveCompletionTid;
			PVOID						ReceiveCompletionContext;
			PFN_ON_SENDRECVCOMPLETION	OnReceiveCompletion;
		} Recv;
		struct{
			UINT64						SendCompletionTid;
			PVOID						SendCompletionContext;
			PFN_ON_SENDRECVCOMPLETION	OnSendCompletion;
		} Send;
	} Completion;

	// This points to the memory after PageBuffers
	PVOID					Extension;

	UINT32					TotalDataBufferLength;
	// Points to the send/receive buffer where the ethernet frame is
	UINT32					PageBufferCount;
	PAGE_BUFFER				PageBuffers[NETVSC_PACKET_MAXPAGE];

} NETVSC_PACKET;


// Represents the net vsc driver
typedef struct _NETVSC_DRIVER_OBJECT {
	DRIVER_OBJECT				Base; // Must be the first field

	UINT32						RingBufferSize;
	UINT32						RequestExtSize;

	// Additional num  of page buffers to allocate
	UINT32						AdditionalRequestPageBufferCount;

	// This is set by the caller to allow us to callback when we receive a packet
	// from the "wire"
	PFN_ON_RECVCALLBACK			OnReceiveCallback;

	PFN_ON_LINKSTATUS_CHANGED	OnLinkStatusChanged;

	// Specific to this driver
	PFN_ON_OPEN					OnOpen;
	PFN_ON_CLOSE				OnClose;
	PFN_ON_SEND					OnSend;
	//PFN_ON_RECVCOMPLETION	OnReceiveCompletion;

	//PFN_QUERY_LINKSTATUS		QueryLinkStatus;

	void*						Context;
} NETVSC_DRIVER_OBJECT;


typedef struct _NETVSC_DEVICE_INFO {
    UCHAR	MacAddr[6];
    BOOL	LinkState;	// 0 - link up, 1 - link down
} NETVSC_DEVICE_INFO;

//
// Interface
//
int
NetVscInitialize(
	DRIVER_OBJECT* drv
	);

#endif // _NETVSC_API_H_