pxe: move operations common to TCP-based protocols to a common file
authorH. Peter Anvin <hpa@zytor.com>
Sun, 24 Apr 2011 03:48:42 +0000 (20:48 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Sun, 24 Apr 2011 03:50:00 +0000 (20:50 -0700)
Move operations that are common to all TCP-based protocols into a
common file, tcp.c.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
core/fs/pxe/http.c
core/fs/pxe/pxe.h
core/fs/pxe/tcp.c [new file with mode: 0644]

index 2f5a645..8d19755 100644 (file)
@@ -6,56 +6,6 @@
 
 #define HTTP_PORT      80
 
-static void http_close_file(struct inode *inode)
-{
-    struct pxe_pvt_inode *socket = PVT(inode);
-    if (socket->buf) {
-       netbuf_delete(socket->buf);
-        socket->buf = NULL;
-    }
-    if (socket->conn) {
-       netconn_delete(socket->conn);
-       socket->conn = NULL;
-    }
-}
-
-static void http_fill_buffer(struct inode *inode)
-{
-    struct pxe_pvt_inode *socket = PVT(inode);
-    void *data;
-    u16_t len;
-    err_t err;
-
-    /* Clean up or advance an inuse netbuf */
-    if (socket->buf) {
-       if (netbuf_next(socket->buf) < 0) {
-           netbuf_delete(socket->buf);
-           socket->buf = NULL;
-       }
-    }
-    /* If needed get a new netbuf */
-    if (!socket->buf) {
-       socket->buf = netconn_recv(socket->conn);
-       if (!socket->buf) {
-           socket->tftp_goteof = 1;
-           if (inode->size == -1)
-               inode->size = socket->tftp_filepos;
-           http_close_file(inode);
-           return;
-       }
-    }
-    /* Report the current fragment of the netbuf */
-    err = netbuf_data(socket->buf, &data, &len);
-    if (err) {
-       printf("netbuf_data err: %d\n", err);
-       kaboom();
-    }
-    socket->tftp_dataptr = data;
-    socket->tftp_filepos += len;
-    socket->tftp_bytesleft = len;
-    return;
-}
-
 static bool is_tspecial(int ch)
 {
     bool tspecial = false;
@@ -65,7 +15,7 @@ static bool is_tspecial(int ch)
     case '/':  case '[':  case ']':  case '?':  case '=':
     case '{':  case '}':  case ' ':  case '\t':
        tspecial = true;
-       break;
+       break;
     }
     return tspecial;
 }
@@ -86,7 +36,7 @@ static bool append_ch(char *str, size_t size, size_t *pos, int ch)
     bool success = true;
     if ((*pos + 1) >= size) {
        *pos = 0;
-       success = false;    
+       success = false;
     } else {
        str[*pos] = ch;
        str[*pos + 1] = '\0';
@@ -124,8 +74,8 @@ void http_open(struct url_info *url, struct inode *inode)
     int pos;
     int redirect_count;
 
-    socket->fill_buffer = http_fill_buffer;
-    socket->close = http_close_file;
+    socket->fill_buffer = tcp_fill_buffer;
+    socket->close = tcp_close_file;
     redirect_count = 0;
 
 restart:
@@ -268,7 +218,7 @@ restart:
            /* Bogus cases try to recover */
            else if (ch == '\n')
                state = st_fieldfirst;
-           else 
+           else
                state = st_skipline;
            break;
 
@@ -300,7 +250,7 @@ restart:
            if (ch == '\n')
                state = st_fieldfirst;
            break;
-       
+
        case st_eoh:
           break; /* Should never happen */
        }
@@ -331,7 +281,7 @@ restart:
        strlcpy(new_url, location, sizeof new_url);
        parse_url(url, new_url);
        url_set_ip(url);
-       http_close_file(inode);
+       tcp_close_file(inode);
        /* XXX: This needs to go all the way back to scheme selection */
        goto restart;
        break;
@@ -342,6 +292,6 @@ restart:
     return;
 fail:
     inode->size = 0;
-    http_close_file(inode);
+    tcp_close_file(inode);
     return;
 }
index bb833d6..7d5c43e 100644 (file)
@@ -52,7 +52,7 @@ static inline int hexval(char c)
 #define DNS_MAX_SERVERS 4                      /* Max no of DNS servers */
 
 /*
- * structures 
+ * structures
  */
 struct pxenv_t {
     uint8_t    signature[6];   /* PXENV+ */
@@ -205,7 +205,7 @@ static inline uint32_t gateway(uint32_t ip)
 }
 
 /*
- * functions 
+ * functions
  */
 
 /* pxeisr.inc */
@@ -254,4 +254,8 @@ void gpxe_open(struct inode *inode, const char *url);
 /* http.c */
 void http_open(struct url_info *url, struct inode *inode);
 
+/* tcp.c */
+void tcp_close_file(struct inode *inode);
+void tcp_fill_buffer(struct inode *inode);
+
 #endif /* pxe.h */
diff --git a/core/fs/pxe/tcp.c b/core/fs/pxe/tcp.c
new file mode 100644 (file)
index 0000000..af0cffc
--- /dev/null
@@ -0,0 +1,72 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2011 Intel Corporation; author: H. Peter Anvin
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ *   Boston MA 02110-1301, USA; either version 2 of the License, or
+ *   (at your option) any later version; incorporated herein by reference.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * tcp.c
+ *
+ * Common operations for TCP-based network protocols
+ */
+
+#include <lwip/api.h>
+#include "pxe.h"
+#include "../../../version.h"
+#include "url.h"
+
+void tcp_close_file(struct inode *inode)
+{
+    struct pxe_pvt_inode *socket = PVT(inode);
+    if (socket->buf) {
+       netbuf_delete(socket->buf);
+        socket->buf = NULL;
+    }
+    if (socket->conn) {
+       netconn_delete(socket->conn);
+       socket->conn = NULL;
+    }
+}
+
+void tcp_fill_buffer(struct inode *inode)
+{
+    struct pxe_pvt_inode *socket = PVT(inode);
+    void *data;
+    u16_t len;
+    err_t err;
+
+    /* Clean up or advance an inuse netbuf */
+    if (socket->buf) {
+       if (netbuf_next(socket->buf) < 0) {
+           netbuf_delete(socket->buf);
+           socket->buf = NULL;
+       }
+    }
+    /* If needed get a new netbuf */
+    if (!socket->buf) {
+       socket->buf = netconn_recv(socket->conn);
+       if (!socket->buf) {
+           socket->tftp_goteof = 1;
+           if (inode->size == -1)
+               inode->size = socket->tftp_filepos;
+           tcp_close_file(inode);
+           return;
+       }
+    }
+    /* Report the current fragment of the netbuf */
+    err = netbuf_data(socket->buf, &data, &len);
+    if (err) {
+       printf("netbuf_data err: %d\n", err);
+       kaboom();
+    }
+    socket->tftp_dataptr = data;
+    socket->tftp_filepos += len;
+    socket->tftp_bytesleft = len;
+    return;
+}