From 5c974d1f80d6bbbcbbe7138fec974a79379702b2 Mon Sep 17 00:00:00 2001 From: Franciszek Malinka Date: Tue, 16 Mar 2021 19:31:22 +0100 Subject: pracownia 1 z sieci --- Semestr 4/Pstwo/RP1R_03.pdf | Bin 0 -> 122308 bytes Semestr 4/sieci/pracownia1/icmp_checksum.c | 10 +++ Semestr 4/sieci/pracownia1/icmp_receive.c | 53 +++++++++++++++ Semestr 4/sieci/pracownia1/makefile | 12 ++++ Semestr 4/sieci/pracownia1/p1.pdf | Bin 0 -> 79285 bytes Semestr 4/sieci/pracownia1/traceroute.c | 106 +++++++++++++++++++++++++++++ Semestr 4/sieci/warsztaty2/w2.pdf | Bin 0 -> 190886 bytes Semestr 4/sieci/wyklady/lec1.pdf | Bin 0 -> 8280250 bytes Semestr 4/sieci/wyklady/lec2.pdf | Bin 0 -> 5058364 bytes 9 files changed, 181 insertions(+) create mode 100644 Semestr 4/Pstwo/RP1R_03.pdf create mode 100644 Semestr 4/sieci/pracownia1/icmp_checksum.c create mode 100644 Semestr 4/sieci/pracownia1/icmp_receive.c create mode 100644 Semestr 4/sieci/pracownia1/makefile create mode 100644 Semestr 4/sieci/pracownia1/p1.pdf create mode 100644 Semestr 4/sieci/pracownia1/traceroute.c create mode 100644 Semestr 4/sieci/warsztaty2/w2.pdf create mode 100644 Semestr 4/sieci/wyklady/lec1.pdf create mode 100644 Semestr 4/sieci/wyklady/lec2.pdf diff --git a/Semestr 4/Pstwo/RP1R_03.pdf b/Semestr 4/Pstwo/RP1R_03.pdf new file mode 100644 index 0000000..164c2cd Binary files /dev/null and b/Semestr 4/Pstwo/RP1R_03.pdf differ diff --git a/Semestr 4/sieci/pracownia1/icmp_checksum.c b/Semestr 4/sieci/pracownia1/icmp_checksum.c new file mode 100644 index 0000000..c9dc96b --- /dev/null +++ b/Semestr 4/sieci/pracownia1/icmp_checksum.c @@ -0,0 +1,10 @@ +u_int16_t compute_icmp_checksum (const void *buff, int length) +{ + u_int32_t sum; + const u_int16_t* ptr = buff; + assert (length % 2 == 0); + for (sum = 0; length > 0; length -= 2) + sum += *ptr++; + sum = (sum >> 16) + (sum & 0xffff); + return (u_int16_t)(~(sum + (sum >> 16))); +} diff --git a/Semestr 4/sieci/pracownia1/icmp_receive.c b/Semestr 4/sieci/pracownia1/icmp_receive.c new file mode 100644 index 0000000..07d3b69 --- /dev/null +++ b/Semestr 4/sieci/pracownia1/icmp_receive.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include +#include + + +void print_as_bytes (unsigned char* buff, ssize_t length) +{ + for (ssize_t i = 0; i < length; i++, buff++) + printf ("%.2x ", *buff); +} + + +int main() +{ + int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); + if (sockfd < 0) { + fprintf(stderr, "socket error: %s\n", strerror(errno)); + return EXIT_FAILURE; + } + + for (;;) { + + struct sockaddr_in sender; + socklen_t sender_len = sizeof(sender); + u_int8_t buffer[IP_MAXPACKET]; + + ssize_t packet_len = recvfrom (sockfd, buffer, IP_MAXPACKET, 0, (struct sockaddr*)&sender, &sender_len); + if (packet_len < 0) { + fprintf(stderr, "recvfrom error: %s\n", strerror(errno)); + return EXIT_FAILURE; + } + + char sender_ip_str[20]; + inet_ntop(AF_INET, &(sender.sin_addr), sender_ip_str, sizeof(sender_ip_str)); + printf ("Received IP packet with ICMP content from: %s\n", sender_ip_str); + + struct ip* ip_header = (struct ip*) buffer; + ssize_t ip_header_len = 4 * ip_header->ip_hl; + + printf ("IP header: "); + print_as_bytes (buffer, ip_header_len); + printf("\n"); + + printf ("IP data: "); + print_as_bytes (buffer + ip_header_len, packet_len - ip_header_len); + printf("\n\n"); + } + + return EXIT_SUCCESS; +} diff --git a/Semestr 4/sieci/pracownia1/makefile b/Semestr 4/sieci/pracownia1/makefile new file mode 100644 index 0000000..63f9518 --- /dev/null +++ b/Semestr 4/sieci/pracownia1/makefile @@ -0,0 +1,12 @@ +CC=gcc +CFLAGS=-g -Wall -Wextra -Wshadow -pedantic -fsanitize=address -fsanitize=undefined + +TARGET=traceroute + +all: $(TARGET) + +$(TARGET): $(TARGET).c + $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c + +clean: + $(RM) $(TARGET) \ No newline at end of file diff --git a/Semestr 4/sieci/pracownia1/p1.pdf b/Semestr 4/sieci/pracownia1/p1.pdf new file mode 100644 index 0000000..4b06555 Binary files /dev/null and b/Semestr 4/sieci/pracownia1/p1.pdf differ diff --git a/Semestr 4/sieci/pracownia1/traceroute.c b/Semestr 4/sieci/pracownia1/traceroute.c new file mode 100644 index 0000000..7918957 --- /dev/null +++ b/Semestr 4/sieci/pracownia1/traceroute.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_TTL 30 +#define MESSAGES_PER_TTL 3 + +void print_as_bytes (unsigned char* buff, ssize_t length) +{ + for (ssize_t i = 0; i < length; i++, buff++) + printf ("%.2x ", *buff); +} + +struct sockaddr_in get_sockaddr_from_ip(char *ip) { + struct sockaddr_in sock; + bzero(&sock, sizeof(sock)); + sock.sin_family = AF_INET; + if (!inet_pton(AF_INET, ip, &sock.sin_addr)) { + fprintf(stderr, "Given ip is invalid: %s\n", ip); + exit(EXIT_FAILURE); + } + return sock; +} + +int create_raw_icmp_socket() { + int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); + if (sockfd < 0) { + fprintf(stderr, "socket error: %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + return sockfd; +} + +uint16_t compute_icmp_checksum (const void *buff, int length) +{ + uint32_t sum; + const uint16_t* ptr = buff; + assert (length % 2 == 0); + for (sum = 0; length > 0; length -= 2) + sum += *ptr++; + sum = (sum >> 16) + (sum & 0xffff); + return (uint16_t)(~(sum + (sum >> 16))); +} + +struct icmp create_icmp_header() { + static uint16_t pid = 0; + static uint16_t seq = 0; + + struct icmp header; + header.icmp_type = ICMP_ECHO; + header.icmp_code = 0; + header.icmp_id = ++pid; + header.icmp_seq = ++seq; + header.icmp_cksum = 0; + header.icmp_cksum = compute_icmp_checksum( + (uint16_t*)&header, sizeof(header)); + + return header; +} + +void send_icmp_packet(int sockfd, struct sockaddr_in *destination, int ttl) { + struct icmp header = create_icmp_header(); + setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(int)); + + printf("%ld %d\n", destination->sin_addr.s_addr, sockfd); + ssize_t bytes_sent = sendto( + sockfd, + &header, + sizeof(header), + 0, + (struct sockaddr*)destination, + sizeof(*destination) + ); + if (bytes_sent == -1) { + fprintf(stderr, "Error while sending ICMP packet: %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + fprintf(stdout, "Bytes sent: %ld\n", bytes_sent); +} + +int traceroute(struct sockaddr_in *destination) { + int sockfd = create_raw_icmp_socket(); + + struct sockaddr_in sender; + socklen_t sender_len = sizeof(sender); + uint8_t buffer[IP_MAXPACKET]; + for (int ttl = 1; ttl <= MAX_TTL; ++ttl) { + send_icmp_packet(sockfd, destination, ttl); + } +} + +int main(int argc, char * argv[]) { + if (argc < 2) { + fprintf(stderr, "Usage:\n\t%s [host ip]\n", argv[0]); + return 1; + } + + struct sockaddr_in destination = get_sockaddr_from_ip(argv[1]); + traceroute(&destination); +} \ No newline at end of file diff --git a/Semestr 4/sieci/warsztaty2/w2.pdf b/Semestr 4/sieci/warsztaty2/w2.pdf new file mode 100644 index 0000000..60cdc33 Binary files /dev/null and b/Semestr 4/sieci/warsztaty2/w2.pdf differ diff --git a/Semestr 4/sieci/wyklady/lec1.pdf b/Semestr 4/sieci/wyklady/lec1.pdf new file mode 100644 index 0000000..5da8f03 Binary files /dev/null and b/Semestr 4/sieci/wyklady/lec1.pdf differ diff --git a/Semestr 4/sieci/wyklady/lec2.pdf b/Semestr 4/sieci/wyklady/lec2.pdf new file mode 100644 index 0000000..edb1398 Binary files /dev/null and b/Semestr 4/sieci/wyklady/lec2.pdf differ -- cgit v1.2.3