Exemple #1
0
static int
prepare_pkt_hdr_pcap(struct rtpp_session *sp, struct rtp_packet *packet, struct pkt_hdr_pcap *hdrp)
{

    if (packet->rtime == -1) {
	rtpp_log_ewrite(RTPP_LOG_ERR, sp->log, "can't get current time");
	return -1;
    }

    if (sstosa(&packet->raddr)->sa_family != AF_INET) {
	rtpp_log_ewrite(RTPP_LOG_ERR, sp->log, "only AF_INET pcap format is supported");
	return -1;
    }

    memset(hdrp, 0, sizeof(*hdrp));
    dtime2ts(packet->rtime, &(hdrp->pcaprec_hdr.ts_sec), &(hdrp->pcaprec_hdr.ts_usec));
    hdrp->pcaprec_hdr.orig_len = hdrp->pcaprec_hdr.incl_len = sizeof(*hdrp) -
      sizeof(hdrp->pcaprec_hdr) + packet->size;

    hdrp->family = sstosa(&packet->raddr)->sa_family;

    /* Prepare fake IP header */
    hdrp->iphdr.ip_v = 4;
    hdrp->iphdr.ip_hl = sizeof(hdrp->iphdr) >> 2;
    hdrp->iphdr.ip_len = htons(sizeof(hdrp->iphdr) + sizeof(hdrp->udphdr) + packet->size);
    hdrp->iphdr.ip_src = satosin(&(packet->raddr))->sin_addr;
    hdrp->iphdr.ip_dst = satosin(packet->laddr)->sin_addr;
    hdrp->iphdr.ip_p = IPPROTO_UDP;
    hdrp->iphdr.ip_id = htons(ip_id++);
    hdrp->iphdr.ip_ttl = 127;
    hdrp->iphdr.ip_sum = rtpp_in_cksum(&(hdrp->iphdr), sizeof(hdrp->iphdr));

    /* Prepare fake UDP header */
    hdrp->udphdr.uh_sport = satosin(&packet->raddr)->sin_port;
    hdrp->udphdr.uh_dport = htons(packet->rport);
    hdrp->udphdr.uh_ulen = htons(sizeof(hdrp->udphdr) + packet->size);

    return 0;
}
Exemple #2
0
static int
prepare_pkt_hdr_pcap(struct rtpp_session *sp, struct rtp_packet *packet,
  union pkt_hdr_pcap *hdrp, struct sockaddr *daddr, struct sockaddr *ldaddr,
  int ldport, int face)
{
    struct sockaddr *src_addr, *dst_addr;
    uint16_t src_port, dst_port;
    pcaprec_hdr_t *pcaprec_hdr;
    struct udpip *udpip;
    int pcap_size;

    if (packet->rtime == -1) {
	rtpp_log_ewrite(RTPP_LOG_ERR, sp->log, "can't get current time");
	return -1;
    }

    if (face == 0) {
        src_addr = sstosa(&(packet->raddr));
        src_port = satosin(src_addr)->sin_port;
        dst_addr = packet->laddr;
        dst_port = htons(packet->rport);
    } else {
        src_addr = ldaddr;
        src_port = htons(ldport);
        dst_addr = daddr;
        dst_port = satosin(dst_addr)->sin_port;
    }

    if (sstosa(src_addr)->sa_family != AF_INET) {
	rtpp_log_ewrite(RTPP_LOG_ERR, sp->log, "only AF_INET pcap format is supported");
	return -1;
    }

    memset(hdrp, 0, sizeof(*hdrp));

#if (PCAP_FORMAT == DLT_NULL)
    hdrp->null.family = sstosa(src_addr)->sa_family;
    pcaprec_hdr = &(hdrp->null.pcaprec_hdr);
    udpip = &(hdrp->null.udpip);
    pcap_size = sizeof(hdrp->null);
#else
    /* Prepare fake ethernet header */
    hdrp->en10t.ether_type = htons(0x800);
    memcpy(hdrp->en10t.ether_dhost + 2, &(satosin(dst_addr)->sin_addr), 4);
    memcpy(hdrp->en10t.ether_shost + 2, &(satosin(src_addr)->sin_addr), 4);
    pcaprec_hdr = &(hdrp->en10t.pcaprec_hdr);
    udpip = &(hdrp->en10t.udpip);
    pcap_size = sizeof(hdrp->en10t);
#endif

    dtime2ts(packet->rtime, &(pcaprec_hdr->ts_sec), &(pcaprec_hdr->ts_usec));
    pcaprec_hdr->orig_len = pcaprec_hdr->incl_len = pcap_size -
      sizeof(*pcaprec_hdr) + packet->size;

    /* Prepare fake IP header */
    udpip->iphdr.ip_v = 4;
    udpip->iphdr.ip_hl = sizeof(udpip->iphdr) >> 2;
    udpip->iphdr.ip_len = htons(sizeof(udpip->iphdr) + sizeof(udpip->udphdr) + packet->size);
    udpip->iphdr.ip_src = satosin(src_addr)->sin_addr;
    udpip->iphdr.ip_dst = satosin(dst_addr)->sin_addr;
    udpip->iphdr.ip_p = IPPROTO_UDP;
    udpip->iphdr.ip_id = htons(ip_id++);
    udpip->iphdr.ip_ttl = 127;
    udpip->iphdr.ip_sum = rtpp_in_cksum(&(udpip->iphdr), sizeof(udpip->iphdr));

    /* Prepare fake UDP header */
    udpip->udphdr.uh_sport = src_port;
    udpip->udphdr.uh_dport = dst_port;
    udpip->udphdr.uh_ulen = htons(sizeof(udpip->udphdr) + packet->size);

    return 0;
}