aboutsummaryrefslogtreecommitdiff
path: root/semestr-4/sieci/pracownia2/franciszek_malinka/utils.h
blob: edf90d0b7d03725fb9de1f5cf8b732884122c3b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#ifndef UTILS_H
#define UTILS_H
#define UTILS_H

#include "config.h"
#include <stdint.h>
#include <time.h>
#include <poll.h>
#include "network_addr.h"
#include "dist_vector.h"

#define NS_TO_MS(X) ((long)(X) / (long)1000000)
#define S_TO_MS(X) ((long)(X) * (long)1000)

/* Returns a UDP socket. */
int get_socket();

/* Binds socket to given port and set the broadcast permission. */
void bind_to_port(int sockfd, uint16_t port);

/* Computes the time elapsed between start and finish in miliseconds. */
long get_time_interval(struct timespec start, struct timespec finish);

/* Polls given socket with given timeout and changes the timeout accordingly. */
int poll_socket_modify_timeout(int sockfd, int *timeout);

/* For debug purposes only. Recieves and prints UDP message. */
void recv_and_print(int sockfd, int networks_number, struct network_addr *networks);

/* Sends message in buffer of length buffer_len to addr through given socket. 
 * IT DOES NOT TERMINATE THE PROGRAM IF SENDTO RETURNS ANY ERRORS! 
 * One must handle the errors on their own. 
 */  
size_t send_message(int sockfd, char *buffer, int buffer_len, struct in_addr addr);

/* Receive message and write it to buffer. */
size_t recv_message(int sockfd, char *buffer, struct sockaddr_in *sender);

/* Parse datagram into a vector item. */
struct vector_item parse_message(char *buffer, struct sockaddr_in *sender);

/* Listnes for routers for timeout ms. */
void listen_for_routers(int sockfd, int timeout, int networks_number, struct network_addr *networks, uint16_t *dists, list_t *dv);

/* Propagates dv to all connected networks. */
void propagate_distance_vector(int sockfd, int networks_number, struct network_addr *networks, uint16_t *dists, list_t *dv);

/* Checks if given address is in network range. */
bool is_from_network(struct in_addr ip_addr, struct network_addr network);
 

#endif