aboutsummaryrefslogtreecommitdiff
path: root/Semestr 4/sieci/pracownia2/router/router.c
diff options
context:
space:
mode:
Diffstat (limited to 'Semestr 4/sieci/pracownia2/router/router.c')
-rw-r--r--Semestr 4/sieci/pracownia2/router/router.c74
1 files changed, 39 insertions, 35 deletions
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 <stdint.h>
#include <stdlib.h>
#include <unistd.h>
+#include <limits.h>
#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