From 9247a4c0998de14ef5993822cac75b4a6327ee1e Mon Sep 17 00:00:00 2001 From: Franciszek Malinka Date: Mon, 19 Apr 2021 18:05:41 +0200 Subject: Router working finally --- Semestr 4/sieci/pracownia2/router/router.c | 74 ++++++++++++++++-------------- 1 file changed, 39 insertions(+), 35 deletions(-) (limited to 'Semestr 4/sieci/pracownia2/router/router.c') diff --git a/Semestr 4/sieci/pracownia2/router/router.c b/Semestr 4/sieci/pracownia2/router/router.c index 031ead8..7262ee6 100644 --- a/Semestr 4/sieci/pracownia2/router/router.c +++ b/Semestr 4/sieci/pracownia2/router/router.c @@ -7,74 +7,78 @@ #include #include #include +#include #include "network_addr.h" #include "utils.h" +#include "dist_vector.h" -uint16_t read_configuration(struct network_addr** networks) { +uint16_t read_configuration(struct network_addr** networks, uint16_t **dists) { uint16_t n; scanf("%hd", &n); *networks = malloc(n * sizeof(struct network_addr)); + *dists = malloc(n * sizeof(uint16_t)); for (int i = 0; i < n; i++) { char addr[20]; char _dist[10]; uint16_t dist; scanf(" %s %s %hd", addr, _dist, &dist); - (*networks)[i] = stora(addr); - (*networks)[i].distance = dist; + (*networks)[i] = stona(addr); + (*dists)[i] = dist; } return n; } -void listen_for_routers(int sockfd, int timeout, int networks_number, struct network_addr *netowrks) { - printf("Listening for %dms.\n", timeout); +void listen_for_routers(int sockfd, int timeout, int networks_number, struct network_addr *networks, uint16_t *dists, list_t *dv) { + // printf("Listening for %dms.\n", timeout); + char buffer[IP_MAXPACKET + 1]; + struct sockaddr_in sender; + while (poll_socket_modify_timeout(sockfd, &timeout)) { - printf("Poll returned, remaining timeout: %dms.\n", timeout); - recv_and_print(sockfd, networks_number, netowrks); - } - printf("Finished listening\n\n"); -} + size_t buf_len = recv_message(sockfd, buffer, &sender); + struct vector_item new_item = parse_message(buffer, &sender); + // char addr[20]; + // inet_ntop(AF_INET, &sender.sin_addr, addr, sizeof(addr)); + // printf("Via ip: %s\n", addr); -int send_distance_vector(int sockfd, struct in_addr network) { - char* message = "Hello server! My name is S1\n"; - ssize_t message_len = strlen(message); - int result; + if (!is_from_network(sender.sin_addr, new_item.network)) { + for (int i = 0; i < networks_number; i++) { + if (is_from_network(sender.sin_addr, networks[i])) { + new_item.distance += dists[i]; + break; + } + } + new_item.is_connected_directly = false; + } - char addr[20]; - inet_ntop(AF_INET, &network, addr, sizeof(addr)); - printf("Sending datagram to %s\n", addr); - if ((result = send_message(sockfd, message, message_len, network)) != message_len) { - fprintf(stderr, "sendto error: %s\n", strerror(errno)); + update_dv_new_item(dv, new_item); } + update_dv_reachability(dv); + // printf("Finished listening\n\n"); } -void propagate_distance_vector(int sockfd, int networks_number, struct network_addr *networks) { - printf("Propagating distance vector\n"); - for (int i = 0; i < networks_number; i++) { - struct in_addr broadcast_address = get_broadcast_address(networks[i]); - send_distance_vector(sockfd, broadcast_address); - } - printf("Distance vector propagated.\n\n"); -} +void router_loop(int sockfd, int networks_number, struct network_addr *networks, uint16_t *dists) { + list_t dv = create_list(); + init_dv(&dv, networks_number, networks); -void router_loop(int sockfd, int networks_number, struct network_addr *networks) { printf("Starting the router loop...\n"); for (;;) { - listen_for_routers(sockfd, TURN_LEN_MS, networks_number, networks); - propagate_distance_vector(sockfd, networks_number, networks); + print_dv(&dv); + propagate_distance_vector(sockfd, networks_number, networks, dists, &dv); + listen_for_routers(sockfd, TURN_LEN_MS, networks_number, networks, dists, &dv); } } int main() { struct network_addr* networks; - int n = read_configuration(&networks); - for (int i = 0; i < n; i++) { - pretty_print(networks[i]); - } + uint16_t *dists; + int n = read_configuration(&networks, &dists); int sockfd = get_socket(); bind_to_port(sockfd, SERVER_PORT); - router_loop(sockfd, n, networks); + + router_loop(sockfd, n, networks, dists); close(sockfd); free(networks); + free(dists); } \ No newline at end of file -- cgit v1.2.3