Initial commit for socket related networking stuff.
authorDavid Zhu <yuzhu@cs.berkeley.edu>
Fri, 4 Mar 2011 06:36:40 +0000 (22:36 -0800)
committerDavid Zhu <yuzhu@cs.berkeley.edu>
Mon, 2 Apr 2012 22:03:28 +0000 (15:03 -0700)
Added the first socket call and related structures.
Integrate socket with vfs structures and added udp test.

kern/include/ros/bits/syscall.h
kern/include/vfs.h
kern/src/Makefrag
kern/src/init.c
kern/src/syscall.c
kern/src/vfs.c
tests/udp_test.c [new file with mode: 0644]
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/socket.c [new file with mode: 0644]

index 0e28761..6137c0f 100644 (file)
 #define SYS_change_to_m                                29
 #define SYS_poke_ksched                                30
 
+/* Socket Syscalls */
+#define SYS_socket                                     40
+
+
 /* Platform specific syscalls */
 #define SYS_serial_read                                75
 #define SYS_serial_write                       76
index 6acb17e..a53ebd3 100644 (file)
@@ -282,7 +282,7 @@ struct file {
        int                                                     f_error;
        struct event_poll_tailq         f_ep_links;
        spinlock_t                                      f_ep_lock;
-       void                                            *f_fs_info;             /* tty driver hook */
+       void                                            *f_privdata;    /* tty/socket driver hook */
        struct page_map                         *f_mapping;             /* page cache mapping */
 
        /* Ghetto appserver support */
@@ -446,6 +446,7 @@ ssize_t generic_file_write(struct file *file, const char *buf, size_t count,
                            off_t *offset);
 ssize_t generic_dir_read(struct file *file, char *u_buf, size_t count,
                          off_t *offset);
+struct file* alloc_file();
 struct file *do_file_open(char *path, int flags, int mode);
 int do_symlink(char *path, const char *symname, int mode);
 int do_link(char *old_path, char *new_path);
index b7b735f..d86dc86 100644 (file)
@@ -59,6 +59,7 @@ KERN_SRCFILES := $(KERN_ARCH_SRCFILES) \
                  $(KERN_SRC_DIR)/kdebug.c \
                  $(KERN_SRC_DIR)/ucq.c \
                  $(KERN_SRC_DIR)/console.c \
+                 $(KERN_SRC_DIR)/socket.c \
                  $(KERN_SRC_DIR)/arsc.c
 
 # Only build files if they exist.
index d744b11..3599045 100644 (file)
@@ -100,6 +100,7 @@ void kernel_init(multiboot_info_t *mboot_info)
        arch_init();
        block_init();
        enable_irq();
+       socket_init();
 #ifdef __CONFIG_EXT2FS__
        mount_fs(&ext2_fs_type, "/dev/ramdisk", "/mnt", 0);
 #endif /* __CONFIG_EXT2FS__ */
index fd8321a..951f0ec 100644 (file)
@@ -33,6 +33,7 @@
 #include <smp.h>
 #include <arsc_server.h>
 #include <event.h>
+#include <socket.h>
 
 
 #ifdef __CONFIG_NETWORKING__
@@ -1382,6 +1383,8 @@ const static struct sys_table_entry syscall_table[] = {
 #endif
        [SYS_change_to_m] = {(syscall_t)sys_change_to_m, "change_to_m"},
        [SYS_poke_ksched] = {(syscall_t)sys_poke_ksched, "poke_ksched"},
+       [SYS_socket] ={(syscall_t)sys_socket, "socket"},
+
        [SYS_read] = {(syscall_t)sys_read, "read"},
        [SYS_write] = {(syscall_t)sys_write, "write"},
        [SYS_open] = {(syscall_t)sys_open, "open"},
index 2ff72da..3745a0c 100644 (file)
@@ -1631,16 +1631,23 @@ out_path_only:
        return retval;
 }
 
-/* Opens and returns the file specified by dentry */
-struct file *dentry_open(struct dentry *dentry, int flags)
+struct file *alloc_file()
 {
-       struct inode *inode;
-       int desired_mode;
        struct file *file = kmem_cache_alloc(file_kcache, 0);
        if (!file) {
                set_errno(ENOMEM);
                return 0;
        }
+       /* one for the ref passed out*/
+       kref_init(&file->f_kref, file_release, 1);
+       return file;
+}
+
+/* Opens and returns the file specified by dentry */
+struct file *dentry_open(struct dentry *dentry, int flags)
+{
+       struct inode *inode;
+       int desired_mode;
        inode = dentry->d_inode;
        /* Do the mode first, since we can still error out.  f_mode stores how the
         * OS file is open, which can be more restrictive than the i_mode */
@@ -1659,9 +1666,11 @@ struct file *dentry_open(struct dentry *dentry, int flags)
        }
        if (check_perms(inode, desired_mode))
                goto error_access;
+       // Check permission before we allocate file struct      
+       struct file *file = alloc_file();
+       if (!file) return 0;
+
        file->f_mode = desired_mode;
-       /* one for the ref passed out, and *none* for the sb TAILQ */
-       kref_init(&file->f_kref, file_release, 1);
        /* Add to the list of all files of this SB */
        TAILQ_INSERT_TAIL(&inode->i_sb->s_files, file, f_list);
        kref_get(&dentry->d_kref, 1);
@@ -1677,13 +1686,12 @@ struct file *dentry_open(struct dentry *dentry, int flags)
        file->f_error = 0;
 //     struct event_poll_tailq         f_ep_links;
        spinlock_init(&file->f_ep_lock);
-       file->f_fs_info = 0;                                            /* prob overriden by the fs */
+       file->f_privdata = 0;                                           /* prob overriden by the fs */
        file->f_mapping = inode->i_mapping;
        file->f_op->open(inode, file);
        return file;
 error_access:
        set_errno(EACCES);
-       kmem_cache_free(file_kcache, file);
        return 0;
 }
 
@@ -1755,7 +1763,6 @@ struct file *put_file_from_fd(struct files_struct *open_files, int file_desc)
        spin_unlock(&open_files->lock);
        return file;
 }
-
 /* Inserts the file in the files_struct, returning the corresponding new file
  * descriptor, or an error code.  We start looking for open fds from low_fd. */
 int insert_file(struct files_struct *open_files, struct file *file, int low_fd)
diff --git a/tests/udp_test.c b/tests/udp_test.c
new file mode 100644 (file)
index 0000000..397ad82
--- /dev/null
@@ -0,0 +1,50 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+//single fragment for now
+#define BUF_SIZE 512
+
+int main(int argc, char* argv[]) {
+       struct sockaddr_in server;
+       char buf[BUF_SIZE];
+       int sockfd, n;
+       struct  hostent* host;
+       if (argc != 1) {
+               printf("where is my hostname?\n");
+
+               return -1;
+       }
+       // ignore the host for now
+       // host = gethostbyname(argv[1]);
+       bzero(&server, sizeof(server));
+       server.sin_family = AF_INET;
+       server.sin_port = htons(5000);
+       server.sin_addr.s_addr = inet_addr("10.0.0.1"); //hardcoded server
+       //server.sin_addr = *((struct in_addr *)host->h_addr);
+
+       if (sockfd = socket(AF_INET, SOCK_DGRAM, 0) ==-1) {
+               printf("socket error\n");
+               return -1;
+       }
+
+       if (sendto(sockfd, buf, BUF_SIZE, 0, (struct sockaddr*) &server, sizeof(server)) != BUF_SIZE) {
+               printf("send failed\n");
+               return -1;
+       }
+
+       if ((n = recvfrom(sockfd, buf, BUF_SIZE, 0, NULL, NULL)< 2)){
+               printf ("recv failed\n");
+               return -1;
+       }
+
+       buf[n-2] = 0; //null terminate
+       printf("%s\n", buf);
+       
+}
diff --git a/tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/socket.c b/tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/socket.c
new file mode 100644 (file)
index 0000000..17fcd8b
--- /dev/null
@@ -0,0 +1,13 @@
+#include <sysdep.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <stddef.h>
+#include <ros/syscall.h>
+
+int
+__socket(int socket_family, int socket_type, int protocol) {
+       return ros_syscall(SYS_socket, socket_family, socket_type, protocol, 0,0,0);
+}
+
+//libc_hidden_def (__socket)
+weak_alias (__socket, socket)