From 747abf3edf0f6cb98b4c1ef2d807229393defd90 Mon Sep 17 00:00:00 2001 From: Mara-Ioana Nicolae Date: Fri, 13 May 2022 08:47:14 +0300 Subject: [PATCH 1/5] lab10: Add empty skel Signed-off-by: Mara-Ioana Nicolae --- .../networking/1-2-netfilter/kernel/Kbuild | 3 + .../networking/1-2-netfilter/kernel/filter.c | 125 ++++++++++++++++++ .../networking/1-2-netfilter/kernel/filter.h | 11 ++ .../networking/1-2-netfilter/user/.gitignore | 1 + .../networking/1-2-netfilter/user/Makefile | 16 +++ .../networking/1-2-netfilter/user/test-1.sh | 25 ++++ .../networking/1-2-netfilter/user/test-2.sh | 41 ++++++ .../networking/1-2-netfilter/user/test.c | 73 ++++++++++ .../labs/skels/networking/3-4-tcp-sock/Kbuild | 3 + .../skels/networking/3-4-tcp-sock/tcp_sock.c | 93 +++++++++++++ .../skels/networking/3-4-tcp-sock/test-3.sh | 18 +++ .../skels/networking/3-4-tcp-sock/test-4.sh | 29 ++++ tools/labs/skels/networking/5-udp-sock/Kbuild | 3 + .../skels/networking/5-udp-sock/test-5.sh | 26 ++++ .../skels/networking/5-udp-sock/udp_sock.c | 110 +++++++++++++++ tools/labs/skels/networking/netcat | Bin 0 -> 22140 bytes 16 files changed, 577 insertions(+) create mode 100644 tools/labs/skels/networking/1-2-netfilter/kernel/Kbuild create mode 100644 tools/labs/skels/networking/1-2-netfilter/kernel/filter.c create mode 100644 tools/labs/skels/networking/1-2-netfilter/kernel/filter.h create mode 100644 tools/labs/skels/networking/1-2-netfilter/user/.gitignore create mode 100644 tools/labs/skels/networking/1-2-netfilter/user/Makefile create mode 100644 tools/labs/skels/networking/1-2-netfilter/user/test-1.sh create mode 100644 tools/labs/skels/networking/1-2-netfilter/user/test-2.sh create mode 100644 tools/labs/skels/networking/1-2-netfilter/user/test.c create mode 100644 tools/labs/skels/networking/3-4-tcp-sock/Kbuild create mode 100644 tools/labs/skels/networking/3-4-tcp-sock/tcp_sock.c create mode 100644 tools/labs/skels/networking/3-4-tcp-sock/test-3.sh create mode 100644 tools/labs/skels/networking/3-4-tcp-sock/test-4.sh create mode 100644 tools/labs/skels/networking/5-udp-sock/Kbuild create mode 100644 tools/labs/skels/networking/5-udp-sock/test-5.sh create mode 100644 tools/labs/skels/networking/5-udp-sock/udp_sock.c create mode 100644 tools/labs/skels/networking/netcat diff --git a/tools/labs/skels/networking/1-2-netfilter/kernel/Kbuild b/tools/labs/skels/networking/1-2-netfilter/kernel/Kbuild new file mode 100644 index 00000000000000..8d831f886a624c --- /dev/null +++ b/tools/labs/skels/networking/1-2-netfilter/kernel/Kbuild @@ -0,0 +1,3 @@ +EXTRA_CFLAGS = -g + +obj-m = filter.o diff --git a/tools/labs/skels/networking/1-2-netfilter/kernel/filter.c b/tools/labs/skels/networking/1-2-netfilter/kernel/filter.c new file mode 100644 index 00000000000000..a218289c7bbcce --- /dev/null +++ b/tools/labs/skels/networking/1-2-netfilter/kernel/filter.c @@ -0,0 +1,125 @@ +/* + * SO2 - Networking Lab (#10) + * + * Exercise #1, #2: simple netfilter module + * + * Code skeleton. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "filter.h" + +MODULE_DESCRIPTION("Simple netfilter module"); +MODULE_AUTHOR("SO2"); +MODULE_LICENSE("GPL"); + +#define LOG_LEVEL KERN_ALERT +#define MY_DEVICE "filter" + +static struct cdev my_cdev; +static atomic_t ioctl_set; +static unsigned int ioctl_set_addr; + + +/* Test ioctl_set_addr if it has been set. + */ +static int test_daddr(unsigned int dst_addr) +{ + int ret = 0; + + /* TODO 2: return non-zero if address has been set + * *and* matches dst_addr + */ + + return ret; +} + +/* TODO 1: netfilter hook function */ + +static int my_open(struct inode *inode, struct file *file) +{ + return 0; +} + +static int my_close(struct inode *inode, struct file *file) +{ + return 0; +} + +static long my_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + switch (cmd) { + case MY_IOCTL_FILTER_ADDRESS: + /* TODO 2: set filter address from arg */ + break; + + default: + return -ENOTTY; + } + + return 0; +} + +static const struct file_operations my_fops = { + .owner = THIS_MODULE, + .open = my_open, + .release = my_close, + .unlocked_ioctl = my_ioctl +}; + +/* TODO 1: define netfilter hook operations structure */ + +int __init my_hook_init(void) +{ + int err; + + /* register filter device */ + err = register_chrdev_region(MKDEV(MY_MAJOR, 0), 1, MY_DEVICE); + if (err != 0) + return err; + + atomic_set(&ioctl_set, 0); + ioctl_set_addr = 0; + + /* init & add device */ + cdev_init(&my_cdev, &my_fops); + cdev_add(&my_cdev, MKDEV(MY_MAJOR, 0), 1); + + /* TODO 1: register netfilter hook */ + + return 0; + +out: + /* cleanup */ + cdev_del(&my_cdev); + unregister_chrdev_region(MKDEV(MY_MAJOR, 0), 1); + + return err; +} + +void __exit my_hook_exit(void) +{ + /* TODO 1: unregister hook */ + + /* cleanup device */ + cdev_del(&my_cdev); + unregister_chrdev_region(MKDEV(MY_MAJOR, 0), 1); +} + +module_init(my_hook_init); +module_exit(my_hook_exit); diff --git a/tools/labs/skels/networking/1-2-netfilter/kernel/filter.h b/tools/labs/skels/networking/1-2-netfilter/kernel/filter.h new file mode 100644 index 00000000000000..ad2f73c9fd000a --- /dev/null +++ b/tools/labs/skels/networking/1-2-netfilter/kernel/filter.h @@ -0,0 +1,11 @@ +#ifndef _FILTER_H_ +#define _FILTER_H_ + +#include + +/* ioctl command to pass address to filter driver */ +#define MY_IOCTL_FILTER_ADDRESS _IOW('k', 1, unsigned int) + +#define MY_MAJOR 42 + +#endif /* _FILTER_H_ */ diff --git a/tools/labs/skels/networking/1-2-netfilter/user/.gitignore b/tools/labs/skels/networking/1-2-netfilter/user/.gitignore new file mode 100644 index 00000000000000..ee4c92682341e4 --- /dev/null +++ b/tools/labs/skels/networking/1-2-netfilter/user/.gitignore @@ -0,0 +1 @@ +/test diff --git a/tools/labs/skels/networking/1-2-netfilter/user/Makefile b/tools/labs/skels/networking/1-2-netfilter/user/Makefile new file mode 100644 index 00000000000000..0d5af50006725c --- /dev/null +++ b/tools/labs/skels/networking/1-2-netfilter/user/Makefile @@ -0,0 +1,16 @@ +# +# SO2 - Networking Lab (#10) +# +# Makefile for test filter module +# + +CFLAGS = -Wall -static -m32 + +all: test + +test: test.c + +.PHONY: clean + +clean: + -rm -f test *~ *.o diff --git a/tools/labs/skels/networking/1-2-netfilter/user/test-1.sh b/tools/labs/skels/networking/1-2-netfilter/user/test-1.sh new file mode 100644 index 00000000000000..d78c482564c7ee --- /dev/null +++ b/tools/labs/skels/networking/1-2-netfilter/user/test-1.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# +# SO2 - Networking Lab (#10) +# +# Test script for exercise #1 +# + +# insert module +insmod ../kernel/filter.ko || exit 1 + +# listen for connections on localhost, port 60000 (run in background) +../../netcat -l -p 60000 & + +# wait for netcat to start listening +sleep 1 + +# connect to localhost, port 60000, starting a connection using local +# port number 600001; +echo "Should show up in filter." | ../../netcat -q 2 127.0.0.1 60000 + +# look for filter message in dmesg output +echo "Check dmesg output." + +# remove module +rmmod filter || exit 1 diff --git a/tools/labs/skels/networking/1-2-netfilter/user/test-2.sh b/tools/labs/skels/networking/1-2-netfilter/user/test-2.sh new file mode 100644 index 00000000000000..37d07cedb74ace --- /dev/null +++ b/tools/labs/skels/networking/1-2-netfilter/user/test-2.sh @@ -0,0 +1,41 @@ +#!/bin/sh +# +# SO2 - Networking Lab (#10) +# +# Test script for exercise #2 +# + +# insert module +insmod ../kernel/filter.ko || exit 1 + +# set filter IP address to 127.0.0.1 +./test 127.0.0.1 + +# listen for connections on localhost, port 60000 (run in background) +../../netcat -l -p 60000 & + +# wait for netcat to start listening +sleep 1 + +# connect to localhost, port 60000, starting a connection using local +# port number 600001; +echo "Should show up in filter." | ../../netcat -q 2 127.0.0.1 60000 + +# set filter IP address to 127.0.0.2 +./test 127.0.0.2 + +# listen for connections on localhost, port 60000 (run in background) +../../netcat -l -p 60000 & + +# wait for netcat to start listening +sleep 1 + +# connect to localhost, port 60000, starting a connection using local +# port number 600001; +echo "Should NOT show up in filter." | ../../netcat -q 2 127.0.0.1 60000 + +# look for filter message in dmesg output +echo "Check dmesg output." + +# remove module +rmmod filter || exit 1 diff --git a/tools/labs/skels/networking/1-2-netfilter/user/test.c b/tools/labs/skels/networking/1-2-netfilter/user/test.c new file mode 100644 index 00000000000000..775edb458286c7 --- /dev/null +++ b/tools/labs/skels/networking/1-2-netfilter/user/test.c @@ -0,0 +1,73 @@ +/* + * SO2 - Networking Lab (#11) + * + * Test filter module for exercise #2 + * + * Sends MY_IOCTL_FILTER_ADDRESS to filter module. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../kernel/filter.h" + +#define MY_DEVICE "/dev/filter" + + +static void print_usage(char *argv0) +{ + fprintf(stderr, "Usage: %s
\n" + "\taddress must be a string containing " + "an IP dotted address\n", argv0); +} + +int main(int argc, char **argv) +{ + int fd; + unsigned int addr; + + if (argc != 2) { + print_usage(argv[0]); + exit(EXIT_FAILURE); + } + + /* get address */ + addr = inet_addr(argv[1]); + + /* make device node */ + if (mknod(MY_DEVICE, 0644 | S_IFCHR, makedev(MY_MAJOR, 0)) < 0) { + if (errno != EEXIST) { + perror("mknod " MY_DEVICE); + exit(EXIT_FAILURE); + } + } + + /* open device */ + fd = open(MY_DEVICE, O_RDONLY); + if (fd < 0) { + perror("open " MY_DEVICE); + } else { + /* send ioctl */ + if (ioctl(fd, MY_IOCTL_FILTER_ADDRESS, &addr) < 0) + perror("ioctl MY_IOCTL_FILTER_ADDRESS"); + + /* close device */ + if (close(fd) < 0) + perror("close"); + } + + /* cleanup device node */ + if (unlink(MY_DEVICE) < 0) + perror("unlink " MY_DEVICE); + + return 0; +} diff --git a/tools/labs/skels/networking/3-4-tcp-sock/Kbuild b/tools/labs/skels/networking/3-4-tcp-sock/Kbuild new file mode 100644 index 00000000000000..fa55ec98e71d78 --- /dev/null +++ b/tools/labs/skels/networking/3-4-tcp-sock/Kbuild @@ -0,0 +1,3 @@ +EXTRA_CFLAGS = -Wall -g + +obj-m = tcp_sock.o diff --git a/tools/labs/skels/networking/3-4-tcp-sock/tcp_sock.c b/tools/labs/skels/networking/3-4-tcp-sock/tcp_sock.c new file mode 100644 index 00000000000000..2df4840da26201 --- /dev/null +++ b/tools/labs/skels/networking/3-4-tcp-sock/tcp_sock.c @@ -0,0 +1,93 @@ +/* + * SO2 - Networking Lab (#10) + * + * Exercise #3, #4: simple kernel TCP socket + * + * Code skeleton. + */ + +#include +#include +#include +#include +#include +#include +#include + +MODULE_DESCRIPTION("Simple kernel TCP socket"); +MODULE_AUTHOR("SO2"); +MODULE_LICENSE("GPL"); + +#define LOG_LEVEL KERN_ALERT +#define MY_TCP_PORT 60000 +#define LISTEN_BACKLOG 5 + +#define ON 1 +#define OFF 0 +#define DEBUG ON + +#if DEBUG == ON +#define LOG(s) \ + do { \ + printk(KERN_DEBUG s "\n"); \ + } while (0) +#else +#define LOG(s) \ + do {} while (0) +#endif + +#define print_sock_address(addr) \ + do { \ + printk(LOG_LEVEL "connection established to " \ + "%pI4:%d\n", \ + &addr.sin_addr.s_addr, \ + ntohs(addr.sin_port)); \ + } while (0) + +static struct socket *sock; /* listening (server) socket */ +static struct socket *new_sock; /* communication socket */ + +int __init my_tcp_sock_init(void) +{ + int err; + /* address to bind on */ + struct sockaddr_in addr = { + .sin_family = AF_INET, + .sin_port = htons(MY_TCP_PORT), + .sin_addr = { htonl(INADDR_LOOPBACK) } + }; + int addrlen = sizeof(addr); + /* address of peer */ + struct sockaddr_in raddr; + + /* TODO 1: create listening socket */ + + /* TODO 1: bind socket to loopback on port MY_TCP_PORT */ + + /* TODO 1: start listening */ + + /* TODO 2: create new socket for the accepted connection */ + + /* TODO 2: accept a connection */ + + /* TODO 2: get the address of the peer and print it */ + + return 0; + +out_release_new_sock: + /* TODO 2: cleanup socket for accepted connection */ +out_release: + /* TODO 1: cleanup listening socket */ +out: + return err; +} + +void __exit my_tcp_sock_exit(void) +{ + /* TODO 2: cleanup socket for accepted connection */ + + /* TODO 1: cleanup listening socket */ +} + +module_init(my_tcp_sock_init); +module_exit(my_tcp_sock_exit); diff --git a/tools/labs/skels/networking/3-4-tcp-sock/test-3.sh b/tools/labs/skels/networking/3-4-tcp-sock/test-3.sh new file mode 100644 index 00000000000000..b3289dbbe584ef --- /dev/null +++ b/tools/labs/skels/networking/3-4-tcp-sock/test-3.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# +# SO2 - Networking Lab (#10) +# +# Test script for exercise #3 +# + +set -x + +# insert module +insmod tcp_sock.ko || exit 1 + +# list all currently listening servers and active connections +# for both TCP and UDP, and don't resolve hostnames +netstat -tuan + +# remove module +rmmod tcp_sock || exit 1 diff --git a/tools/labs/skels/networking/3-4-tcp-sock/test-4.sh b/tools/labs/skels/networking/3-4-tcp-sock/test-4.sh new file mode 100644 index 00000000000000..345d85356070f4 --- /dev/null +++ b/tools/labs/skels/networking/3-4-tcp-sock/test-4.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# +# SO2 - Networking Lab (#10) +# +# Test script for exercise #3 +# + +set -x + +# insert module (run in background, it waits for a connection) +insmod tcp_sock.ko & + +# wait for module to start listening +sleep 1 + +# list all currently listening servers and active connections +# for both TCP and UDP, and don't resolve hostnames +netstat -tuan + +# connect to localhost, port 60000, starting a connection using local +# port number 600001; +echo "Should connect." | ../netcat -q 4 127.0.0.1 60000 -p 60001 & + +# wait for connection to be established then remove module +# (and close connection) +sleep 3 + +# remove module +rmmod tcp_sock || exit 1 diff --git a/tools/labs/skels/networking/5-udp-sock/Kbuild b/tools/labs/skels/networking/5-udp-sock/Kbuild new file mode 100644 index 00000000000000..e42a05b84ca634 --- /dev/null +++ b/tools/labs/skels/networking/5-udp-sock/Kbuild @@ -0,0 +1,3 @@ +EXTRA_CFLAGS = -Wall -g + +obj-m = udp_sock.o diff --git a/tools/labs/skels/networking/5-udp-sock/test-5.sh b/tools/labs/skels/networking/5-udp-sock/test-5.sh new file mode 100644 index 00000000000000..9db69a99254e18 --- /dev/null +++ b/tools/labs/skels/networking/5-udp-sock/test-5.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# +# SO2 - Networking Lab (#10) +# +# Test script for bonus exercise +# + +set -x + +# listen for UDP packets on localhost, port 60001 (run in background) +../netcat -l -u -p 60001 & + +# get pid of netcat +pid=$! + +# wait for netcat to start listening +sleep 1 + +# insert module, causing the message to be sent +insmod udp_sock.ko + +# remove module +rmmod udp_sock + +# kill netcat +kill $pid 2>/dev/null diff --git a/tools/labs/skels/networking/5-udp-sock/udp_sock.c b/tools/labs/skels/networking/5-udp-sock/udp_sock.c new file mode 100644 index 00000000000000..f698192613357f --- /dev/null +++ b/tools/labs/skels/networking/5-udp-sock/udp_sock.c @@ -0,0 +1,110 @@ +/* + * SO2 - Networking Lab (#10) + * + * Bonus: simple kernel UDP socket + * + * Code skeleton. + */ + +#include +#include +#include +#include +#include +#include + +MODULE_DESCRIPTION("Simple kernel UDP socket"); +MODULE_AUTHOR("SO2"); +MODULE_LICENSE("GPL"); + +#define LOG_LEVEL KERN_ALERT +#define MY_UDP_LOCAL_PORT 60000 +#define MY_UDP_REMOTE_PORT 60001 +#define MY_TEST_MESSAGE "kernelsocket\n" + +#define ON 1 +#define OFF 0 +#define DEBUG ON + +#if DEBUG == ON +#define LOG(s) \ + do { \ + printk(KERN_DEBUG s "\n"); \ + } while (0) +#else +#define LOG(s) \ + do {} while (0) +#endif + +#define print_sock_address(addr) \ + do { \ + printk(LOG_LEVEL "connection established to " \ + NIPQUAD_FMT ":%d\n", \ + NIPQUAD(addr.sin_addr.s_addr), \ + ntohs(addr.sin_port)); \ + } while (0) + +static struct socket *sock; /* UDP server */ + +/* send datagram */ +static int my_udp_msgsend(struct socket *s) +{ + /* address to send to */ + struct sockaddr_in raddr = { + .sin_family = AF_INET, + .sin_port = htons(MY_UDP_REMOTE_PORT), + .sin_addr = { htonl(INADDR_LOOPBACK) } + }; + int raddrlen = sizeof(raddr); + /* message */ + struct msghdr msg; + struct iovec iov; + char *buffer = MY_TEST_MESSAGE; + int len = strlen(buffer) + 1; + + /* TODO 1: build message */ + + /* TODO 1: send the message down the socket and return the + * error code. + */ + + return 0; +} + +int __init my_udp_sock_init(void) +{ + int err; + /* address to bind on */ + struct sockaddr_in addr = { + .sin_family = AF_INET, + .sin_port = htons(MY_UDP_LOCAL_PORT), + .sin_addr = { htonl(INADDR_LOOPBACK) } + }; + int addrlen = sizeof(addr); + + /* TODO 1: create UDP socket */ + + /* TODO 1: bind socket to loopback on port MY_UDP_LOCAL_PORT */ + + /* send message */ + err = my_udp_msgsend(sock); + if (err < 0) { + printk(LOG_LEVEL "can't send message\n"); + goto out_release; + } + + return 0; + +out_release: + /* TODO 1: release socket */ +out: + return err; +} + +void __exit my_udp_sock_exit(void) +{ + /* TODO 1: release socket */ +} + +module_init(my_udp_sock_init); +module_exit(my_udp_sock_exit); diff --git a/tools/labs/skels/networking/netcat b/tools/labs/skels/networking/netcat new file mode 100644 index 0000000000000000000000000000000000000000..27bf43d64c2191f8ef7e990813571d54a35b185b GIT binary patch literal 22140 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 XV?ME=d8uY@(Xz^k_kjf Date: Fri, 13 May 2022 09:29:05 +0300 Subject: [PATCH 2/5] lab10: Add solution for ex1 Signed-off-by: Mara-Ioana Nicolae --- .../networking/1-2-netfilter/kernel/filter.c | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/tools/labs/skels/networking/1-2-netfilter/kernel/filter.c b/tools/labs/skels/networking/1-2-netfilter/kernel/filter.c index a218289c7bbcce..65441e01e6b36f 100644 --- a/tools/labs/skels/networking/1-2-netfilter/kernel/filter.c +++ b/tools/labs/skels/networking/1-2-netfilter/kernel/filter.c @@ -50,6 +50,17 @@ static int test_daddr(unsigned int dst_addr) } /* TODO 1: netfilter hook function */ +static unsigned int my_nf_hookfn(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) { + struct iphdr *iph = ip_hdr(skb); + + if (iph->protocol == IPPROTO_TCP) { + struct tcphdr *tcph = tcp_hdr(skb); + printk("IP address is %pI4\n", &iph->saddr); + printk("Port number is %i\n", ntohs(tcph->source)); + } + + return NF_ACCEPT; +} static int my_open(struct inode *inode, struct file *file) { @@ -83,6 +94,12 @@ static const struct file_operations my_fops = { }; /* TODO 1: define netfilter hook operations structure */ +static struct nf_hook_ops ops = { + .hook = my_nf_hookfn, + .hooknum = NF_INET_LOCAL_OUT, + .pf = PF_INET, + .priority = NF_IP_PRI_FIRST +}; int __init my_hook_init(void) { @@ -101,6 +118,11 @@ int __init my_hook_init(void) cdev_add(&my_cdev, MKDEV(MY_MAJOR, 0), 1); /* TODO 1: register netfilter hook */ + err = nf_register_net_hook(&init_net, &ops); + if (err != 0) { + pr_info("nf_register_net_hook failed: %d\n", err); + return err; + } return 0; @@ -115,7 +137,7 @@ int __init my_hook_init(void) void __exit my_hook_exit(void) { /* TODO 1: unregister hook */ - + nf_unregister_net_hook(&init_net, &ops); /* cleanup device */ cdev_del(&my_cdev); unregister_chrdev_region(MKDEV(MY_MAJOR, 0), 1); From 37c28b8815013f93df2b7c4caad46bb9bd03b5cb Mon Sep 17 00:00:00 2001 From: Mara-Ioana Nicolae Date: Wed, 18 May 2022 00:10:27 +0300 Subject: [PATCH 3/5] lab10: Add solution for ex3 and ex4 --- tools/labs/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/labs/.gitignore b/tools/labs/.gitignore index 0f4ec23c13ab1e..6ee5834cfe2b4b 100644 --- a/tools/labs/.gitignore +++ b/tools/labs/.gitignore @@ -1,4 +1,4 @@ -/skels/ + vmlinux zImage serial.pts From c002d2406839d662d4416f74e1dfc52fd6ffe7d4 Mon Sep 17 00:00:00 2001 From: Mara-Ioana Nicolae Date: Wed, 18 May 2022 00:12:09 +0300 Subject: [PATCH 4/5] lab10: Add real solution for ex3 and ex4 oopsy Signed-off-by: Mara-Ioana Nicolae --- .../skels/networking/3-4-tcp-sock/tcp_sock.c | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/tools/labs/skels/networking/3-4-tcp-sock/tcp_sock.c b/tools/labs/skels/networking/3-4-tcp-sock/tcp_sock.c index 2df4840da26201..b57ec486e241f5 100644 --- a/tools/labs/skels/networking/3-4-tcp-sock/tcp_sock.c +++ b/tools/labs/skels/networking/3-4-tcp-sock/tcp_sock.c @@ -50,6 +50,7 @@ static struct socket *new_sock; /* communication socket */ int __init my_tcp_sock_init(void) { int err; + struct sockaddr_in sock_addr; /* address to bind on */ struct sockaddr_in addr = { .sin_family = AF_INET, @@ -61,23 +62,61 @@ int __init my_tcp_sock_init(void) struct sockaddr_in raddr; /* TODO 1: create listening socket */ + err = sock_create_kern(&init_net, PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock); + if (err < 0) { + pr_info("sock_create_kern failed\n"); + return -ENOMEM; + } /* TODO 1: bind socket to loopback on port MY_TCP_PORT */ + err = sock->ops->bind(sock, (struct sockaddr *) &addr, addrlen); + if (err < 0) { + pr_info("bind failed\n"); + goto out_release; + } /* TODO 1: start listening */ + err = sock->ops->listen(sock, LISTEN_BACKLOG); + if (err < 0) { + pr_info("listen failed\n"); + goto out_release; + } /* TODO 2: create new socket for the accepted connection */ + err = sock_create_lite(PF_INET, SOCK_STREAM, IPPROTO_TCP, &new_sock); + if (err < 0) { + pr_info("sock_create_lite failed\n"); + goto out; + } + new_sock->ops = sock->ops; /* TODO 2: accept a connection */ + err = sock->ops->accept(sock, new_sock, 0, true); + if (err == -EAGAIN) { + err = sock->ops->accept(sock, new_sock, 0, true); + } - /* TODO 2: get the address of the peer and print it */ + if (err) { + pr_info("accept failed\n"); + goto out_release_new_sock; + } + /* TODO 2: get the address of the peer and print it */ + err = sock->ops->getname(new_sock, + (struct sockaddr *)&sock_addr, 1); + if (err < 0) { + printk(LOG_LEVEL "can't find peer name\n"); + goto out_release_new_sock; + } + print_sock_address(sock_addr); return 0; out_release_new_sock: /* TODO 2: cleanup socket for accepted connection */ + sock_release(new_sock); out_release: /* TODO 1: cleanup listening socket */ + sock_release(sock); out: return err; } @@ -85,8 +124,10 @@ int __init my_tcp_sock_init(void) void __exit my_tcp_sock_exit(void) { /* TODO 2: cleanup socket for accepted connection */ + sock_release(new_sock); /* TODO 1: cleanup listening socket */ + sock_release(sock); } module_init(my_tcp_sock_init); From c1a3e4ab0913032ffd77c60af36723c842ddf2fe Mon Sep 17 00:00:00 2001 From: Mara-Ioana Nicolae Date: Wed, 18 May 2022 00:41:58 +0300 Subject: [PATCH 5/5] lab10: Add solution for ex5 Signed-off-by: Mara-Ioana Nicolae --- .../skels/networking/5-udp-sock/udp_sock.c | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/tools/labs/skels/networking/5-udp-sock/udp_sock.c b/tools/labs/skels/networking/5-udp-sock/udp_sock.c index f698192613357f..d42b37cdf19e61 100644 --- a/tools/labs/skels/networking/5-udp-sock/udp_sock.c +++ b/tools/labs/skels/networking/5-udp-sock/udp_sock.c @@ -63,10 +63,19 @@ static int my_udp_msgsend(struct socket *s) int len = strlen(buffer) + 1; /* TODO 1: build message */ + iov.iov_base = buffer; + iov.iov_len = len; + + msg.msg_name = &raddr; + msg.msg_namelen = raddrlen; + msg.msg_flags = 0; + msg.msg_control = NULL; + msg.msg_controllen = 0; /* TODO 1: send the message down the socket and return the * error code. */ + return kernel_sendmsg(s, &msg, (struct kvec *) &iov, 1, len); return 0; } @@ -83,8 +92,17 @@ int __init my_udp_sock_init(void) int addrlen = sizeof(addr); /* TODO 1: create UDP socket */ - + err = sock_create_kern(&init_net, PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock); + if (err < 0) { + pr_info("sock_create_kern failed\n"); + goto out; + } /* TODO 1: bind socket to loopback on port MY_UDP_LOCAL_PORT */ + err = sock->ops->bind(sock, (struct sockaddr *) &addr, addrlen); + if (err < 0) { + pr_info("bind failed\n"); + goto out_release; + } /* send message */ err = my_udp_msgsend(sock); @@ -97,6 +115,7 @@ int __init my_udp_sock_init(void) out_release: /* TODO 1: release socket */ + sock_release(sock); out: return err; } @@ -104,6 +123,7 @@ int __init my_udp_sock_init(void) void __exit my_udp_sock_exit(void) { /* TODO 1: release socket */ + sock_release(sock); } module_init(my_udp_sock_init);