void arp_request(eth_addr_t to, eth_addr_t from, eth_addr_t sha, ip_addr_t spa, eth_addr_t tha, ip_addr_t tpa) { int ret; //int i; struct arp_packet packet; //uint32_t spa2, tpa2; //spa2 = *(uint32_t *)spa; //tpa2 = *(uint32_t *)tpa; eth_pack_hdr(&packet, to, from, ETH_TYPE_ARP); arp_pack_hdr_ethip((uint8_t *)&packet + sizeof(struct eth_hdr), ARP_OP_REQUEST, sha, spa, tha, tpa); ret = pcap_sendpacket(handle, (u_char *)&packet, sizeof(struct arp_packet)); if (ret < 0) { printf("ERROR : failed to forward packet\n"); exit(1); } // printf("On envoie un paquet arp request : \n"); /* for (i = 0 ; i < sizeof(struct arp_packet) ; i++) printf("0x%02hhX ", *((uint8_t *)&packet + i)); printf("\n"); */ }
static void fragroute_process(const struct pcap_pkthdr *hdr, void *buf, size_t len, void *arg) { struct pktq pktq; struct pkt *pkt, *next; if ((pkt = pkt_new()) == NULL) { warn("pkt_new"); return; } if (ETH_HDR_LEN + len > PKT_BUF_LEN) { warn("dropping oversized packet"); return; } memcpy(pkt->pkt_data + ETH_HDR_LEN, buf, len); pkt->pkt_end = pkt->pkt_data + ETH_HDR_LEN + len; pkt_decorate(pkt); if (pkt->pkt_ip == NULL) { warn("dropping non-IP packet"); return; } eth_pack_hdr(pkt->pkt_eth, ctx.dmac.addr_eth, ctx.smac.addr_eth, ETH_TYPE_IP); pkt->pkt_ip->ip_src = ctx.src.addr_ip; ip_checksum(pkt->pkt_ip, len); /* Forward this packet along as is. */ if(ctx.dfile && eth_send(ctx.eth, pkt->pkt_data, pkt->pkt_end - pkt->pkt_data) < 0) warn("eth_send"); TAILQ_INIT(&pktq); TAILQ_INSERT_TAIL(&pktq, pkt, pkt_next); mod_apply(&pktq); for (pkt = TAILQ_FIRST(&pktq); pkt != TAILQ_END(&pktq); pkt = next) { next = TAILQ_NEXT(pkt, pkt_next); _resend_outgoing(pkt); } }
static void arpd_send(eth_t *eth, int op, struct addr *sha, struct addr *spa, struct addr *tha, struct addr *tpa) { u_char pkt[ETH_HDR_LEN + ARP_HDR_LEN + ARP_ETHIP_LEN]; eth_pack_hdr(pkt, tha->addr_eth, sha->addr_eth, ETH_TYPE_ARP); arp_pack_hdr_ethip(pkt + ETH_HDR_LEN, op, sha->addr_eth, spa->addr_ip, tha->addr_eth, tpa->addr_ip); if (op == ARP_OP_REQUEST) { syslog(LOG_DEBUG, "%s: who-has %s tell %s", __func__, addr_ntoa(tpa), addr_ntoa(spa)); } else if (op == ARP_OP_REPLY) { syslog(LOG_INFO, "arp reply %s is-at %s", addr_ntoa(spa), addr_ntoa(sha)); } if (eth_send(eth, pkt, sizeof(pkt)) != sizeof(pkt)) syslog(LOG_ERR, "couldn't send packet: %m"); }
static void _resend_outgoing(struct pkt *pkt) { if (timerisset(&pkt->pkt_ts)) { timeout_set(&pkt->pkt_ev, _timed_outgoing, pkt); timeout_add(&pkt->pkt_ev, &pkt->pkt_ts); } else { eth_pack_hdr(pkt->pkt_eth, ctx.dmac.addr_eth, ctx.smac.addr_eth, ETH_TYPE_IP); if(ctx.dfile) { struct pcap_pkthdr pkthdr; gettimeofday(&pkthdr.ts, NULL); pkthdr.caplen = pkthdr.len = pkt->pkt_end - pkt->pkt_data; pcap_dump((u_char*)ctx.dfile, &pkthdr, pkt->pkt_data); pcap_dump_flush(ctx.dfile); } else if (eth_send(ctx.eth, pkt->pkt_data, pkt->pkt_end - pkt->pkt_data) < 0) warn("eth_send"); pkt_free(pkt); } }