int dtn2_removePlan(char *nodeNm) { Sdr sdr = getIonsdr(); char nodeName[SDRSTRING_BUFSZ]; Object elt; Object planObj; OBJ_POINTER(Dtn2Plan, plan); CHKERR(nodeNm); if (filterNodeName(nodeName, nodeNm) < 0) { return 0; } CHKERR(sdr_begin_xn(sdr)); elt = locatePlan(nodeName, NULL); if (elt == 0) { sdr_exit_xn(sdr); writeMemoNote("[?] Unknown plan", nodeNm); return 0; } planObj = sdr_list_data(sdr, elt); GET_OBJ_POINTER(sdr, Dtn2Plan, plan, planObj); if (sdr_list_length(sdr, plan->rules) > 0) { sdr_exit_xn(sdr); writeMemoNote("[?] Can't remove plan; still has rules", nodeNm); return 0; } /* Okay to remove this plan from the database. */ sdr_list_delete(sdr, elt, NULL, NULL); dtn2_destroyDirective(&(plan->defaultDirective)); sdr_list_destroy(sdr, plan->rules, NULL, NULL); sdr_free(sdr, plan->nodeName); sdr_free(sdr, planObj); if (sdr_end_xn(sdr) < 0) { putErrmsg("Can't remove plan.", nodeNm); return -1; } return 1; }
static int enqueueBundle(Bundle *bundle, Object bundleObj) { Sdr sdr = getIonsdr(); Object elt; char eidString[SDRSTRING_BUFSZ]; MetaEid metaEid; VScheme *vscheme; PsmAddress vschemeElt; FwdDirective directive; elt = sdr_list_first(sdr, bundle->stations); if (elt == 0) { putErrmsg("Forwarding error; stations stack is empty.", NULL); return -1; } sdr_string_read(sdr, eidString, sdr_list_data(sdr, elt)); if (parseEidString(eidString, &metaEid, &vscheme, &vschemeElt) == 0) { putErrmsg("Can't parse node EID string.", eidString); return bpAbandon(bundleObj, bundle); } if (strcmp(vscheme->name, "ipn") != 0) { putErrmsg("Forwarding error; EID scheme is not 'ipn'.", vscheme->name); return -1; } if (cgr_forward(bundle, bundleObj, metaEid.nodeNbr, (getIpnConstants())->plans) < 0) { putErrmsg("CGR failed.", NULL); return -1; } /* If dynamic routing succeeded in enqueuing the bundle * to a neighbor, accept the bundle and return. */ if (sdr_list_length(sdr, bundle->xmitRefs) > 0) { /* Enqueued. */ return bpAccept(bundle); } /* No luck using the contact graph to compute a route * to the destination node. So see if destination node * is a neighbor; if so, enqueue for direct transmission. */ if (enqueueToNeighbor(bundle, bundleObj, metaEid.nodeNbr, metaEid.serviceNbr) < 0) { putErrmsg("Can't send bundle to neighbor.", NULL); return -1; } if (sdr_list_length(sdr, bundle->xmitRefs) > 0) { /* Enqueued. */ return bpAccept(bundle); } /* Destination isn't a neighbor either. So look for the * narrowest applicable static route (node range, i.e., * "group") and forward to the prescribed "via" endpoint * for that group. */ if (ipn_lookupGroupDirective(metaEid.nodeNbr, bundle->id.source.c.serviceNbr, bundle->id.source.c.nodeNbr, &directive) == 0) { return bpAbandon(bundleObj, bundle); } /* Found directive; forward via the indicated endpoint. */ sdr_string_read(sdr, eidString, directive.eid); return forwardBundle(bundleObj, bundle, eidString); }
static int enqueueBundle(Bundle *bundle, Object bundleObj) { Sdr sdr = getIonsdr(); Object elt; char eidString[SDRSTRING_BUFSZ]; MetaEid metaEid; VScheme *vscheme; PsmAddress vschemeElt; char nodeName[SDRSTRING_BUFSZ]; char demux[SDRSTRING_BUFSZ]; int result; FwdDirective directive; elt = sdr_list_first(sdr, bundle->stations); if (elt == 0) { putErrmsg("Forwarding error; stations stack is empty.", NULL); return -1; } sdr_string_read(sdr, eidString, sdr_list_data(sdr, elt)); if (parseEidString(eidString, &metaEid, &vscheme, &vschemeElt) == 0) { putErrmsg("Can't parse node EID string.", eidString); return bpAbandon(bundleObj, bundle); } if (strcmp(vscheme->name, DTN2_SCHEME_NAME) != 0) { putErrmsg("Forwarding error; EID scheme wrong for dtn2fw.", vscheme->name); return -1; } result = parseDtn2Nss(metaEid.nss, nodeName, demux); restoreEidString(&metaEid); if (result == 0) { putErrmsg("Invalid nss in EID string, cannot forward.", eidString); return bpAbandon(bundleObj, bundle); } if (dtn2_lookupDirective(nodeName, demux, &directive) == 0) { putErrmsg("Can't find forwarding directive for EID.", eidString); return bpAbandon(bundleObj, bundle); } if (directive.action == xmit) { if (enqueueToDuct(&directive, bundle, bundleObj, eidString) < 0) { putErrmsg("Can't enqueue bundle.", NULL); return -1; } if (sdr_list_length(sdr, bundle->xmitRefs) > 0) { /* Enqueued. */ return bpAccept(bundle); } else { return bpAbandon(bundleObj, bundle); } } /* Can't transmit to indicated next node directly, must * forward through some other node. */ sdr_string_read(sdr, eidString, directive.eid); return forwardBundle(bundleObj, bundle, eidString); }