Exemplo n.º 1
0
/** 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;
    }
  }
}
Exemplo n.º 2
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"));
    }
}