From: hadaq Date: Sun, 13 Sep 2009 23:12:16 +0000 (+0000) Subject: first release X-Git-Tag: v6.0~340 X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=4fdc3d1aa65bb382c899e4c5d4d86f7594597ec9;p=trbnettools.git first release --- diff --git a/libtrbnet/trbdhcp.c b/libtrbnet/trbdhcp.c new file mode 100644 index 0000000..4bffaf6 --- /dev/null +++ b/libtrbnet/trbdhcp.c @@ -0,0 +1,225 @@ +#define _GNU_SOURCE +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static const char trbdhcp_version[] = "$Revision: 1.1 $"; + +typedef struct { + uint16_t address; + uint64_t uid; + uint8_t endPoint; +} Trb_Endpoint; + +static Trb_Endpoint* endPointList = NULL; +static unsigned int listSize = 0; +static uint32_t* trbBuffer = NULL; + +#define NUM_ENDPOINTS 2048 + +static int readConfigFile(const char* fileName) +{ + FILE* configFile = NULL; + char *line = NULL; + int lineLen = 0; + unsigned int lineCtr = 0; + unsigned int counter = 0; + uint32_t address; + uint64_t uid; + uint32_t endPoint; + + listSize = 0; + + if (endPointList == NULL) return -1; + + /* Open scriptFile if requested */ + configFile = fopen(fileName, "r"); + if (configFile == NULL) { + fprintf(stderr, "Error opening configFile '%s': %s\n", + fileName, strerror(errno)); + return -1; + } + + while(1) { + char *c = NULL; + lineCtr++; + if (getline(&line, &lineLen, configFile) == -1) { + if (feof(configFile) != 0) { + /* EOF reached */ + break; + } else { + /* Error reading line */ + fprintf(stderr, "Error reading configFile '%s' line %d\n", + fileName, lineCtr); + return -1; + } + } + + /* Remove newline and comments */ + if ((c = strchr(line, '\n')) != NULL) { + *c = '\0'; + } + if ((c = strchr(line, '#')) != NULL) { + *c = '\0'; + } + + if (sscanf(line, "%x %llx %x", &address, &uid, &endPoint) != 3) { + continue; + } + endPointList[counter].address = address; + endPointList[counter].uid = uid; + endPointList[counter].endPoint = endPoint; + + counter++; + } + + free(line); + + listSize = counter; + + return counter; +} + +static void dumpList() +{ + unsigned int i; + for (i = 0; i < listSize; i++) { + fprintf(stdout, "Entry #%d: 0x%04x 0x%08llx 0x%02x\n", i, + endPointList[i].address, + endPointList[i].uid, + endPointList[i].endPoint); + } +} + +/* ------ MAIN ---------------------------------------------------------- */ + +void usage(const char *progName) +{ + printf("Usage: %s [-h] [-f configFile] [-V]\n", progName); + printf("Options:\n"); + printf(" -h give this help\n"); + printf(" -f name of configFile (default: trbdhcp.conf)\n"); + printf(" -a trb-address (default: 0xffff)\n"); + printf(" -V Version number\n"); + printf("\nConfigFile Format:\n"); + printf("# New-Address UID EndPoint\n\n"); +} + +int main(int argc, char ** argv) +{ + char configFileName[256] = "trbdhcp.conf"; + uint16_t trbAddress = 0xffff; + int status; + unsigned int i; + int resetAll = 0; + int opt; + + trb_debug = 0; + + /* Parse Arguments */ + while ((opt = getopt(argc, argv, "+hd:f:a:rV")) != -1) { + switch (opt) { + case '?': + usage(basename(argv[0])); + exit(EXIT_FAILURE); + case 'h': + usage(basename(argv[0])); + exit(EXIT_SUCCESS); + case 'd': + trb_debug = strtoul(optarg, NULL, 0); + break; + case 'f': + strncpy(configFileName, optarg, 256); + break; + case 'a': + trbAddress = strtoul(optarg, NULL, 0); + break; + case 'r': + resetAll = 1; + break; + case 'V': + printf("%s %s, using libtrbnet %s\n", + basename(argv[0]), trbdhcp_version, trbnet_version); + exit(EXIT_SUCCESS); + break; + default: + break; + } + } + + /* Allocat Memory */ + if ((endPointList = malloc(sizeof(Trb_Endpoint) * NUM_ENDPOINTS)) == NULL) { + abort(); + } + + if ((trbBuffer = malloc(sizeof(uint32_t) * 4 * NUM_ENDPOINTS)) == NULL) { + abort(); + } + + /* Read Config-File */ + if (readConfigFile(configFileName) <= 0) { + exit(EXIT_FAILURE); + } + if (trb_debug > 0) { + dumpList(); + } + + /* Open ports */ + init_ports(); + + /* Read present UIDs */ + status = trb_read_uid(trbAddress, trbBuffer, + sizeof(uint32_t) * 4 * NUM_ENDPOINTS); + if (status == -1) { + trb_error("read_uid failed"); + exit(EXIT_FAILURE); + } + + /* Assign addresses */ + for (i = 0; i < status; i += 4) { + uint16_t currentAddress = 0; + uint64_t uid = 0; + uint8_t endPoint = 0; + unsigned int j; + + uid = ((uint64_t)trbBuffer[i] << 32) | trbBuffer[i + 1]; + endPoint = trbBuffer[i + 2]; + currentAddress = trbBuffer[i + 3]; + + for (j = 0; j < listSize; j++) { + if ((uid == endPointList[j].uid) && + (endPoint == endPointList[j].endPoint)) { + + if ((currentAddress != endPointList[j].address) && + (((currentAddress & 0xf000) == 0xf000) || (resetAll == 1)) + ) { + + if (trb_debug > 0) { + fprintf(stderr, "set address: 0x%04x 0x%08llx 0x%02x\n", + currentAddress, uid, endPoint); + } + + /* Set new Address */ + if (trb_set_address(uid, endPoint, endPointList[j].address) == -1) { + trb_error("Set address failed"); + continue; + } + } + } + } + } + + /* Cleanup */ + free(endPointList); + free(trbBuffer); + + + exit(EXIT_SUCCESS); +}