summaryrefslogtreecommitdiff
path: root/drivers/staging/bcm/Protocol.h
blob: b20d857fc14633995a94807992e61648cbd70422 (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
/************************************
*	Protocol.h
*************************************/
#ifndef	__PROTOCOL_H__
#define	__PROTOCOL_H__

#define IPV4 4
#define IPV6 6

struct ArpHeader {
	struct arphdr arp;
	unsigned char ar_sha[ETH_ALEN];	/* sender hardware address  */
	unsigned char ar_sip[4];	/* sender IP address        */
	unsigned char ar_tha[ETH_ALEN];	/* target hardware address  */
	unsigned char ar_tip[4];	/* target IP address        */
};

struct TransportHeaderT {
	union {
		struct udphdr uhdr;
		struct tcphdr thdr;
	};
} __packed;
typedef struct TransportHeaderT xporthdr;

typedef enum _E_NWPKT_IPFRAME_TYPE {
	eNonIPPacket,
	eIPv4Packet,
	eIPv6Packet
} E_NWPKT_IPFRAME_TYPE;

typedef enum _E_NWPKT_ETHFRAME_TYPE {
	eEthUnsupportedFrame,
	eEth802LLCFrame,
	eEth802LLCSNAPFrame,
	eEth802QVLANFrame,
	eEthOtherFrame
} E_NWPKT_ETHFRAME_TYPE;

typedef struct _S_ETHCS_PKT_INFO {
	E_NWPKT_IPFRAME_TYPE eNwpktIPFrameType;
	E_NWPKT_ETHFRAME_TYPE eNwpktEthFrameType;
	unsigned short	usEtherType;
	unsigned char	ucDSAP;
} S_ETHCS_PKT_INFO, *PS_ETHCS_PKT_INFO;

typedef struct _ETH_CS_802_Q_FRAME {
	struct bcm_eth_header EThHdr;
	unsigned short UserPriority:3;
	unsigned short CFI:1;
	unsigned short VLANID:12;
	unsigned short EthType;
} __packed ETH_CS_802_Q_FRAME;

typedef struct _ETH_CS_802_LLC_FRAME {
	struct bcm_eth_header EThHdr;
	unsigned char DSAP;
	unsigned char SSAP;
	unsigned char Control;
} __packed ETH_CS_802_LLC_FRAME;

typedef struct _ETH_CS_802_LLC_SNAP_FRAME {
	struct bcm_eth_header EThHdr;
	unsigned char DSAP;
	unsigned char SSAP;
	unsigned char Control;
	unsigned char OUI[3];
	unsigned short usEtherType;
} __packed ETH_CS_802_LLC_SNAP_FRAME;

typedef struct _ETH_CS_ETH2_FRAME {
	struct bcm_eth_header EThHdr;
} __packed ETH_CS_ETH2_FRAME;

#define ETHERNET_FRAMETYPE_IPV4		ntohs(0x0800)
#define ETHERNET_FRAMETYPE_IPV6		ntohs(0x86dd)
#define ETHERNET_FRAMETYPE_802QVLAN	ntohs(0x8100)

/* Per SF CS Specification Encodings */
typedef enum _E_SERVICEFLOW_CS_SPEC_ {
	eCSSpecUnspecified = 0,
	eCSPacketIPV4,
	eCSPacketIPV6,
	eCS802_3PacketEthernet,
	eCS802_1QPacketVLAN,
	eCSPacketIPV4Over802_3Ethernet,
	eCSPacketIPV6Over802_3Ethernet,
	eCSPacketIPV4Over802_1QVLAN,
	eCSPacketIPV6Over802_1QVLAN,
	eCSPacketUnsupported
} E_SERVICEFLOW_CS_SPEC;

#define	IP6_HEADER_LEN		40
#define IP_VERSION(byte)	(((byte&0xF0)>>4))

#define MAC_ADDRESS_SIZE	6
#define	ETH_AND_IP_HEADER_LEN	(14 + 20)
#define L4_SRC_PORT_LEN		2
#define L4_DEST_PORT_LEN	2
#define	CTRL_PKT_LEN		(8 + ETH_AND_IP_HEADER_LEN)

#define	ETH_ARP_FRAME		0x806
#define	ETH_IPV4_FRAME		0x800
#define	ETH_IPV6_FRAME		0x86DD
#define UDP			0x11
#define TCP			0x06

#define	ARP_OP_REQUEST		0x01
#define	ARP_OP_REPLY		0x02
#define	ARP_PKT_SIZE		60

/* This is the format for the TCP packet header */
struct bcm_tcp_header {
	unsigned short usSrcPort;
	unsigned short usDestPort;
	unsigned long  ulSeqNumber;
	unsigned long  ulAckNumber;
	unsigned char  HeaderLength;
	unsigned char  ucFlags;
	unsigned short usWindowsSize;
	unsigned short usChkSum;
	unsigned short usUrgetPtr;
};

#define TCP_HEADER_LEN		sizeof(struct bcm_tcp_header)
#define TCP_ACK			0x10  /* Bit 4 in tcpflags field. */
#define GET_TCP_HEADER_LEN(byte) ((byte&0xF0)>>4)

#endif /* __PROTOCOL_H__ */