version 1.1.1.1, 2012/02/21 22:14:23
|
version 1.1.1.3, 2023/09/27 11:11:38
|
Line 30
|
Line 30
|
* |
* |
*/ |
*/ |
|
|
#if (HAVE_CONFIG_H) | #include "common.h" |
#include "../include/config.h" | |
#endif | /* Note: len is in bytes, not 16-bit words! */ |
#if (!(_WIN32) || (__CYGWIN__)) | |
#include "../include/libnet.h" | |
#else | |
#include "../include/win32/libnet.h" | |
#endif | |
int |
int |
libnet_in_cksum(u_int16_t *addr, int len) | libnet_in_cksum(uint16_t *addr, int len) |
{ |
{ |
int sum; | int sum = 0; |
| union |
| { |
| uint16_t s; |
| uint8_t b[2]; |
| } pad; |
|
|
sum = 0; |
sum = 0; |
|
|
Line 50 libnet_in_cksum(u_int16_t *addr, int len)
|
Line 50 libnet_in_cksum(u_int16_t *addr, int len)
|
sum += *addr++; |
sum += *addr++; |
len -= 2; |
len -= 2; |
} |
} |
|
|
if (len == 1) |
if (len == 1) |
{ |
{ |
sum += *(u_int16_t *)addr; | pad.b[0] = *(uint8_t *)addr; |
| pad.b[1] = 0; |
| sum += pad.s; |
} |
} |
|
|
return (sum); |
return (sum); |
Line 95 libnet_toggle_checksum(libnet_t *l, libnet_ptag_t ptag
|
Line 98 libnet_toggle_checksum(libnet_t *l, libnet_ptag_t ptag
|
} |
} |
} |
} |
|
|
|
static int check_ip_payload_size(libnet_t*l, const uint8_t *iphdr, int ip_hl, int h_len, const uint8_t * end, const char* func) |
|
{ |
|
if((iphdr+ip_hl+h_len) > end) |
|
{ |
|
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, |
|
"%s(): ip payload not inside packet (pktsz %d, iphsz %d, payloadsz %d)", func, |
|
(int)(end - iphdr), ip_hl, h_len); |
|
return -1; |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
|
|
/* |
|
* For backwards binary compatibility. The calculations done here can easily |
|
* result in buffer overreads and overwrites. You have been warned. And no, it |
|
* is not possible to fix, the API contains no information on the buffer's |
|
* boundary. libnet itself calls the safe function, libnet_inet_checksum(). So |
|
* should you. |
|
*/ |
int |
int |
libnet_do_checksum(libnet_t *l, u_int8_t *buf, int protocol, int len) | libnet_do_checksum(libnet_t *l, uint8_t *iphdr, int protocol, int h_len) |
{ |
{ |
/* will need to update this for ipv6 at some point */ | uint16_t ip_len = 0; |
struct libnet_ipv4_hdr *iph_p; | struct libnet_ipv4_hdr* ip4 = (struct libnet_ipv4_hdr *)iphdr; |
struct libnet_ipv6_hdr *ip6h_p; | struct libnet_ipv6_hdr* ip6 = (struct libnet_ipv6_hdr *)iphdr; |
int is_ipv6; | |
int ip_hl; | |
int sum; | |
|
|
is_ipv6 = 0; /* default to not using IPv6 */ | if(ip4->ip_v == 6) { |
sum = 0; | ip_len = ntohs(ip6->ip_len); |
iph_p = NULL; | } else { |
ip6h_p = NULL; | ip_len = ntohs(ip4->ip_len); |
| } |
|
|
if (len == 0) | return libnet_inet_checksum(l, iphdr, protocol, h_len, |
| iphdr, iphdr + ip_len |
| ); |
| } |
| |
| |
| #define CHECK_IP_PAYLOAD_SIZE() do { \ |
| int e=check_ip_payload_size(l,iphdr,ip_hl, h_len, end, __func__);\ |
| if(e) return e;\ |
| } while(0) |
| |
| |
| /* |
| * We are checksumming pblock "q" |
| * |
| * iphdr is the pointer to it's encapsulating IP header |
| * protocol describes the type of "q", expressed as an IPPROTO_ value |
| * h_len is the h_len from "q" |
| */ |
| int |
| libnet_inet_checksum(libnet_t *l, uint8_t *iphdr, int protocol, int h_len, const uint8_t *beg, const uint8_t * end) |
| { |
| /* will need to update this for ipv6 at some point */ |
| struct libnet_ipv4_hdr *iph_p = (struct libnet_ipv4_hdr *)iphdr; |
| struct libnet_ipv6_hdr *ip6h_p = NULL; /* default to not using IPv6 */ |
| int ip_hl = 0; |
| int sum = 0; |
| uint8_t ip_nh = 0; |
| |
| /* Check for memory under/over reads/writes. */ |
| if(iphdr < beg || (iphdr+sizeof(*iph_p)) > end) |
{ |
{ |
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, |
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, |
"%s(): header length can't be zero\n", __func__); | "%s(): ipv4 hdr not inside packet (where %d, size %d)", __func__, |
return (-1); | (int)(iphdr-beg), (int)(end-beg)); |
| return -1; |
} |
} |
|
|
/* |
/* |
* Figure out which IP version we're dealing with. We'll assume v4 |
* Figure out which IP version we're dealing with. We'll assume v4 |
* and overlay a header structure to yank out the version. |
* and overlay a header structure to yank out the version. |
*/ |
*/ |
iph_p = (struct libnet_ipv4_hdr *)buf; | if (iph_p->ip_v == 6) |
if (iph_p && iph_p->ip_v == 6) | |
{ |
{ |
ip6h_p = (struct libnet_ipv6_hdr *)buf; | ip6h_p = (struct libnet_ipv6_hdr *)iph_p; |
is_ipv6 = 1; | iph_p = NULL; |
ip_hl = 40; |
ip_hl = 40; |
|
ip_nh = ip6h_p->ip_nh; |
|
|
|
if((uint8_t*)(ip6h_p+1) > end) |
|
{ |
|
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, |
|
"%s(): ipv6 hdr not inside packet", __func__); |
|
return -1; |
|
} |
|
|
|
/* FIXME this entire fragile exercise would be avoided if we just passed |
|
* in the pointer to the protocol block 'q' we are checksumming, which |
|
* we know. |
|
*/ |
|
while (ip_nh != protocol && (uint8_t*)ip6h_p + ip_hl + 1 < end) |
|
{ |
|
/* next header is not the upper layer protocol */ |
|
switch (ip_nh) |
|
{ |
|
case IPPROTO_DSTOPTS: |
|
case IPPROTO_HOPOPTS: |
|
case IPPROTO_ROUTING: |
|
case IPPROTO_FRAGMENT: |
|
case IPPROTO_AH: |
|
case IPPROTO_ESP: |
|
case IPPROTO_MH: |
|
/* |
|
* count option headers to the header length for |
|
* checksum processing |
|
*/ |
|
/* Common structure of ipv6 ext headers is: |
|
* uint8: next header protocol |
|
* uint8: length of this header, in multiples of 8, not |
|
* including first eight octets |
|
* The pointer arithmetic below follows from above. |
|
*/ |
|
ip_nh = *((uint8_t*)ip6h_p+ip_hl); /* next next header */ |
|
ip_hl += (*((uint8_t*)ip6h_p+ip_hl+1)+1)*8; /* ext header length */ |
|
break; |
|
default: |
|
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, |
|
"%s(): unsupported extension header (%d)", __func__, ip_nh); |
|
return -1; |
|
} |
|
|
|
} |
} |
} |
else |
else |
{ |
{ |
is_ipv6 = 0; |
|
ip_hl = iph_p->ip_hl << 2; |
ip_hl = iph_p->ip_hl << 2; |
} |
} |
|
|
|
if((iphdr+ip_hl) > end) |
|
{ |
|
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, |
|
"%s(): ip hdr len not inside packet", __func__); |
|
return -1; |
|
} |
|
|
/* |
/* |
* Dug Song came up with this very cool checksuming implementation |
* Dug Song came up with this very cool checksuming implementation |
* eliminating the need for explicit psuedoheader use. Check it out. |
* eliminating the need for explicit psuedoheader use. Check it out. |
*/ |
*/ |
switch (protocol) |
switch (protocol) |
{ |
{ |
/* |
|
* Style note: normally I don't advocate declaring variables inside |
|
* blocks of control, but it makes good sense here. -- MDS |
|
*/ |
|
case IPPROTO_TCP: |
case IPPROTO_TCP: |
{ |
{ |
struct libnet_tcp_hdr *tcph_p = |
struct libnet_tcp_hdr *tcph_p = |
(struct libnet_tcp_hdr *)(buf + ip_hl); | (struct libnet_tcp_hdr *)(iphdr + ip_hl); |
|
|
|
h_len = (int)(end - (uint8_t*) tcph_p); /* ignore h_len, sum the packet we've coalesced */ |
|
|
|
CHECK_IP_PAYLOAD_SIZE(); |
|
|
#if (STUPID_SOLARIS_CHECKSUM_BUG) |
#if (STUPID_SOLARIS_CHECKSUM_BUG) |
tcph_p->th_sum = tcph_p->th_off << 2; |
tcph_p->th_sum = tcph_p->th_off << 2; |
return (1); |
return (1); |
Line 162 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
Line 264 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
* the size of the TCP payload (only for raw sockets). |
* the size of the TCP payload (only for raw sockets). |
*/ |
*/ |
tcph_p->th_sum = (tcph_p->th_off << 2) + |
tcph_p->th_sum = (tcph_p->th_off << 2) + |
(len - (tcph_p->th_off << 2)); | (h_len - (tcph_p->th_off << 2)); |
return (1); |
return (1); |
} |
} |
#endif |
#endif |
|
/* TCP checksum is over the IP pseudo header: |
|
* ip src |
|
* ip dst |
|
* tcp protocol (IPPROTO_TCP) |
|
* tcp length, including the header |
|
* + the TCP header (with checksum set to zero) and data |
|
*/ |
tcph_p->th_sum = 0; |
tcph_p->th_sum = 0; |
if (is_ipv6) | if (ip6h_p) |
{ |
{ |
sum = libnet_in_cksum((u_int16_t *)&ip6h_p->ip_src, 32); | sum = libnet_in_cksum((uint16_t *)&ip6h_p->ip_src, 32); |
} |
} |
else |
else |
{ |
{ |
sum = libnet_in_cksum((u_int16_t *)&iph_p->ip_src, 8); | /* 8 = src and dst */ |
| sum = libnet_in_cksum((uint16_t *)&iph_p->ip_src, 8); |
} |
} |
sum += ntohs(IPPROTO_TCP + len); | sum += ntohs(IPPROTO_TCP + h_len); |
sum += libnet_in_cksum((u_int16_t *)tcph_p, len); | sum += libnet_in_cksum((uint16_t *)tcph_p, h_len); |
tcph_p->th_sum = LIBNET_CKSUM_CARRY(sum); |
tcph_p->th_sum = LIBNET_CKSUM_CARRY(sum); |
|
#if 0 |
|
printf("tcp sum calculated: %#x/%d h_len %d\n", |
|
ntohs(tcph_p->th_sum), |
|
ntohs(tcph_p->th_sum), |
|
h_len |
|
); |
|
#endif |
break; |
break; |
} |
} |
case IPPROTO_UDP: |
case IPPROTO_UDP: |
{ |
{ |
struct libnet_udp_hdr *udph_p = |
struct libnet_udp_hdr *udph_p = |
(struct libnet_udp_hdr *)(buf + ip_hl); | (struct libnet_udp_hdr *)(iphdr + ip_hl); |
| |
| h_len = (int)(end - (uint8_t*) udph_p); /* ignore h_len, sum the packet we've coalesced */ |
| |
| CHECK_IP_PAYLOAD_SIZE(); |
| |
udph_p->uh_sum = 0; |
udph_p->uh_sum = 0; |
if (is_ipv6) | if (ip6h_p) |
{ |
{ |
sum = libnet_in_cksum((u_int16_t *)&ip6h_p->ip_src, 32); | sum = libnet_in_cksum((uint16_t *)&ip6h_p->ip_src, 32); |
} |
} |
else |
else |
{ |
{ |
sum = libnet_in_cksum((u_int16_t *)&iph_p->ip_src, 8); | sum = libnet_in_cksum((uint16_t *)&iph_p->ip_src, 8); |
} |
} |
sum += ntohs(IPPROTO_UDP + len); | sum += ntohs(IPPROTO_UDP + h_len); |
sum += libnet_in_cksum((u_int16_t *)udph_p, len); | sum += libnet_in_cksum((uint16_t *)udph_p, h_len); |
udph_p->uh_sum = LIBNET_CKSUM_CARRY(sum); |
udph_p->uh_sum = LIBNET_CKSUM_CARRY(sum); |
break; |
break; |
} |
} |
case IPPROTO_ICMP: |
case IPPROTO_ICMP: |
{ |
{ |
struct libnet_icmpv4_hdr *icmph_p = |
struct libnet_icmpv4_hdr *icmph_p = |
(struct libnet_icmpv4_hdr *)(buf + ip_hl); | (struct libnet_icmpv4_hdr *)(iphdr + ip_hl); |
|
|
|
h_len = (int)(end - (uint8_t*) icmph_p); /* ignore h_len, sum the packet we've coalesced */ |
|
|
|
CHECK_IP_PAYLOAD_SIZE(); |
|
|
icmph_p->icmp_sum = 0; |
icmph_p->icmp_sum = 0; |
if (is_ipv6) | /* Hm, is this valid? Is the checksum algorithm for ICMPv6 encapsulated in IPv4 |
| * actually defined? |
| */ |
| if (ip6h_p) |
{ |
{ |
sum = libnet_in_cksum((u_int16_t *)&ip6h_p->ip_src, 32); | sum = libnet_in_cksum((uint16_t *)&ip6h_p->ip_src, 32); |
sum += ntohs(IPPROTO_ICMP6 + len); | sum += ntohs(IPPROTO_ICMP6 + h_len); |
} |
} |
sum += libnet_in_cksum((u_int16_t *)icmph_p, len); | sum += libnet_in_cksum((uint16_t *)icmph_p, h_len); |
icmph_p->icmp_sum = LIBNET_CKSUM_CARRY(sum); |
icmph_p->icmp_sum = LIBNET_CKSUM_CARRY(sum); |
break; |
break; |
} |
} |
|
case IPPROTO_ICMPV6: |
|
{ |
|
struct libnet_icmpv6_hdr *icmph_p = |
|
(struct libnet_icmpv6_hdr *)(iphdr + ip_hl); |
|
|
|
h_len = (int)(end - (uint8_t*) icmph_p); /* ignore h_len, sum the packet we've coalesced */ |
|
|
|
CHECK_IP_PAYLOAD_SIZE(); |
|
|
|
icmph_p->icmp_sum = 0; |
|
if (ip6h_p) |
|
{ |
|
sum = libnet_in_cksum((uint16_t *)&ip6h_p->ip_src, 32); |
|
sum += ntohs(IPPROTO_ICMP6 + h_len); |
|
} |
|
sum += libnet_in_cksum((uint16_t *)icmph_p, h_len); |
|
icmph_p->icmp_sum = LIBNET_CKSUM_CARRY(sum); |
|
break; |
|
} |
case IPPROTO_IGMP: |
case IPPROTO_IGMP: |
{ |
{ |
struct libnet_igmp_hdr *igmph_p = |
struct libnet_igmp_hdr *igmph_p = |
(struct libnet_igmp_hdr *)(buf + ip_hl); | (struct libnet_igmp_hdr *)(iphdr + ip_hl); |
|
|
|
h_len = (int)(end - (uint8_t*) igmph_p); /* ignore h_len, sum the packet we've coalesced */ |
|
|
|
CHECK_IP_PAYLOAD_SIZE(); |
|
|
igmph_p->igmp_sum = 0; |
igmph_p->igmp_sum = 0; |
sum = libnet_in_cksum((u_int16_t *)igmph_p, len); | sum = libnet_in_cksum((uint16_t *)igmph_p, h_len); |
igmph_p->igmp_sum = LIBNET_CKSUM_CARRY(sum); |
igmph_p->igmp_sum = LIBNET_CKSUM_CARRY(sum); |
break; |
break; |
} |
} |
Line 229 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
Line 381 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
* in the multiple RFC version of the protocol ... ouf !!! |
* in the multiple RFC version of the protocol ... ouf !!! |
*/ |
*/ |
struct libnet_gre_hdr *greh_p = |
struct libnet_gre_hdr *greh_p = |
(struct libnet_gre_hdr *)(buf + ip_hl); | (struct libnet_gre_hdr *)(iphdr + ip_hl); |
u_int16_t fv = ntohs(greh_p->flags_ver); | uint16_t fv = ntohs(greh_p->flags_ver); |
| |
| CHECK_IP_PAYLOAD_SIZE(); |
| |
if (!(fv & (GRE_CSUM|GRE_ROUTING | GRE_VERSION_0)) || |
if (!(fv & (GRE_CSUM|GRE_ROUTING | GRE_VERSION_0)) || |
!(fv & (GRE_CSUM|GRE_VERSION_1))) |
!(fv & (GRE_CSUM|GRE_VERSION_1))) |
{ |
{ |
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, |
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, |
"%s(): can't compute GRE checksum (wrong flags_ver bits: 0x%x )\n", __func__, fv); | "%s(): can't compute GRE checksum (wrong flags_ver bits: 0x%x )", __func__, fv); |
return (-1); |
return (-1); |
} |
} |
sum = libnet_in_cksum((u_int16_t *)greh_p, len); | sum = libnet_in_cksum((uint16_t *)greh_p, h_len); |
greh_p->gre_sum = LIBNET_CKSUM_CARRY(sum); |
greh_p->gre_sum = LIBNET_CKSUM_CARRY(sum); |
break; |
break; |
} |
} |
case IPPROTO_OSPF: |
case IPPROTO_OSPF: |
{ |
{ |
struct libnet_ospf_hdr *oh_p = |
struct libnet_ospf_hdr *oh_p = |
(struct libnet_ospf_hdr *)(buf + ip_hl); | (struct libnet_ospf_hdr *)(iphdr + ip_hl); |
|
|
|
CHECK_IP_PAYLOAD_SIZE(); |
|
|
oh_p->ospf_sum = 0; |
oh_p->ospf_sum = 0; |
sum += libnet_in_cksum((u_int16_t *)oh_p, len); | sum += libnet_in_cksum((uint16_t *)oh_p, h_len); |
oh_p->ospf_sum = LIBNET_CKSUM_CARRY(sum); |
oh_p->ospf_sum = LIBNET_CKSUM_CARRY(sum); |
break; |
break; |
} |
} |
case IPPROTO_OSPF_LSA: |
case IPPROTO_OSPF_LSA: |
{ |
{ |
struct libnet_ospf_hdr *oh_p = |
struct libnet_ospf_hdr *oh_p = |
(struct libnet_ospf_hdr *)(buf + ip_hl); | (struct libnet_ospf_hdr *)(iphdr + ip_hl); |
struct libnet_lsa_hdr *lsa_p = |
struct libnet_lsa_hdr *lsa_p = |
(struct libnet_lsa_hdr *)(buf + | (struct libnet_lsa_hdr *)(iphdr + |
ip_hl + oh_p->ospf_len); |
ip_hl + oh_p->ospf_len); |
|
|
|
/* FIXME need additional length check, to account for ospf_len */ |
lsa_p->lsa_sum = 0; |
lsa_p->lsa_sum = 0; |
sum += libnet_in_cksum((u_int16_t *)lsa_p, len); | sum += libnet_in_cksum((uint16_t *)lsa_p, h_len); |
lsa_p->lsa_sum = LIBNET_CKSUM_CARRY(sum); |
lsa_p->lsa_sum = LIBNET_CKSUM_CARRY(sum); |
break; |
break; |
#if 0 |
#if 0 |
Line 270 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
Line 428 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
*/ |
*/ |
int c0, c1; |
int c0, c1; |
struct libnet_lsa_hdr *lsa_p = (struct libnet_lsa_hdr *)buf; |
struct libnet_lsa_hdr *lsa_p = (struct libnet_lsa_hdr *)buf; |
u_int8_t *p, *p1, *p2, *p3; | uint8_t *p, *p1, *p2, *p3; |
|
|
c0 = 0; |
c0 = 0; |
c1 = 0; |
c1 = 0; |
Line 319 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
Line 477 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
} |
} |
case IPPROTO_IP: |
case IPPROTO_IP: |
{ |
{ |
iph_p->ip_sum = 0; | if(!iph_p) { |
sum = libnet_in_cksum((u_int16_t *)iph_p, ip_hl); | /* IPv6 doesn't have a checksum */ |
iph_p->ip_sum = LIBNET_CKSUM_CARRY(sum); | } else { |
| iph_p->ip_sum = 0; |
| sum = libnet_in_cksum((uint16_t *)iph_p, ip_hl); |
| iph_p->ip_sum = LIBNET_CKSUM_CARRY(sum); |
| } |
break; |
break; |
} |
} |
case IPPROTO_VRRP: |
case IPPROTO_VRRP: |
{ |
{ |
struct libnet_vrrp_hdr *vrrph_p = |
struct libnet_vrrp_hdr *vrrph_p = |
(struct libnet_vrrp_hdr *)(buf + ip_hl); | (struct libnet_vrrp_hdr *)(iphdr + ip_hl); |
| CHECK_IP_PAYLOAD_SIZE(); |
|
|
vrrph_p->vrrp_sum = 0; |
vrrph_p->vrrp_sum = 0; |
sum = libnet_in_cksum((u_int16_t *)vrrph_p, len); | sum = libnet_in_cksum((uint16_t *)vrrph_p, h_len); |
vrrph_p->vrrp_sum = LIBNET_CKSUM_CARRY(sum); |
vrrph_p->vrrp_sum = LIBNET_CKSUM_CARRY(sum); |
break; |
break; |
} |
} |
case LIBNET_PROTO_CDP: |
case LIBNET_PROTO_CDP: |
{ /* XXX - Broken: how can we easily get the entire packet size? */ |
{ /* XXX - Broken: how can we easily get the entire packet size? */ |
|
/* FIXME you can't, checksumming non-IP protocols was not supported by libnet */ |
struct libnet_cdp_hdr *cdph_p = |
struct libnet_cdp_hdr *cdph_p = |
(struct libnet_cdp_hdr *)buf; | (struct libnet_cdp_hdr *)iphdr; |
|
|
|
if((iphdr+h_len) > end) |
|
{ |
|
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, |
|
"%s(): cdp payload not inside packet", __func__); |
|
return -1; |
|
} |
|
|
cdph_p->cdp_sum = 0; |
cdph_p->cdp_sum = 0; |
sum = libnet_in_cksum((u_int16_t *)cdph_p, len); | sum = libnet_in_cksum((uint16_t *)cdph_p, h_len); |
cdph_p->cdp_sum = LIBNET_CKSUM_CARRY(sum); |
cdph_p->cdp_sum = LIBNET_CKSUM_CARRY(sum); |
break; |
break; |
} |
} |
case LIBNET_PROTO_ISL: |
case LIBNET_PROTO_ISL: |
{ |
{ |
// struct libnet_isl_hdr *islh_p = | #if 0 |
// (struct libnet_isl_hdr *)buf; | struct libnet_isl_hdr *islh_p = |
| (struct libnet_isl_hdr *)buf; |
| #endif |
/* |
/* |
* Need to compute 4 byte CRC for the ethernet frame and for |
* Need to compute 4 byte CRC for the ethernet frame and for |
* the ISL frame itself. Use the libnet_crc function. |
* the ISL frame itself. Use the libnet_crc function. |
Line 356 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
Line 529 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
default: |
default: |
{ |
{ |
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, |
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE, |
"%s(): unsuported protocol %d\n", __func__, protocol); | "%s(): unsupported protocol %d", __func__, protocol); |
return (-1); |
return (-1); |
} |
} |
} |
} |
Line 364 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
Line 537 libnet_do_checksum(libnet_t *l, u_int8_t *buf, int pro
|
} |
} |
|
|
|
|
u_int16_t | uint16_t |
libnet_ip_check(u_int16_t *addr, int len) | libnet_ip_check(uint16_t *addr, int len) |
{ |
{ |
int sum; |
int sum; |
|
|
Line 373 libnet_ip_check(u_int16_t *addr, int len)
|
Line 546 libnet_ip_check(u_int16_t *addr, int len)
|
return (LIBNET_CKSUM_CARRY(sum)); |
return (LIBNET_CKSUM_CARRY(sum)); |
} |
} |
|
|
/* EOF */ | /** |
| * Local Variables: |
| * indent-tabs-mode: nil |
| * c-file-style: "stroustrup" |
| * End: |
| */ |