LONGBOW_TEST_CASE(Global, tcpTunnel) { uint16_t metisA_port = 10001; uint16_t metisB_port = 10002; // these will get filled in with the most recent message NotifyReceiver receiver_a = { NULL }; NotifyReceiver receiver_b = { NULL }; MetisMessengerRecipient *recipient_a = metisMessengerRecipient_Create(&receiver_a, missiveNotify); MetisMessengerRecipient *recipient_b = metisMessengerRecipient_Create(&receiver_b, missiveNotify); // in between each step, run the dispatchers for 1 msec to let things settle. // =============================================== /* 1) run two instances of Metis */ MetisForwarder *metis_a = metisForwarder_Create(NULL); MetisForwarder *metis_b = metisForwarder_Create(NULL); MetisDispatcher *dispatcher_a = metisForwarder_GetDispatcher(metis_a); MetisDispatcher *dispatcher_b = metisForwarder_GetDispatcher(metis_b); // register to receive notifications metisMessenger_Register(metisForwarder_GetMessenger(metis_a), recipient_a); metisMessenger_Register(metisForwarder_GetMessenger(metis_b), recipient_b); // =============================================== /* 2) Create TCP listeners on 127.0.0.1:10001 and 10002 */ metisConfigurationListeners_SetupAll(metisForwarder_GetConfiguration(metis_a), metisA_port, NULL); metisConfigurationListeners_SetupAll(metisForwarder_GetConfiguration(metis_b), metisB_port, NULL); // ---- run metisDispatcher_RunDuration(dispatcher_a, &((struct timeval) { 0, 1000 }));
static void _cmd_Version(_MetisCommandLineInterface_Session *session, _MetisCommandLineInterface_Command *command, const char *params) { PARCJSON *versionJson = metisConfiguration_GetVersion(metisForwarder_GetConfiguration(session->parentCli->metis)); char *str = parcJSON_ToString(versionJson); parcEventQueue_Printf(session->streamBuffer, "%s", str); parcMemory_Deallocate((void **) &str); parcJSON_Release(&versionJson); }
/** * Called by the command parser for each command. * * The command parser will make a CCNxControl message inside the CCNxMetaMessage and send it here. * This function must return a ACK or NACK in a CCNxControl in a CCNxMetaMessage. * * @param [in] userdata A void * to MetisConfigurationFile * @param [in] msg The CCNxControl message to process * * @retval CCNxMetaMessage A CPI ACK or NACK in a CCNxControl in a CCNxMetaMessage * * Example: * @code * <#example#> * @endcode */ static CCNxMetaMessage * _writeRead(void *userdata, CCNxMetaMessage *msgin) { MetisConfigurationFile *configFile = (MetisConfigurationFile *) userdata; CCNxControl *request = ccnxMetaMessage_GetControl(msgin); CCNxControl *response = metisConfiguration_ReceiveControl(metisForwarder_GetConfiguration(configFile->metis), request, 0); CCNxMetaMessage *msgout = ccnxMetaMessage_CreateFromControl(response); ccnxControl_Release(&response); return msgout; }
int main(int argc, const char *argv[]) { header(); uint16_t port = PORT_NUMBER; uint16_t configurationPort = 2001; bool daemon = false; int capacity = -1; const char *configFileName = NULL; char *logfile = NULL; if (argc == 2 && strcasecmp(argv[1], "-h") == 0) { _usage(EXIT_SUCCESS); } int logLevelArray[MetisLoggerFacility_END]; for (int i = 0; i < MetisLoggerFacility_END; i++) { logLevelArray[i] = -1; } for (int i = 0; i < argc; i++) { if (argv[i][0] == '-') { if (strcmp(argv[i], "--config") == 0) { configFileName = argv[i + 1]; i++; } else if (strcmp(argv[i], "--port") == 0) { port = atoi(argv[i + 1]); i++; } else if (strcmp(argv[i], "--daemon") == 0) { daemon = true; } else if (strcmp(argv[i], "--capacity") == 0 || strcmp(argv[i], "-c") == 0) { capacity = atoi(argv[i + 1]); i++; } else if (strcmp(argv[i], "--log") == 0) { _setLogLevel(logLevelArray, argv[i + 1]); i++; } else if (strcmp(argv[i], "--log-file") == 0) { if (logfile) { // error cannot repeat fprintf(stderr, "Cannot specify --log-file more than once\n"); _usage(EXIT_FAILURE); } logfile = parcMemory_StringDuplicate(argv[i + 1], strlen(argv[i + 1])); i++; } else { _usage(EXIT_FAILURE); } } } // set restrictive umask, in case we create any files umask(027); if (daemon && (logfile == NULL)) { fprintf(stderr, "Must specify a logfile when running in daemon mode\n"); _usage(EXIT_FAILURE); } if (daemon) { // inside this call, parent will EXIT_SUCCESS and child will continue _daemonize(); } MetisLogger *logger = NULL; if (logfile) { logger = _createLogfile(logfile); parcMemory_Deallocate((void **) &logfile); } else { PARCLogReporter *stdoutReporter = parcLogReporterTextStdout_Create(); logger = metisLogger_Create(stdoutReporter, parcClock_Wallclock()); parcLogReporter_Release(&stdoutReporter); } for (int i = 0; i < MetisLoggerFacility_END; i++) { if (logLevelArray[i] > -1) { metisLogger_SetLogLevel(logger, i, logLevelArray[i]); } } // this will update the clock to the tick clock MetisForwarder *metis = metisForwarder_Create(logger); MetisConfiguration *configuration = metisForwarder_GetConfiguration(metis); if (capacity > -1) { metisConfiguration_SetObjectStoreSize(configuration, capacity); } metisConfiguration_StartCLI(configuration, configurationPort); if (configFileName) { metisForwarder_SetupFromConfigFile(metis, configFileName); } else { // NULL to not setup AF_UNIX metisForwarder_SetupAllListeners(metis, port, NULL); } MetisDispatcher *dispatcher = metisForwarder_GetDispatcher(metis); metisLogger_Log(logger, MetisLoggerFacility_Core, PARCLogLevel_Alert, "daemon", "metis running port %d configuration-port %d", port, configurationPort); metisDispatcher_Run(dispatcher); metisLogger_Log(logger, MetisLoggerFacility_Core, PARCLogLevel_Alert, "daemon", "metis exiting port %d", port); metisForwarder_Destroy(&metis); sleep(2); metisLogger_Release(&logger); return 0; }