chiark / gitweb /
Ooops. Stupid bugs.
[tripe] / peer.c
diff --git a/peer.c b/peer.c
index 2f3d09ab2308bb5eee508d262c5059865d5379e7..87ea4e9e6d36856ad71ecabbbe2d85edbcaedbc0 100644 (file)
--- a/peer.c
+++ b/peer.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: peer.c,v 1.4 2001/02/16 21:40:24 mdw Exp $
+ * $Id: peer.c,v 1.11 2004/04/08 01:36:17 mdw Exp $
  *
  * Communication with the peer
  *
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------* 
- *
- * $Log: peer.c,v $
- * Revision 1.4  2001/02/16 21:40:24  mdw
- * Change key exchange message interface.  Maintain statistics.
- *
- * Revision 1.3  2001/02/04 17:10:58  mdw
- * Make file descriptors be nonblocking and close-on-exec.
- *
- * Revision 1.2  2001/02/03 22:40:29  mdw
- * Put timer information into the entropy pool when packets are received
- * and on similar events.  Reseed the generator on the interval timer.
- *
- * Revision 1.1  2001/02/03 20:26:37  mdw
- * Initial checkin.
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 #include "tripe.h"
@@ -119,7 +101,7 @@ found:
        return;
       }
       buf_init(&bb, buf_o, sizeof(buf_o));
-      if (ksl_decrypt(&p->ks, &b, &bb)) {
+      if (ksl_decrypt(&p->ks, MSG_PACKET, &b, &bb)) {
        p->st.n_reject++;
        a_warn("couldn't decrypt inbound packet from `%s'", p->name);
        return;
@@ -200,8 +182,9 @@ void p_txend(peer *p)
 void p_tun(peer *p, buf *b)
 {
   buf *bb = p_txstart(p, MSG_PACKET);
+
   TIMER;
-  if (ksl_encrypt(&p->ks, b, bb))
+  if (ksl_encrypt(&p->ks, MSG_PACKET, b, bb))
     kx_start(&p->kx);
   if (BOK(bb) && BLEN(bb)) {
     p->st.n_ipout++;
@@ -262,26 +245,41 @@ const addr *p_addr(peer *p) { return (&p->peer); }
 
 /* --- @p_init@ --- *
  *
- * Arguments:  @unsigned port@ = port number to listen to
+ * Arguments:  @struct in_addr addr@ = address to bind to
+ *             @unsigned port@ = port number to listen to
  *
  * Returns:    ---
  *
  * Use:                Initializes the peer system; creates the socket.
  */
 
-void p_init(unsigned port)
+void p_init(struct in_addr addr, unsigned port)
 {
   int fd;
   struct sockaddr_in sin;
+  int len = PKBUFSZ;
+
+  /* --- Note on socket buffer sizes --- *
+   *
+   * For some bizarre reason, Linux 2.2 (at least) doubles the socket buffer
+   * sizes I pass to @setsockopt@.  I'm not putting special-case code here
+   * for Linux: BSD (at least TCPv2) does what I tell it rather than second-
+   * guessing me.
+   */
 
   if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
     die(EXIT_FAILURE, "socket creation failed: %s", strerror(errno));
   BURN(sin);
   sin.sin_family = AF_INET;
-  sin.sin_addr.s_addr = INADDR_ANY;
+  sin.sin_addr = addr;
   sin.sin_port = htons(port);
   if (bind(fd, (struct sockaddr *)&sin, sizeof(sin)))
     die(EXIT_FAILURE, "bind failed: %s", strerror(errno));
+  if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &len, sizeof(len)) ||
+      setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &len, sizeof(len))) {
+    die(EXIT_FAILURE, "failed to set socket buffer sizes: %s",
+       strerror(errno));
+  }
   fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC);
   sel_initfile(&sel, &sock, fd, SEL_READ, p_read, 0);
   sel_addfile(&sock);