@@ -57,8 +57,12 @@ int chksum6(struct pkt_ip6hdr_t *iph) {
57
57
hdr .zero [0 ]= hdr .zero [1 ]= hdr .zero [2 ]= 0 ;
58
58
hdr .next_header = iph -> next_header ;
59
59
icmp -> check = 0 ;
60
- sum = in_cksum ((uint16_t * )& hdr , sizeof (hdr ));
61
- sum += in_cksum ((uint16_t * )icmp , ntohs (iph -> data_len ));
60
+ uint16_t hdr_buf [sizeof (hdr ) / 2 ];
61
+ memcpy (hdr_buf , & hdr , sizeof (hdr ));
62
+ sum = in_cksum (hdr_buf , sizeof (hdr ));
63
+ uint16_t icmp_buf [ntohs (iph -> data_len ) / 2 ];
64
+ memcpy (icmp_buf , icmp , ntohs (iph -> data_len ));
65
+ sum += in_cksum (icmp_buf , ntohs (iph -> data_len ));
62
66
icmp -> check = cksum_wrap (sum );
63
67
break ;
64
68
}
@@ -74,8 +78,12 @@ int chksum6(struct pkt_ip6hdr_t *iph) {
74
78
hdr .zero [0 ]= hdr .zero [1 ]= hdr .zero [2 ]= 0 ;
75
79
hdr .next_header = iph -> next_header ;
76
80
udphdr -> check = 0 ;
77
- sum = in_cksum ((uint16_t * )& hdr , sizeof (hdr ));
78
- sum += in_cksum ((uint16_t * )udphdr , udplen );
81
+ uint16_t hdr_buf [sizeof (hdr ) / 2 ];
82
+ memcpy (hdr_buf , & hdr , sizeof (hdr ));
83
+ sum = in_cksum (hdr_buf , sizeof (hdr ));
84
+ uint16_t udphdr_buf [udplen / 2 ];
85
+ memcpy (udphdr_buf , udphdr , udplen );
86
+ sum += in_cksum (udphdr_buf , udplen );
79
87
udphdr -> check = cksum_wrap (sum );
80
88
}
81
89
break ;
@@ -91,8 +99,12 @@ int chksum6(struct pkt_ip6hdr_t *iph) {
91
99
hdr .zero [0 ]= hdr .zero [1 ]= hdr .zero [2 ]= 0 ;
92
100
hdr .next_header = iph -> next_header ;
93
101
tcphdr -> check = 0 ;
94
- sum = in_cksum ((uint16_t * )& hdr , sizeof (hdr ));
95
- sum += in_cksum ((uint16_t * )tcphdr , tcplen );
102
+ uint16_t hdr_buf [sizeof (hdr ) / 2 ];
103
+ memcpy (hdr_buf , & hdr , sizeof (hdr ));
104
+ sum = in_cksum (hdr_buf , sizeof (hdr ));
105
+ uint16_t tcphdr_buf [tcplen / 2 ];
106
+ memcpy (tcphdr_buf , tcphdr , tcplen );
107
+ sum += in_cksum (tcphdr_buf , tcplen );
96
108
tcphdr -> check = cksum_wrap (sum );
97
109
}
98
110
break ;
@@ -138,7 +150,9 @@ int chksum(struct pkt_iphdr_t *iph) {
138
150
tcph -> check = 0 ;
139
151
sum = in_cksum (((uint16_t * )iph )+ 6 /*saddr*/ , 8 );
140
152
sum += ntohs (IPPROTO_TCP + len );
141
- sum += in_cksum ((uint16_t * )tcph , len );
153
+ uint16_t tcph_buf [len / 2 ];
154
+ memcpy (tcph_buf , tcph , len );
155
+ sum += in_cksum (tcph_buf , len );
142
156
tcph -> check = cksum_wrap (sum );
143
157
}
144
158
break ;
@@ -155,7 +169,9 @@ int chksum(struct pkt_iphdr_t *iph) {
155
169
udph -> check = 0 ;
156
170
sum = in_cksum (((uint16_t * )iph )+ 6 /*saddr*/ , 8 );
157
171
sum += ntohs (IPPROTO_UDP + udplen );
158
- sum += in_cksum ((uint16_t * )udph , udplen );
172
+ uint16_t udph_buf [udplen / 2 ];
173
+ memcpy (udph_buf , udph , udplen );
174
+ sum += in_cksum (udph_buf , udplen );
159
175
udph -> check = cksum_wrap (sum );
160
176
}
161
177
break ;
@@ -166,14 +182,18 @@ int chksum(struct pkt_iphdr_t *iph) {
166
182
(struct pkt_icmphdr_t * )(((void * )iph ) + hlen );
167
183
len -= hlen ;
168
184
icmph -> check = 0 ;
169
- sum = in_cksum ((uint16_t * )icmph , len );
185
+ uint16_t icmph_buf [len / 2 ];
186
+ memcpy (icmph_buf , icmph , len );
187
+ sum = in_cksum (icmph_buf , len );
170
188
icmph -> check = cksum_wrap (sum );
171
189
}
172
190
break ;
173
191
}
174
192
175
193
iph -> check = 0 ;
176
- sum = in_cksum ((uint16_t * )iph , hlen );
194
+ uint16_t iph_buf [hlen / 2 ];
195
+ memcpy (iph_buf , iph , hlen );
196
+ sum = in_cksum (iph_buf , hlen );
177
197
iph -> check = cksum_wrap (sum );
178
198
179
199
return 0 ;
0 commit comments