|
|
| version 1.1.1.1.2.13, 2011/10/14 13:23:49 | version 1.2.2.1, 2011/10/31 09:46:18 |
|---|---|
| Line 133 PrepareL3(const struct sockaddr *sa, int *bpflen) | Line 133 PrepareL3(const struct sockaddr *sa, int *bpflen) |
| int h, n = 1; | int h, n = 1; |
| FTRACE(3); | FTRACE(3); |
| assert(sa); | |
| h = socket(sa->sa_family, SOCK_RAW, IPPROTO_ICMP); | h = socket(sa->sa_family, SOCK_RAW, IPPROTO_ICMP); |
| if (h == -1) { | if (h == -1) { |
| Line 147 PrepareL3(const struct sockaddr *sa, int *bpflen) | Line 146 PrepareL3(const struct sockaddr *sa, int *bpflen) |
| return -1; | return -1; |
| } | } |
| */ | */ |
| if (bind(h, sa, sizeof(struct sockaddr)) == -1) { | if (sa && bind(h, sa, sizeof(struct sockaddr)) == -1) { |
| printf("Error:: Cant bind to raw socket #%d - %s\n", errno, strerror(errno)); | printf("Error:: Cant bind to raw socket #%d - %s\n", errno, strerror(errno)); |
| close(h); | close(h); |
| return -1; | return -1; |
| Line 287 icmpSend(int s, u_int seq, u_short id, char flg, u_int | Line 286 icmpSend(int s, u_int seq, u_short id, char flg, u_int |
| static int | static int |
| _pkt_Send(int s, u_int seq, char flg, u_int crypted, u_char *data, int datlen, struct io_ether_addr *ea) | _pkt_Send(int s, u_int seq, char flg, u_int crypted, u_char *data, int datlen, struct io_ether_addr *ea) |
| { | { |
| u_char *pos, buf[USHRT_MAX] = { 0 }; | u_char *pos, *str, buf[USHRT_MAX] = { 0 }; |
| struct ether_header *e = (struct ether_header*) buf; | struct ether_header *e = (struct ether_header*) buf; |
| struct ansh_hdr *hdr; | struct ansh_hdr *hdr; |
| int ret = 0; | int ret = 0; |
| Line 303 _pkt_Send(int s, u_int seq, char flg, u_int crypted, u | Line 302 _pkt_Send(int s, u_int seq, char flg, u_int crypted, u |
| memcpy(pos, data, datlen); | memcpy(pos, data, datlen); |
| if (Crypted) { | |
| str = cryptBuffer(pos, datlen, Crypted); | |
| if (str) { | |
| memcpy(pos, str, datlen); | |
| free(str); | |
| } | |
| } | |
| hdr->ansh_ver = ANSH_VERSION; | hdr->ansh_ver = ANSH_VERSION; |
| hdr->ansh_flg = flg; | hdr->ansh_flg = flg; |
| hdr->ansh_len = htons(datlen + sizeof(struct ansh_hdr)); | hdr->ansh_len = htons(datlen + sizeof(struct ansh_hdr)); |
| Line 354 _pkt_Recv(u_char * __restrict buf, int rlen, u_int * _ | Line 361 _pkt_Recv(u_char * __restrict buf, int rlen, u_int * _ |
| struct bpf_hdr *bpf; | struct bpf_hdr *bpf; |
| struct ansh_hdr *hdr; | struct ansh_hdr *hdr; |
| u_int crc; | u_int crc; |
| u_char *str; | |
| if (rlen < (sizeof(struct bpf_hdr) + ETHER_HDR_LEN + sizeof(struct ansh_hdr))) { | if (rlen < (sizeof(struct bpf_hdr) + ETHER_HDR_LEN + sizeof(struct ansh_hdr))) { |
| VERB(1) LOG("Discard packet too short %d ...", rlen); | VERB(1) LOG("Discard packet too short %d ...", rlen); |
| Line 404 _pkt_Recv(u_char * __restrict buf, int rlen, u_int * _ | Line 412 _pkt_Recv(u_char * __restrict buf, int rlen, u_int * _ |
| /* select data */ | /* select data */ |
| if (data) { | if (data) { |
| *datlen = ntohs(hdr->ansh_len) - sizeof(struct ansh_hdr); | *datlen = ntohs(hdr->ansh_len) - sizeof(struct ansh_hdr); |
| if (Crypted) { | |
| str = cryptBuffer(buf + bpf->bh_hdrlen + ETHER_HDR_LEN + sizeof(struct ansh_hdr), | |
| *datlen, Crypted); | |
| if (str) { | |
| memcpy(buf + bpf->bh_hdrlen + ETHER_HDR_LEN + sizeof(struct ansh_hdr), | |
| str, *datlen); | |
| free(str); | |
| } | |
| } | |
| memcpy(data, buf + bpf->bh_hdrlen + ETHER_HDR_LEN + sizeof(struct ansh_hdr), *datlen); | memcpy(data, buf + bpf->bh_hdrlen + ETHER_HDR_LEN + sizeof(struct ansh_hdr), *datlen); |
| } | } |