int main(int argc, char *arg[]) { EipUint16 nUniqueConnectionID; if (argc != 2) { printf("Wrong number of command line parameters!\n"); printf("The correct command line parameters are:\n"); printf( "./OpENer ip-address\n"); printf( " e.g. ./OpENer 192.168.259.22\n"); exit(0); } else { DoublyLinkedListInitialize(&connection_list, CipConnectionObjectListArrayAllocator, CipConnectionObjectListArrayFree); /* fetch Internet address info from the platform */ ConfigureDomainName(); ConfigureHostName(); ConfigureNetworkInterface(arg[1] ); } /*for a real device the serial number should be unique per device */ SetDeviceSerialNumber(123456789); /* nUniqueConnectionID should be sufficiently random or incremented and stored * in non-volatile memory each time the device boots. */ nUniqueConnectionID = rand(); /* Setup the CIP Layer */ CipStackInit(nUniqueConnectionID); /* Setup Network Handles */ if ( kEipStatusOk == NetworkHandlerInitialize() ) { g_end_stack = 0; #ifndef WIN32 /* register for closing signals so that we can trigger the stack to end */ signal(SIGHUP, LeaveStack); #endif /* The event loop. Put other processing you need done continually in here */ while (1 != g_end_stack) { if ( kEipStatusOk != NetworkHandlerProcessOnce() ) { break; } } /* clean up network state */ NetworkHandlerFinish(); } /* close remaining sessions and connections, cleanup used data */ ShutdownCipStack(); return -1; }
int main(int argc, char *arg[]) { EipUint8 acMyMACAddress[6]; EipUint16 nUniqueConnectionID; if (argc != 12) { printf("Wrong number of command line parameters!\n"); printf("The correct command line parameters are:\n"); printf( "./OpENer ipaddress subnetmask gateway domainname hostaddress macaddress\n"); printf( " e.g. ./OpENer 192.168.0.2 255.255.255.0 192.168.0.1 test.com testdevice 00 15 C5 BF D0 87\n"); exit(0); } else { /* fetch Internet address info from the platform */ ConfigureNetworkInterface(arg[1], arg[2], arg[3]); ConfigureDomainName(arg[4]); ConfigureHostName(arg[5]); acMyMACAddress[0] = (EipUint8) strtoul(arg[6], NULL, 16); acMyMACAddress[1] = (EipUint8) strtoul(arg[7], NULL, 16); acMyMACAddress[2] = (EipUint8) strtoul(arg[8], NULL, 16); acMyMACAddress[3] = (EipUint8) strtoul(arg[9], NULL, 16); acMyMACAddress[4] = (EipUint8) strtoul(arg[10], NULL, 16); acMyMACAddress[5] = (EipUint8) strtoul(arg[11], NULL, 16); ConfigureMacAddress(acMyMACAddress); } /*for a real device the serial number should be unique per device */ SetDeviceSerialNumber(123456789); /* nUniqueConnectionID should be sufficiently random or incremented and stored * in non-volatile memory each time the device boots. */ nUniqueConnectionID = rand(); /* Setup the CIP Layer */ CipStackInit(nUniqueConnectionID); /* Setup Network Handles */ if (kEipStatusOk == NetworkHandlerInitialize()) { g_end_stack = 0; #ifndef WIN32 /* register for closing signals so that we can trigger the stack to end */ signal(SIGHUP, LeaveStack); #endif /* The event loop. Put other processing you need done continually in here */ while (1 != g_end_stack) { if (kEipStatusOk != NetworkHandlerProcessOnce()) { break; } } /* clean up network state */ NetworkHandlerFinish(); } /* close remaining sessions and connections, cleanup used data */ ShutdownCipStack(); return -1; }
int main(int argc, char *arg[]) { cap_t capabilities; cap_value_t capabilies_list[1]; capabilities = cap_get_proc(); if (NULL == capabilities) { printf("Could not get capabilities\n"); exit(0); } capabilies_list[0] = CAP_NET_RAW; if (-1 == cap_set_flag(capabilities, CAP_EFFECTIVE, 1, capabilies_list, CAP_SET) ) { cap_free(capabilities); printf("Could not set CAP_NET_RAW capability\n"); exit(0); } if (-1 == cap_set_proc(capabilities) ) { cap_free(capabilities); printf("Could not push CAP_NET_RAW capability to process\n"); exit(0); } if (-1 == cap_free(capabilities) ) { printf("Could not free capabilites value\n"); exit(0); } if (argc != 2) { printf("Wrong number of command line parameters!\n"); printf("The correct command line parameters are:\n"); printf("./OpENer interfacename\n"); printf(" e.g. ./OpENer eth1\n"); exit(0); } else { DoublyLinkedListInitialize(&connection_list, CipConnectionObjectListArrayAllocator, CipConnectionObjectListArrayFree); /* fetch Internet address info from the platform */ if (kEipStatusError == ConfigureNetworkInterface(arg[1]) ) { printf("Network interface %s not found.\n", arg[1]); exit(0); } ConfigureDomainName(); ConfigureHostName(); ConfigureMacAddress(arg[1]); } /* for a real device the serial number should be unique per device */ SetDeviceSerialNumber(123456789); /* unique_connection_id should be sufficiently random or incremented and stored * in non-volatile memory each time the device boots. */ EipUint16 unique_connection_id = rand(); /* Setup the CIP Layer */ CipStackInit(unique_connection_id); /* Setup Network Handles */ if (kEipStatusOk == NetworkHandlerInitialize() ) { g_end_stack = 0; #ifndef WIN32 /* register for closing signals so that we can trigger the stack to end */ signal(SIGHUP, LeaveStack); #endif #ifdef OPENER_RT /* Memory lock all*/ if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1) { OPENER_TRACE_ERR("mlockall failed: %m\n"); exit(-2); } struct sched_param param; pthread_attr_t attr; pthread_t thread; CipUint ret = pthread_attr_init(&attr); if (ret) { OPENER_TRACE_ERR("init pthread attributes failed\n"); exit(-2); } /* Set stack size */ ret = pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN + OPENER_RT_THREAD_SIZE); if (ret) { OPENER_TRACE_ERR("setstacksize failed\n"); exit(-2); } /* Set policy and priority of the thread */ ret = pthread_attr_setschedpolicy(&attr, SCHED_RR); if (ret) { OPENER_TRACE_ERR("setschedpolicy failed\n"); exit(-2); } param.sched_priority = 80; ret = pthread_attr_setschedparam(&attr, ¶m); if (ret) { OPENER_TRACE_ERR("pthread setschedparam failed\n"); exit(-2); } /* scheduling parameters */ ret = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); if (ret) { OPENER_TRACE_ERR("setinheritsched failed\n"); exit(-2); } /* Create a thread with the specified attributes */ ret = pthread_create(&thread, &attr, executeEventLoop, NULL); if (ret) { OPENER_TRACE_ERR("create pthread failed\n"); exit(-2); } /* Join the thread */ ret = pthread_join(thread, NULL); if (ret) { OPENER_TRACE_ERR("join pthread failed: %m\n"); } /* Unlock memory */ munlockall(); #else executeEventLoop(); #endif /* clean up network state */ NetworkHandlerFinish(); } /* close remaining sessions and connections, cleanup used data */ ShutdownCipStack(); return -1; }