int
mkInterestCompute(char **namecomp, char *computation, int computationlen, char *out)
{
#ifndef USE_UTIL
    DEBUGMSG(TRACE, "mkInterestCompute()\n");
#endif
    int len = 0, k, i;
    unsigned char *cp;

    len += mkHeader(out, CCN_DTAG_INTEREST, CCN_TT_DTAG);   // interest
    len += mkHeader(out+len, CCN_DTAG_NAME, CCN_TT_DTAG);  // name
    while (*namecomp) {
    len += mkHeader(out+len, CCN_DTAG_COMPONENT, CCN_TT_DTAG);  // comp
    cp = (unsigned char*) strdup(*namecomp);
    k = k = strlen(*namecomp);
    len += mkHeader(out+len, k, CCN_TT_BLOB);
    memcpy(out+len, cp, k);
    len += k;
    out[len++] = 0; // end-of-component
    free(cp);
    namecomp++;
    }
    len += mkBlob(out+len, CCN_DTAG_COMPONENT, CCN_TT_DTAG, computation, computationlen);
    len += mkStrBlob(out+len, CCN_DTAG_COMPONENT, CCN_TT_DTAG, "NFN");
    out[len++] = 0; // end-of-name
    out[len++] = 0; // end-of-interest

    return len;
}
Exemplo n.º 2
0
int
mkContent(char **namecomp,
	  unsigned char *publisher, int plen,
	  unsigned char *body, int blen,
	  unsigned char *out)
{
    int len = 0, k;

    len = mkHeader(out, CCN_DTAG_CONTENTOBJ, CCN_TT_DTAG);   // interest

    // add signature
#ifdef USE_SIGNATURES
    if(private_key_path)
        len += add_signature(out+len, private_key_path, body, blen);  
#endif
    len += mkHeader(out+len, CCN_DTAG_NAME, CCN_TT_DTAG);  // name
    while (*namecomp) {
	len += mkHeader(out+len, CCN_DTAG_COMPONENT, CCN_TT_DTAG);  // comp
	k = unescape_component((unsigned char*) *namecomp);
	len += mkHeader(out+len, k, CCN_TT_BLOB);
	memcpy(out+len, *namecomp++, k);
	len += k;
	out[len++] = 0; // end-of-component
    }
    out[len++] = 0; // end-of-name

    if (publisher) {
	struct timeval t;
	unsigned char tstamp[6];
	uint32_t *sec;
	uint16_t *secfrac;

	gettimeofday(&t, NULL);
	sec = (uint32_t*)(tstamp + 0); // big endian
	*sec = htonl(t.tv_sec);
	secfrac = (uint16_t*)(tstamp + 4);
	*secfrac = htons(4048L * t.tv_usec / 1000000);
	len += mkHeader(out+len, CCN_DTAG_TIMESTAMP, CCN_TT_DTAG);
	len += mkHeader(out+len, sizeof(tstamp), CCN_TT_BLOB);
	memcpy(out+len, tstamp, sizeof(tstamp));
	len += sizeof(tstamp);
	out[len++] = 0; // end-of-timestamp

	len += mkHeader(out+len, CCN_DTAG_SIGNEDINFO, CCN_TT_DTAG);
	len += mkHeader(out+len, CCN_DTAG_PUBPUBKDIGEST, CCN_TT_DTAG);
	len += mkHeader(out+len, plen, CCN_TT_BLOB);
	memcpy(out+len, publisher, plen);
	len += plen;
	out[len++] = 0; // end-of-publisher
	out[len++] = 0; // end-of-signedinfo
    }

    len += mkHeader(out+len, CCN_DTAG_CONTENT, CCN_TT_DTAG);
    len += mkHeader(out+len, blen, CCN_TT_BLOB);
    memcpy(out + len, body, blen);
    len += blen;
    out[len++] = 0; // end-of-content

    out[len++] = 0; // end-of-contentobj

    return len;
}
Exemplo n.º 3
0
int ccnl_frag_getfragcount(struct ccnl_frag_s *e, int origlen, int *totallen)
{
    int cnt = 0, len = 0;
    unsigned char dummy[256];
    int hdrlen, blobtaglen, datalen;
    int offs = 0;

    if (!e) {
        cnt = 1;
    }
    else if (e && e->protocol == CCNL_FRAG_SEQUENCED2012) {
        while (offs < origlen) { /* we could do better than to simulate this: */
            hdrlen = mkHeader(dummy, CCNL_DTAG_FRAGMENT2012, CCN_TT_DTAG);
            hdrlen += mkBinaryInt(dummy, CCNL_DTAG_FRAG_FLAGS, CCN_TT_DTAG, 0,
                                  e->flagwidth);
            hdrlen += mkBinaryInt(dummy, CCNL_DTAG_FRAG_SEQNR, CCN_TT_DTAG, 0,
                                  e->sendseqwidth);
            hdrlen += mkBinaryInt(dummy, CCNL_DTAG_FRAG_OLOSS, CCN_TT_DTAG, 0,
                                  e->losscountwidth);
            hdrlen += mkBinaryInt(dummy, CCNL_DTAG_FRAG_YSEQN, CCN_TT_DTAG, 0,
                                  e->recvseqwidth);

            hdrlen += mkHeader(dummy, CCN_DTAG_CONTENT, CCN_TT_DTAG);
            blobtaglen = mkHeader(dummy, e->mtu - hdrlen - 1, CCN_TT_BLOB);
            datalen = e->mtu - hdrlen - blobtaglen - 1;

            if (datalen > (origlen - offs)) {
                datalen = origlen - offs;
            }

            hdrlen += mkHeader(dummy, datalen, CCN_TT_BLOB);
            len += hdrlen + datalen + 1;
            offs += datalen;
            cnt++;
        }
    }
    else if (e && e->protocol == CCNL_FRAG_CCNx2013) {
        while (offs < origlen) { /* we could do better than to simulate this: */
            hdrlen = mkHeader(dummy, CCNL_DTAG_FRAGMENT, CCN_TT_DTAG);
            hdrlen += mkHeader(dummy, CCNL_DTAG_FRAG_TYPE, CCN_TT_DTAG);
            hdrlen += 4; /* three BLOB bytes plus end-of-entry */
            hdrlen += mkBinaryInt(dummy, CCNL_DTAG_FRAG_SEQNR, CCN_TT_DTAG, 0,
                                  e->sendseqwidth);
            hdrlen += mkBinaryInt(dummy, CCNL_DTAG_FRAG_FLAGS, CCN_TT_DTAG, 0,
                                  e->flagwidth);
            hdrlen += mkBinaryInt(dummy, CCNL_DTAG_FRAG_OLOSS, CCN_TT_DTAG, 0,
                                  e->losscountwidth);
            hdrlen += mkBinaryInt(dummy, CCNL_DTAG_FRAG_YSEQN, CCN_TT_DTAG, 0,
                                  e->recvseqwidth);

            hdrlen += mkHeader(dummy, CCN_DTAG_CONTENT, CCN_TT_DTAG);
            blobtaglen = mkHeader(dummy, e->mtu - hdrlen - 1, CCN_TT_BLOB);
            datalen = e->mtu - hdrlen - blobtaglen - 1;

            if (datalen > (origlen - offs)) {
                datalen = origlen - offs;
            }

            hdrlen += mkHeader(dummy, datalen, CCN_TT_BLOB);
            len += hdrlen + datalen + 1;
            offs += datalen;
            cnt++;
        }
    }

    if (totallen) {
        *totallen = len;
    }

    return cnt;
}
Exemplo n.º 4
0
struct ccnl_buf_s *
ccnl_frag_getnextCCNx2013(struct ccnl_frag_s *fr, int *ifndx, sockunion *su)
{
    struct ccnl_buf_s *buf = 0;
    unsigned char header[256];
    int hdrlen, blobtaglen, flagoffs;
    unsigned int datalen;

    /* switch among encodings of fragments here (ccnb, TLV, etc) */

    hdrlen = mkHeader(header, CCNL_DTAG_FRAGMENT, CCN_TT_DTAG); /* fragment */

    hdrlen += mkHeader(header + hdrlen, CCNL_DTAG_FRAG_TYPE, CCN_TT_DTAG);
    hdrlen += mkHeader(header + hdrlen, 3, CCN_TT_BLOB);
    memcpy(header + hdrlen, CCNL_FRAG_TYPE_CCNx2013_VAL, 3); /* "FHBH" */
    header[hdrlen + 3] = '\0';
    hdrlen += 4;

    hdrlen += mkBinaryInt(header + hdrlen, CCNL_DTAG_FRAG_SEQNR, CCN_TT_DTAG,
                          fr->sendseq, fr->sendseqwidth);

    hdrlen += mkBinaryInt(header + hdrlen, CCNL_DTAG_FRAG_FLAGS, CCN_TT_DTAG, 0,
                          fr->flagwidth);
    flagoffs = hdrlen - 2; /* most significant byte of flag element */

    /* other optional fields would go here */

    hdrlen += mkHeader(header + hdrlen, CCN_DTAG_CONTENT, CCN_TT_DTAG);

    blobtaglen = mkHeader(header + hdrlen, fr->mtu - hdrlen - 2, CCN_TT_BLOB);
    datalen = fr->mtu - hdrlen - blobtaglen - 2;

    if (datalen > (fr->bigpkt->datalen - fr->sendoffs)) {
        datalen = fr->bigpkt->datalen - fr->sendoffs;
    }

    hdrlen += mkHeader(header + hdrlen, datalen, CCN_TT_BLOB);

    buf = ccnl_buf_new(NULL, hdrlen + datalen + 2);

    if (!buf) {
        return NULL;
    }

    memcpy(buf->data, header, hdrlen);
    memcpy(buf->data + hdrlen, fr->bigpkt->data + fr->sendoffs, datalen);
    buf->data[hdrlen + datalen] = '\0'; /* end of content field */
    buf->data[hdrlen + datalen + 1] = '\0'; /* end of fragment */

    /* patch flag field: */
    if (datalen >= fr->bigpkt->datalen) { /* single */
        buf->data[flagoffs] = CCNL_DTAG_FRAG_FLAG_SINGLE;
        ccnl_free(fr->bigpkt);
        fr->bigpkt = NULL;
    }
    else if (fr->sendoffs == 0) { /* start */
        buf->data[flagoffs] = CCNL_DTAG_FRAG_FLAG_FIRST;
    }
    else if (datalen >= (fr->bigpkt->datalen - fr->sendoffs)) { /* end */
        buf->data[flagoffs] = CCNL_DTAG_FRAG_FLAG_LAST;
        ccnl_free(fr->bigpkt);
        fr->bigpkt = NULL;
    }
    else {
        buf->data[flagoffs] = CCNL_DTAG_FRAG_FLAG_MID;
    }

    fr->sendoffs += datalen;
    fr->sendseq++;

    if (ifndx) {
        *ifndx = fr->ifndx;
    }

    if (su) {
        memcpy(su, &fr->dest, sizeof(*su));
    }

    return buf;
}
Exemplo n.º 5
0
struct ccnl_buf_s *
ccnl_frag_getnextSEQD2012(struct ccnl_frag_s *e, int *ifndx, sockunion *su)
{
    struct ccnl_buf_s *buf = 0;
    unsigned char header[256];
    int hdrlen = 0, blobtaglen, flagoffs;
    unsigned int datalen;

    DEBUGMSG(16, "ccnl_frag_getnextSEQD2012 e=%p, mtu=%d\n", (void *) e, e->mtu);
    DEBUGMSG(17, "  %d bytes to fragment, offset=%d\n", e->bigpkt->datalen,
             e->sendoffs);

    hdrlen = mkHeader(header, CCNL_DTAG_FRAGMENT2012, CCN_TT_DTAG);
    hdrlen += mkBinaryInt(header + hdrlen, CCNL_DTAG_FRAG_FLAGS,
                          CCN_TT_DTAG, 0, e->flagwidth);
    flagoffs = hdrlen - 2;
    hdrlen += mkBinaryInt(header + hdrlen, CCNL_DTAG_FRAG_YSEQN,
                          CCN_TT_DTAG, e->recvseq, e->recvseqwidth);
    hdrlen += mkBinaryInt(header + hdrlen, CCNL_DTAG_FRAG_OLOSS, CCN_TT_DTAG,
                          e->losscount, e->losscountwidth);

    hdrlen += mkBinaryInt(header + hdrlen, CCNL_DTAG_FRAG_SEQNR,
                          CCN_TT_DTAG, e->sendseq, e->sendseqwidth);
    hdrlen += mkHeader(header + hdrlen, CCN_DTAG_CONTENT, CCN_TT_DTAG);
    blobtaglen = mkHeader(header + hdrlen, e->mtu - hdrlen - 2, CCN_TT_BLOB);

    datalen = e->mtu - hdrlen - blobtaglen - 2;

    if (datalen > (e->bigpkt->datalen - e->sendoffs)) {
        datalen = e->bigpkt->datalen - e->sendoffs;
    }

    hdrlen += mkHeader(header + hdrlen, datalen, CCN_TT_BLOB);

    buf = ccnl_buf_new(NULL, hdrlen + datalen + 2);

    if (!buf) {
        return NULL;
    }

    memcpy(buf->data, header, hdrlen);
    memcpy(buf->data + hdrlen, e->bigpkt->data + e->sendoffs, datalen);
    buf->data[hdrlen + datalen] = '\0'; /* end of content/any field */
    buf->data[hdrlen + datalen + 1] = '\0'; /* end of fragment/pdu */

    if (datalen >= e->bigpkt->datalen) { /* fits in a single fragment */
        buf->data[flagoffs + e->flagwidth - 1] =
            CCNL_DTAG_FRAG_FLAG_FIRST | CCNL_DTAG_FRAG_FLAG_LAST;
        ccnl_free(e->bigpkt);
        e->bigpkt = NULL;
    }
    else if (e->sendoffs == 0) { /* this is the start fragment */
        buf->data[flagoffs + e->flagwidth - 1] = CCNL_DTAG_FRAG_FLAG_FIRST;
    }
    else if (datalen >= (e->bigpkt->datalen - e->sendoffs)) { /* the end */
        buf->data[flagoffs + e->flagwidth - 1] = CCNL_DTAG_FRAG_FLAG_LAST;
        ccnl_free(e->bigpkt);
        e->bigpkt = NULL;
    }
    else
        /* in the middle */
    {
        buf->data[flagoffs + e->flagwidth - 1] = 0x00;
    }

    e->sendoffs += datalen;
    e->sendseq++;

    DEBUGMSG(17, "  e->offset now %d\n", e->sendoffs);

    if (ifndx) {
        *ifndx = e->ifndx;
    }

    if (su) {
        memcpy(su, &e->dest, sizeof(*su));
    }

    return buf;
}