static void discovery (int n, PPPoEConnection* conns) { int a; if (open_interfaces (n, conns)) { for (a = 0; a < MAX_ATTEMPTS; a++) { ADD2LOG ("Attempt number %d\n", a + 1); if (!send_padi (n, conns)) break; if (wait_for_pado (n, conns)) break; } } close_intefaces (n, conns); }
int main(int argc, char** argv) { int listening_socket; int socket_to_client; int yes_local; in_port_t port_num; struct sockaddr_in local_addr; struct sockaddr_in client_addr; socklen_t client_len; int num_netfpgas; struct nf2device *nf2devices[10]; yes_local=1; DPRINTF("Starting proxy...\n"); if (argc < 4) { printf("Usage: reg_proxy_server <num_NetFPGAs> <ip_addr> <port_num>\n"); printf(" num_NetFPGAs is the number of netfpga card in the system.\n"); printf(" ip_addr is the address to accept connections on.\n"); printf(" port_num is the port number to accept connections on.\n"); exit(0); } /* get the parameters for the proxy */ if (!inet_aton(argv[2], &local_addr.sin_addr)) { perror("inet_aton"); fprintf(stderr, "Error: IP address specified is invalid.\n"); exit(1); } port_num = strtol(argv[3], NULL, 0); if (errno == EINVAL || errno == ERANGE || port_num < 1024 || port_num > 65535) { fprintf(stderr, "Error: port number has to be between 1024 and 65535. Saw %s.\n", argv[3]); exit(1); } num_netfpgas = strtol(argv[1], NULL, 0); if (num_netfpgas < 0 || num_netfpgas > 10) { fprintf(stderr, "Error: Number of NetFPGAs has to be between 1 and 10. Saw %s.\n", argv[1]); exit(1); } DPRINTF("Args have been parsed. num_netfpgas=%d\n", num_netfpgas); open_interfaces(nf2devices, num_netfpgas); DPRINTF("Interfaces now open.\n"); DPRINTF("Starting a connection...\n"); /* fill in the local address struct */ memset(&local_addr, 0, sizeof(SA)); local_addr.sin_family = AF_INET; local_addr.sin_port = htons(port_num); /* get a socket fd */ if ( (listening_socket = socket(PF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); DPRINTF(); exit(1); } /* allow reuse to get around port in use problem */ if (setsockopt(listening_socket, SOL_SOCKET, SO_REUSEADDR, &yes_local, sizeof(int)) == -1) { perror("setsockopt"); DPRINTF(); exit(1); } /* bind the socket to a port */ if (bind(listening_socket, (SA *)&local_addr, sizeof(SA)) < 0) { perror("bind"); DPRINTF("Exiting...\n"); exit(1); } DPRINTF("Socket is now bound to port %d\n", port_num); /* start listening to connections */ if (listen(listening_socket, 10) < 0) { perror("listen"); DPRINTF(); close(listening_socket); exit(1); } DPRINTF("Now listening to connections\n"); /* loop until we are interrupted, servicing every request */ while (1) { client_len=sizeof(client_addr); /* accept the connection and start parsing */ if ( (socket_to_client = accept(listening_socket, (SA *) &client_addr, &client_len)) < 0) { DPRINTF(); perror("accept"); continue; } DPRINTF("Accepted connection from client"); /* read the request, parse, * send response back to client */ if (parse_request(socket_to_client, nf2devices, num_netfpgas) < 0) { DPRINTF(); fprintf(stderr, "Error parsing the request\n"); } close(socket_to_client); } return 0; }