/** Listen to multicast/broadcasted UDP packages announcing peiskernels on the local network */ void peisk_acceptUDPMulticasts() { int size; PeisUDPBroadcastAnnounceMessage message; if(peiskernel.tcp_broadcast_receiver <= 0) return; while(1) { size=recvfrom(peiskernel.tcp_broadcast_receiver,(void*)&message,sizeof(message),MSG_DONTWAIT,NULL,NULL); if(size == -1) return; if(size == sizeof(message)) { /* convert broadcasted message so that all subfields within it is now in HOST order */ message.protocollVersion = ntohl(message.protocollVersion); peisk_ntoh_hostInfo(&message.hostinfo); if(message.hostinfo.id > 65535) { /* Just for debugging - until we start using longer PEIS-id's */ printf("Warning - getting hostinfo with id = %d (%x) on the multicast\n",message.hostinfo.id,message.hostinfo.id); } /* Check if it matches the network connection strings */ message.networkString[63]=0; if(strcmp(message.networkString,peisk_networkString) != 0) return; if(message.protocollVersion > peisk_protocollVersion && message.protocollVersion < 1000) { printf("ERROR - A newer version of the PEIS kernel exists - you should upgrade!\n"); peisk_shutdown(); } if(message.protocollVersion != peisk_protocollVersion) return; message.hostinfo.fullname[PEISK_MAX_HOSTINFO_NAME_LEN-1]=0; /* force name part of hostinfo to be a null terminated string */ /*printf("peisk: received host announcement for '%s'\n",hostinfo.fullname);*/ /* We received a full PeisHostInfo field describing another available host */ if(message.hostinfo.id == -1 || message.hostinfo.id == peisk_id) return; peisk_handleBroadcastedHostInfo(&message.hostinfo); /* Reset counter for deciding if we are allowed to broadcast if this one comes from our host and have a lower ID than us. */ if(message.hostinfo.id < peiskernel.id && strcmp(message.hostinfo.hostname,peiskernel.hostInfo.hostname) == 0) peiskernel.broadcastingCounter = 0; } } }
void peisk_initialize(int *argc,char **args) { int i, j; char name[256]; char *hostname, *progname; unsigned char *ip; char tmp[256]; int t0,t1; PeisConnectionMgrInfo *connMgrInfo; if(peisk_int_isRunning) peisk_shutdown(); peisk_getrawtime2(&t0,&t1); srand((int) t1); peiskernel.id = rand() % 10000; peiskernel.tcp_serverPort=8000; peiskernel.udp_serverPort=8000; peiskernel.tcp_isListening=0; peiskernel.lastStep = peisk_gettimef(); peiskernel.nextConnectionId = 1; peisk_printLevel = 0; peiskernel.highestPeriodic=0; peiskernel.highestConnection=0; hostname = NULL; peiskernel.isLeaf=0; peiskernel.timeOffset[0]=0; peiskernel.timeOffset[1]=0; peiskernel.isTimeMaster=0; peiskernel.avgStepTime=0.1; peiskernel.incomingTraffic=0; peiskernel.outgoingTraffic=0; peiskernel.nAcknowledgementPackages=0; peiskernel.deadhostHook = NULL; peiskernel.nAckHooks = 0; peiskernel.tick = 0; peiskernel.broadcastingCounter = 0; peisk_cl_user = getenv("USER"); if(!peisk_cl_user) peisk_cl_user = "******"; signal(SIGINT, peisk_trapCtrlC); signal(SIGTERM, peisk_trapCtrlC); signal(SIGPIPE, peisk_trapPipe); peiskernel_initNetInterfaces(); for(i=0;i<PEISK_MAX_CONNECTIONS;i++) { peiskernel.connections[i].id=-1; peiskernel.connections[i].routingTable = NULL; for(j=0;j<PEISK_MAX_ROUTING_PAGES;j++) peiskernel.connections[i].routingPages[j] = NULL; } peiskernel.freeQueuedPackages=NULL; peiskernel.nDirConnReqs=0; peiskernel.doShutdown=0; for(i=0;i<PEISK_NPORTS;i++) peiskernel.hooks[i]=NULL; for(i=0;i<PEISK_MAX_PERIODICS;i++) peiskernel.periodics[i].periodicity=-1.0; for(i=0;i<PEISK_MAX_LONG_MESSAGES;i++) { peiskernel.assemblyBuffers[i].seqid = 0; peiskernel.assemblyBuffers[i].seqlen = 0; peiskernel.assemblyBuffers[i].allocated_seqlen = 0; peiskernel.assemblyBuffers[i].received = NULL; peiskernel.assemblyBuffers[i].data = NULL; } peiskernel.routingTable = peisk_hashTable_create(PeisHashTableKey_Integer); if(peiskernel.routingTable == NULL) { fprintf(stderr,"peisk: error, failed to create routing table\n"); exit(-1); } for(i=0;i<PEISK_LOOPINFO_HASH_SIZE;i++) peiskernel.loopHashTable[i]=-1; for(i=0;i<PEISK_LOOPINFO_SIZE;i++) peiskernel.loopTable[i].id=-1; peisk_initBluetooth(); peisk_initP2PLayer(); peisk_registerDefaultServices(); //peisk_getOptions(argc,args); peisk_parseOptions(NULL,"command-line"); peisk_restartServer(); if(peiskernel.tcp_isListening) if(peisk_printLevel & PEISK_PRINT_STATUS) printf("peisk: serving at port %d\n",peiskernel.tcp_serverPort); peisk_id = peiskernel.id; peiskernel.magicId = rand(); peisk_registerDefaultServices2(); hostname=peisk_cl_hostname; if(!hostname) hostname=getenv("HOSTNAME"); if(!hostname) { FILE *fp = fopen("/etc/hostname","r"); if(!fp) fp = fopen("/etc/HOSTNAME","r"); if(!fp) { if(system("hostname > /tmp/peisk_cl_hostname")!=-1) fp = fopen("/tmp/peisk_cl_hostname","r"); } if(fp) { if(!fgets(name,255,fp)) sprintf(name,"johndoe"); fclose(fp); for(i=0;i<255&&name[i];i++) if(name[i]=='\n' || name[i]==' ' || name[i] == '.') name[i]=0; hostname=strdup(name); } else { char name[256]; sprintf(name,"johndoe-%d",peisk_id / 100); hostname=strdup(name); } } for(i=0;i<255;i++) { if(hostname[i] == 0 || hostname[i] == '.' || hostname[i] == ' ') break; else name[i] = hostname[i]; } name[i]=0; if(peisk_cl_componentName) progname=peisk_cl_componentName; else { for(progname = args[0]+strlen(args[0]);progname>=args[0]&&*progname!='/';progname--) {} progname++; } peiskernel.hostInfo.id = peiskernel.id; peiskernel.hostInfo.magic = peiskernel.magicId; peiskernel.hostInfo.networkCluster = peiskernel.id; int mypid = getpid(); snprintf(peiskernel.hostInfo.fullname,sizeof(peiskernel.hostInfo.fullname),"%s@%s!%d",progname,name,mypid); snprintf(peiskernel.hostInfo.hostname,sizeof(peiskernel.hostInfo.hostname),"%s",name); peisk_setStringTuple("kernel.hostname",peiskernel.hostInfo.hostname); snprintf(tmp,sizeof(tmp),"v%lf (proto %d)",1.0,peisk_protocollVersion); peisk_setStringTuple("kernel.version",tmp); peisk_setStringTuple("kernel.name",progname); peisk_setStringTuple("kernel.do-quit",""); peisk_setStringTuple("kernel.user",peisk_cl_user); snprintf(tmp,sizeof(tmp),"%d",peiskernel.id); peisk_setStringTuple("kernel.id",tmp); if(peisk_printLevel & PEISK_PRINT_STATUS) printf("peisk #%d: started\n",peisk_id); peiskernel.hostInfo.nLowlevelAddresses=0; if(peiskernel.tcp_isListening) { for(i=0,j=peiskernel.hostInfo.nLowlevelAddresses;i<peisk_nInetInterfaces;i++) { if(peiskernel.isLeaf && !peisk_inetInterface[i].isLoopback) continue; if(peiskernel.udp_serverPort != 0 && 0) { peiskernel.hostInfo.lowAddr[j].type = ePeisUdpIPv4; ip = (unsigned char *)&peisk_inetInterface[i].ip; peiskernel.hostInfo.lowAddr[j].addr.udpIPv4.ip[0]=ip[0]; peiskernel.hostInfo.lowAddr[j].addr.udpIPv4.ip[1]=ip[1]; peiskernel.hostInfo.lowAddr[j].addr.udpIPv4.ip[2]=ip[2]; peiskernel.hostInfo.lowAddr[j].addr.udpIPv4.ip[3]=ip[3]; peiskernel.hostInfo.lowAddr[j].addr.udpIPv4.port=peiskernel.udp_serverPort; } else { peiskernel.hostInfo.lowAddr[j].type = ePeisTcpIPv4; ip = (unsigned char *)&peisk_inetInterface[i].ip; peiskernel.hostInfo.lowAddr[j].addr.tcpIPv4.ip[0]=ip[0]; peiskernel.hostInfo.lowAddr[j].addr.tcpIPv4.ip[1]=ip[1]; peiskernel.hostInfo.lowAddr[j].addr.tcpIPv4.ip[2]=ip[2]; peiskernel.hostInfo.lowAddr[j].addr.tcpIPv4.ip[3]=ip[3]; peiskernel.hostInfo.lowAddr[j].addr.tcpIPv4.port=peiskernel.tcp_serverPort; } strncpy(peiskernel.hostInfo.lowAddr[j].deviceName,peisk_inetInterface[i].name,sizeof(peiskernel.hostInfo.lowAddr[i].deviceName)); peiskernel.hostInfo.lowAddr[j].isLoopback = peisk_inetInterface[i].isLoopback ? 1 : 0; j++; } peiskernel.hostInfo.nLowlevelAddresses=j; } peisk_addBluetoothLowlevelAddresses(); peiskernel.hostInfoHT = peisk_hashTable_create(PeisHashTableKey_Integer); peiskernel.connectionMgrInfoHT = peisk_hashTable_create(PeisHashTableKey_Integer); peisk_insertHostInfo(peiskernel.id,&peiskernel.hostInfo); connMgrInfo = (PeisConnectionMgrInfo*) malloc(sizeof(PeisConnectionMgrInfo)); peisk_insertConnectionMgrInfo(peiskernel.id,connMgrInfo); connMgrInfo->nTries = 0; connMgrInfo->nextRetry = peisk_timeNow; connMgrInfo->usefullTraffic=0; connMgrInfo->lastUsefullTraffic=0; printf("PeisKernel v%lf (protocoll %d)@%s %s ",1.0,peisk_protocollVersion,__DATE__,__TIME__); peisk_printHostInfo(&peiskernel.hostInfo); peisk_int_isRunning=1; PeisRoutingInfo *routingInfo; if(peisk_hashTable_getValue(peiskernel.routingTable,(void*)(intA)peiskernel.id,(void**)(void*)&routingInfo) == 0) { PEISK_ASSERT(routingInfo->connection == NULL,("Route to ourselves points to nonzero connection\n")); } }