示例#1
0
文件: arp.c 项目: fallen/witm
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");
*/
}
示例#2
0
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);
    }

}
示例#3
0
文件: arpd.c 项目: MagicalTux/farpd
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");
}
示例#4
0
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);
    }
}