Beispiel #1
0
static void sr_low_level_network_subsystem(void *arg)
{
    struct sr_instance* sr = (struct sr_instance*)arg;

    /* -- set argument as global singleton -- */
    sr_get_global_instance(sr);


#ifdef _CPUMODE_
    /* -- whizbang main loop ;-) */
    while( sr_cpu_input(sr) == 1);
#else
    /* -- whizbang main loop ;-) */
    while( sr_vns_read_from_server(sr) == 1);
#endif

   /* -- this is the end ... my only friend .. the end -- */
    sr_destroy_instance(sr);
} /* --  sr_low_level_network_subsystem -- */
Beispiel #2
0
int main(int argc, char **argv)
{
    int c;
    char *host   = ((char*)(DEFAULT_HOST));
    char *user = 0;
    char *server = ((char*)(DEFAULT_SERVER));
    char *rtable = ((char*)(DEFAULT_RTABLE));
    char *sr_template = NULL;
    unsigned int port = DEFAULT_PORT;
    unsigned int topo = DEFAULT_TOPO;
    char *logfile = 0;
    struct sr_instance sr;

    sr.f_interface[0] = 'n';
    sr.f_interface[1] = 'o';
    sr.f_interface[2] = '\0';

    sr.number_of_lsus = 5;


    printf("Using %s\n", VERSION_INFO);

    while ((c = getopt(argc, argv, "hs:v:p:u:t:r:l:T:f:c:")) != EOF)
    {
        switch (c)
        {
            case 'h':
                usage(argv[0]);
                exit(0);
                break;
            case 'p':
                port = atoi((char *) optarg);
                break;
            case 't':
                topo = atoi((char *) optarg);
                break;
            case 'v':
                host = optarg;
                break;
            case 'u':
                user = optarg;
                break;
            case 's':
                server = optarg;
                break;
            case 'l':
                logfile = optarg;
                break;
            case 'r':
                rtable = optarg;
                break;
            case 'T':
                sr_template = optarg;
                break;

            case 'f':
                for (unsigned int i = 0; i < strlen(optarg); i++)
                {
                    sr.f_interface[i] = optarg[i];
                }
                sr.f_interface[strlen(optarg)] = '\0';
                break;

            case 'c':
                sr.number_of_lsus = atoi((char *) optarg);
                break;

        } /* switch */
    } /* -- while -- */

    /* -- zero out sr instance -- */
    sr_init_instance(&sr);

    /* -- set up routing table from file -- */
    if(sr_template == NULL) {
        sr.sr_template[0] = '\0';
        sr_load_rt_wrap(&sr, rtable);
    }
    else
        strncpy(sr.sr_template, sr_template, 30);

    sr.topo_id = topo;
    strncpy(sr.host,host,32);

    if(! user )
    { sr_set_user(&sr); }
    else
    { strncpy(sr.user, user, 32); }

    /* -- set up file pointer for logging of raw packets -- */
    if(logfile != 0)
    {
        sr.logfile = sr_dump_open(logfile,0,PACKET_DUMP_SIZE);
        if(!sr.logfile)
        {
            fprintf(stderr,"Error opening up dump file %s\n",
                    logfile);
            exit(1);
        }
    }

    Debug("Client %s connecting to Server %s:%d\n", sr.user, server, port);
    if(sr_template)
        Debug("Requesting topology template %s\n", sr_template);
    else {
        Debug("Requesting topology %d\n", topo);
        port = 12345; /* DGU TMP: use old port (no auth needed) */
        Debug("(falling back to original port for -t type connection)\n");
    }

    /* connect to server and negotiate session */
    if(sr_connect_to_server(&sr,port,server) == -1)
    {
        return 1;
    }

    if(sr_template != NULL) { /* we've recv'd the rtable now, so read it in */
        Debug("Connected to new instantiation of topology template %s\n", sr_template);
        sr_load_rt_wrap(&sr, ((char*)("rtable.vrhost")));
    }

    /* call router init (for arp subsystem etc.) */
    sr_init(&sr);

    /* -- whizbang main loop ;-) */
    while( sr_read_from_server(&sr) == 1);

    sr_destroy_instance(&sr);

    return 0;
}/* -- main -- */
Beispiel #3
0
int main(int argc, char **argv)
{
    int c;
    char *host   = DEFAULT_HOST;
    char *client = 0;
    char *server = DEFAULT_SERVER;
    char *rtable = DEFAULT_RTABLE;
    unsigned int port = DEFAULT_PORT;
    unsigned int topo = DEFAULT_TOPO;
    char *logfile = 0;
    struct sr_instance sr;

    while ((c = getopt(argc, argv, "hs:v:p:c:t:r:l:")) != EOF)
    {
        switch (c) 
        {
            case 'h':
                usage(argv[0]); 
                exit(0);
                break;
            case 'p':
                port = atoi((char *) optarg);
                break;
            case 't':
                topo = atoi((char *) optarg);
                break;
            case 'v':
                host = optarg; 
                break;
            case 'c':
                client = optarg; 
                break;
            case 's':
                server = optarg; 
                break;
            case 'l':
                logfile = optarg; 
                break;
            case 'r':
                rtable = optarg; 
                break;
        } /* switch */
    } /* -- while -- */

    /* -- zero out sr instance -- */
    sr_init_instance(&sr);

    /* -- set up routing table from file -- */
    if(sr_load_rt(&sr, rtable) != 0)
    {
        fprintf(stderr,"Error setting up routing table from file %s\n",
                rtable);
        exit(1);
    }


    printf("Loading routing table\n");
    printf("---------------------------------------------\n");
    sr_print_routing_table(&sr);
    printf("---------------------------------------------\n");

    sr.topo_id = topo;
    strncpy(sr.host,host,32);

    if(! client )
    { sr_set_user(&sr); }
    else
    { strncpy(sr.user, client, 32); }

    /* -- set up file pointer for logging of raw packets -- */
    if(logfile != 0)
    {
        sr.logfile = sr_dump_open(logfile,0,PACKET_DUMP_SIZE);  
        if(!sr.logfile)
        {
            fprintf(stderr,"Error opening up dump file %s\n",
                    logfile);
            exit(1);
        }
    }

    Debug("Client %s connecting to Server %s:%d\n", sr.user, server, port);
    Debug("Requesting topology %d\n", topo);

    /* connect to server and negotiate session */
    if(sr_connect_to_server(&sr,port,server) == -1)
    {
        return 1;
    }

    /* call router init (for arp subsystem etc.) */
    sr_init(&sr);
    
    /* -- whizbang main loop ;-) */
    while( sr_read_from_server(&sr) == 1);
   
    sr_destroy_instance(&sr);

    return 0;
}/* -- main -- */
Beispiel #4
0
void* sr_init_low_level_subystem(int argc, char **argv)
{
    /* -- VNS default parameters -- */
    char  *host   = "vrhost";
    char  *rtable = "rtable";
    char  *server = "171.67.71.18";
    char  *cpuhw  = CPU_HW_FILENAME;
    uint16_t port =  12345;
    uint16_t topo =  0;

    char  *client = 0;
    char  *logfile = 0;


    char  *interface = "nf2c0"; /* Default NetFPGA interface for card 0 */

    /* -- singleton instance of router, passed to sr_get_global_instance
          to become globally accessible                                  -- */
    static struct sr_instance* sr = 0;

    int c;

    if ( sr )
    {
        fprintf(stderr,  "Warning: because of limitations in lwip, ");
        fprintf(stderr,  " sr supports 1 router instance per process. \n ");
        return 0;
    }

    sr = (struct sr_instance*) malloc(sizeof(struct sr_instance));

    while ((c = getopt(argc, argv, "hs:v:p:c:t:r:l:i:m:")) != EOF)
    {
        switch (c)
        {
            case 'h':
                usage(argv[0]);
                exit(0);
                break;
            case 'p':
                port = atoi((char *) optarg);
                break;
            case 't':
                topo = atoi((char *) optarg);
                break;
            case 'v':
                host = optarg;
                break;
            case 'r':
                rtable = optarg;
                break;
            case 'c':
                client = optarg;
                break;
            case 's':
                server = optarg;
                break;
            case 'l':
                logfile = optarg;
                break;
            case 'm':
                cpuhw = optarg;
                break;
            case 'i':
                interface = optarg;
                if (strncmp(interface, "nf2c", 4) != 0) {
                        usage(argv[0]);
                        exit(1);
                }
                break;
        } /* switch */
    } /* -- while -- */

        /* Set the NetFPGA interface name */
    strncpy(sr->interface, interface, 31);
    sr->interface[31] = '\0';

#ifdef _CPUMODE_
    Debug(" \n ");
    Debug(" < -- Starting sr in cpu mode -- >\n");
    Debug(" \n ");
#else
    Debug(" < -- Starting sr in router mode  -- >\n");
    Debug(" \n ");
#endif /* _CPUMODE_ */

    /* -- required by lwip, must be called from the main thread -- */
    sys_thread_init();

    /* -- zero out sr instance and set default configurations -- */
    sr_init_instance(sr);

#ifdef _CPUMODE_
    sr->topo_id = 0;
    strncpy(sr->vhost,  "cpu",    SR_NAMELEN);
    strncpy(sr->rtable, rtable, SR_NAMELEN);

    if ( sr_cpu_init_hardware(sr, cpuhw) )
    { exit(1); }
    sr_integ_hw_setup(sr);
#else
    sr->topo_id = topo;
    strncpy(sr->vhost,  host,    SR_NAMELEN);
    strncpy(sr->rtable, rtable, SR_NAMELEN);
#endif /* _CPUMODE_ */

    if(! client )
    { sr_set_user(sr); }
    else
    { strncpy(sr->user, client,  SR_NAMELEN); }

    if ( gethostname(sr->lhost,  SR_NAMELEN) == -1 )
    {
        perror("gethostname(..)");
        return 0;
    }

    /* -- log all packets sent/received to logfile (if non-null) -- */
    sr_vns_init_log(sr, logfile);

    sr_lwip_transport_startup();


#ifndef _CPUMODE_
    Debug("Client %s connecting to Server %s:%d\n",
            sr->user, server, port);
    Debug("Requesting topology %d\n", topo);

    /* -- connect to VNS and reserve host -- */
    if(sr_vns_connect_to_server(sr,port,server) == -1)
    { return 0; }

    /* read from server until the hardware is setup */
    while (! sr->hw_init )
    {
        if(sr_vns_read_from_server(sr) == -1 )
        {
            fprintf(stderr, "Error: could not get hardware information ");
            fprintf(stderr, "from the server");
            sr_destroy_instance(sr);
            return 0;
        }
    }
#endif

    /* -- start low-level network thread, dissown sr -- */
    sys_thread_new(sr_low_level_network_subsystem, (void*)sr /* dissown */);

    return sr->interface_subsystem;
}/* -- main -- */