/* * Construct and send a new interest that uses the exclusion list. * Return -1 if not sent because of packet size, 0 for success. */ static int express_my_interest(struct ccn *h, struct ccn_closure *selfp, struct ccn_charbuf *name) { int ans; struct ccn_charbuf *templ = NULL; int i; struct upcalldata *data = get_my_data(selfp); templ = ccn_charbuf_create(); ccnb_element_begin(templ, CCN_DTAG_Interest); ccnb_element_begin(templ, CCN_DTAG_Name); ccnb_element_end(templ); /* </Name> */ ccnb_element_begin(templ, CCN_DTAG_Exclude); if ((data->flags & EXCLUDE_LOW) != 0) append_bf_all(templ); for (i = 0; i < data->n_excl; i++) { struct ccn_charbuf *comp = data->excl[i]; if (comp->length < 4) abort(); ccn_charbuf_append(templ, comp->buf + 1, comp->length - 2); } if ((data->flags & EXCLUDE_HIGH) != 0) append_bf_all(templ); ccnb_element_end(templ); /* </Exclude> */ answer_passive(templ); ccnb_element_end(templ); /* </Interest> */ if (templ->length + name->length > data->warn + 2) { fprintf(stderr, "*** Interest packet is %d bytes\n", (int)templ->length); data->warn = data->warn * 8 / 5; } if (templ->length + name->length > 1450 && data->n_excl > 3) ans = -1; else { ccn_express_interest(h, name, selfp, templ); ans = 0; } ccn_charbuf_destroy(&templ); return(ans); }
void GroupManager::expressEnumInterest(struct ccn_charbuf *interest, QList<QString> &toExclude) { if (toExclude.size() == 0) { mutex_trylock(); int res = ccn_express_interest(ccn, interest, join_closure, NULL); mutex_unlock(); if (res < 0) { critical("express interest failed!"); } ccn_charbuf_destroy(&interest); return; } struct ccn_charbuf **excl = NULL; if (toExclude.size() > 0) { excl = new ccn_charbuf *[toExclude.size()]; for (int i = 0; i < toExclude.size(); i ++) { QString compName = toExclude.at(i); struct ccn_charbuf *comp = ccn_charbuf_create(); ccn_name_init(comp); ccn_name_append_str(comp, compName.toStdString().c_str()); excl[i] = comp; comp = NULL; } qsort(excl, toExclude.size(), sizeof(excl[0]), &namecompare); } int begin = 0; bool excludeLow = false; bool excludeHigh = true; while (begin < toExclude.size()) { if (begin != 0) { excludeLow = true; } struct ccn_charbuf *templ = ccn_charbuf_create(); ccn_charbuf_append_tt(templ, CCN_DTAG_Interest, CCN_DTAG); // <Interest> ccn_charbuf_append_tt(templ, CCN_DTAG_Name, CCN_DTAG); // <Name> ccn_charbuf_append_closer(templ); // </Name> ccn_charbuf_append_tt(templ, CCN_DTAG_Exclude, CCN_DTAG); // <Exclude> if (excludeLow) { append_bf_all(templ); } for (; begin < toExclude.size(); begin++) { struct ccn_charbuf *comp = excl[begin]; if (comp->length < 4) abort(); // we are being conservative here if (interest->length + templ->length + comp->length > 1350) { break; } ccn_charbuf_append(templ, comp->buf + 1, comp->length - 2); } if (begin == toExclude.size()) { excludeHigh = false; } if (excludeHigh) { append_bf_all(templ); } ccn_charbuf_append_closer(templ); // </Exclude> ccn_charbuf_append_closer(templ); // </Interest> mutex_trylock(); int res = ccn_express_interest(ccn, interest, join_closure, templ); mutex_unlock(); if (res < 0) { critical("express interest failed!"); } ccn_charbuf_destroy(&templ); } ccn_charbuf_destroy(&interest); for (int i = 0; i < toExclude.size(); i++) { ccn_charbuf_destroy(&excl[i]); } if (excl != NULL) { delete []excl; } }