5 // Created by Terrin Eager on 1/19/13.
11 #define EthernetHeaderStart 14
13 void Frame::Set(BJ_UINT8
* data
,BJ_UINT32 len
,BJ_UINT64 t
)
20 BJ_UINT8
* Frame::GetEthernetStart()
22 //todo Support other media types
25 BJ_UINT8
* Frame::GetIPStart()
27 BJ_UINT8
* ether
= GetEthernetStart();
32 BJ_UINT8
* Frame::GetUDPStart()
34 BJ_UINT8
* ip
= GetIPStart();
36 BJ_UINT16 nSize
= *((__uint16_t
*) (ip
));
37 BJ_UINT16 nVerison
= (nSize
&0xf0) >> 4;
40 m_bCurrentFrameIPversion
= 4;
46 BJ_UINT8 nProtocol
= *(ip
+9);
48 if (nProtocol
!= 17) // Not UDP
51 else if (nVerison
== 0x6)
53 m_bCurrentFrameIPversion
= 6;
54 BJ_UINT8 nProtocol
= *(ip
+6);
56 if (nProtocol
!= 17) // Not UDP
65 BJ_UINT8
* Frame::GetBonjourStart()
67 BJ_UINT8
* udp
= GetUDPStart();
73 BJ_UINT16 nSourcePort
= *((__uint16_t
*)(udp
));
74 BJ_UINT16 nDestPort
= *((__uint16_t
*)(udp
+2));
75 BJ_UINT16 nBonjourPort
= htons(5353);
77 if (nSourcePort
== nBonjourPort
&& nDestPort
== nBonjourPort
)
86 BJIPAddr
* Frame::GetSrcIPAddr()
88 BJ_UINT8
* ip
= GetIPStart();
90 BJ_UINT16 nSize
= (__uint16_t
) (*ip
);
91 BJ_UINT16 nVerison
= (nSize
&0xf0) >> 4;
94 m_bCurrentFrameIPversion
= 4;
96 struct in_addr
* ipi_addr
;
98 ipi_addr
= (in_addr
*)(ip
+12);
100 sourceIPAddr
.Set(ipi_addr
);
103 else if (nVerison
== 0x6)
105 m_bCurrentFrameIPversion
= 6;
110 sourceIPAddr
.Setv6Raw(ipi_addr
);
114 return &sourceIPAddr
;
117 BJIPAddr
* Frame::GetDestIPAddr()
119 BJ_UINT8
* ip
= GetIPStart();
121 BJ_UINT16 nSize
= *((__uint16_t
*) (ip
));
122 BJ_UINT16 nVerison
= (nSize
&0xf0) >> 4;
125 m_bCurrentFrameIPversion
= 4;
127 struct in_addr
* ipi_addr
;
129 ipi_addr
= (in_addr
*)(ip
+16);
131 destIPAddr
.Set(ipi_addr
);
134 else if (nVerison
== 0x6)
136 m_bCurrentFrameIPversion
= 6;
137 struct in6_addr
* ipi_addr
;
139 ipi_addr
= (in6_addr
*)(ip
+24);
141 destIPAddr
.Set(ipi_addr
);
147 BJMACAddr
* Frame::GetSrcMACAddr()
149 sourceMACAddr
.Set(GetEthernetStart()+6);
151 return &sourceMACAddr
;
154 BJMACAddr
* Frame::GetDestMACAddr()
156 destMACAddr
.Set(GetEthernetStart());
161 void Frame::SetDatalinkType(BJ_DATALINKTYPE datalinkType
)
163 m_datalinkType
= datalinkType
;
166 BJ_UINT32
Frame::GetLinklayerHeaderLength()
168 switch (m_datalinkType
)
170 case (BJ_DLT_EN10MB
):
171 return EthernetHeaderStart
;
172 case (BJ_DLT_IEEE802_11
):
173 return Get80211HeaderLength();
175 // Default to Ethernet
176 return EthernetHeaderStart
;
180 BJ_UINT32
Frame::Get80211HeaderLength()
182 // XXX: 802.11 header is tricky since it has no "length" field.
183 // We should look at "FrameControl" and derive the length manually for each frame.
184 BJ_UINT16
* frameControl
= (BJ_UINT16
*)GetEthernetStart();
186 // [SubType] [Type - Ver]
188 bool isFrameData
= (0x0C & *frameControl
) == 0x08;
189 bool isQosData
= ((0xF0 & *frameControl
) == 0x80) && isFrameData
;
193 //Standard (24) + QoS (2) + LLC (3) + SNAP (5)
194 return 24 + 2 + 3 + 5;
198 //Standard (24) + LLC (3) + SNAP (5)