-
Notifications
You must be signed in to change notification settings - Fork 0
/
inetproto.cc
56 lines (50 loc) · 1.63 KB
/
inetproto.cc
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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "inetproto.h"
// Checksum
// 헤더 길이는 바이트 단위
uint16_t IPHeaderChecksum(uint16_t iph_len, uint8_t *piph)
{
uint16_t sum = 0;
// 2바이트 단위로 더하므로 iph_len/2
//iph_len >>= 1;
for (uint16_t i = 0; i < iph_len; i += 2)
{
uint16_t word = ((piph[i] << 8) + (piph[i + 1]));
uint16_t carry = 65535 - sum;
sum += word;
if (word > carry){ sum += 1; }
}
// 1의 보수
sum = ~sum;
return sum;
}
void SetARPPacket(uint8_t *out,
uint8_t htype,
uint8_t ptype,
uint8_t hlen,
uint8_t plen,
uint16_t opcode,
uint8_t *srcmac,
uint8_t *srcip,
uint8_t *dstmac,
uint8_t *dstip
)
{
ARPPacket arppacket;
memset(&arppacket, 0, sizeof(ARPPacket));
int arplen = sizeof(ARPPacket);
// arppacket 만들기
arppacket.htype = htype; // 하드웨어 타입
arppacket.ptype = ptype; // 프로토콜 타입
arppacket.hlen = hlen; // 하드웨어 주소 길이
arppacket.plen = plen; // 프로토콜 주소 길이
arppacket.opcode = opcode; // ARP OPCODE
memcpy(arppacket.shaddr, srcmac, MACADDRESS_LENGTH); // 송신지 하드웨어 주소 설정
memcpy(arppacket.spaddr, srcip, IPV4ADDRESS_LENGTH); // 송신지 IP address 셋팅
memcpy(arppacket.dhaddr, dstmac, MACADDRESS_LENGTH); // 목적지 하드웨어 주소 설정
memcpy(arppacket.dpaddr, dstip, IPV4ADDRESS_LENGTH); // 목적지 ip address 셋팅
// 패킷 셋팅
memcpy(out, &arppacket, arplen);
}