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)