summaryrefslogtreecommitdiff
path: root/network/wlan/WDI/COMMON/P2P_AdditionalIe.c
blob: bf94380846c021ba0482f2fb175e9611baf17cdd (plain)
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
#include "Mp_Precomp.h"

#if WPP_SOFTWARE_TRACE
#include "P2P_AdditionalIe.tmh"
#endif

#include "P2P_AdditionalIe.h"

#if (P2P_SUPPORT == 1)

//-----------------------------------------------------------------------------
// Local
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Exported
//-----------------------------------------------------------------------------

VOID
P2P_AddIe_Init(
	IN  PP2P_ADD_IES			addIes
	)
{
	PlatformZeroMemory(addIes, sizeof(*addIes));

	return;
}

VOID
P2P_AddIe_Free(
	IN  PP2P_ADD_IES 			addIes
	)
{
	u4Byte						itAddIe = 0;

	for(itAddIe = 0; itAddIe < P2P_ADD_IE_MAX; itAddIe++)
	{
		if(addIes->addIe[itAddIe])
		{
			FrameBuf_Free(addIes->addIe[itAddIe]);
			addIes->addIe[itAddIe] = NULL;
		}
	}
}

BOOLEAN
P2P_AddIe_Set(
	IN  PP2P_ADD_IES			addIes,
	IN  P2P_ADD_IE_ID			id,
	IN  u4Byte					bufLen,
	IN  u1Byte					*pBuf
	)
{
	FRAME_BUF					srcBuf;
	FRAME_BUF					*pClonedSrcBuf = NULL;
	FRAME_BUF					**ppDestBuf = NULL;

	if(P2P_ADD_IE_MAX < id)
	{
		RT_TRACE(COMP_P2P, DBG_LOUD, ("%s: invalid id: %u!\n", __FUNCTION__, id));
		return FALSE;
	}

	FrameBuf_Init((u2Byte)bufLen, (u2Byte)bufLen, pBuf, &srcBuf);


	ppDestBuf = &(addIes->addIe[id]);

	if(NULL == (pClonedSrcBuf = FrameBuf_Clone(&srcBuf)))
	{
		RT_TRACE(COMP_P2P, DBG_LOUD, ("%s: Frame buffer clone Failure!\n", __FUNCTION__));
		return FALSE;
	}

	if(*ppDestBuf) FrameBuf_Free(*ppDestBuf);

	*ppDestBuf = pClonedSrcBuf;
	
	return TRUE;
}

const FRAME_BUF *
P2P_AddIe_Get(
	IN  const PP2P_ADD_IES		addIes,
	IN  P2P_ADD_IE_ID			id
	)
{
	FRAME_BUF					*pBuf = NULL;

	if(P2P_ADD_IE_MAX < id)
	{
		RT_TRACE(COMP_P2P, DBG_LOUD, ("%s: invalid id: %u!\n", __FUNCTION__, id));
		return NULL;
	}

	if (addIes->addIe != NULL)
	{
		// Prefast warning C6385: Reading invalid data from 'addIes->addIe':  the readable size is '44' bytes, but 'id' bytes may be read.
		// false positive, disable it here.
#pragma warning( disable: 6385 )
		pBuf = addIes->addIe[id];
	}

	return pBuf;
}

u2Byte
P2P_AddIe_Append(
	IN  const PP2P_ADD_IES		addIes,
	IN  P2P_ADD_IE_ID			id,
	IN  FRAME_BUF				*pBuf
	)
{
	const FRAME_BUF				*pAddIeBuf = NULL;
	u2Byte						bytesWritten = 0;

	pAddIeBuf = P2P_AddIe_Get(addIes, id);

	if(pAddIeBuf)
	{
		if(FrameBuf_Append(pBuf, pAddIeBuf))
		{
			bytesWritten = FrameBuf_Length(pAddIeBuf);
		}
		FrameBuf_Dump(pAddIeBuf, 0, DBG_LOUD, __FUNCTION__);
	}

	return bytesWritten;
}

#endif