summaryrefslogtreecommitdiff
path: root/peer.h
diff options
context:
space:
mode:
Diffstat (limited to 'peer.h')
-rw-r--r--peer.h130
1 files changed, 130 insertions, 0 deletions
diff --git a/peer.h b/peer.h
new file mode 100644
index 0000000..9eccbe3
--- /dev/null
+++ b/peer.h
@@ -0,0 +1,130 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2005 Dimitri Sokolyuk <demon@vhost.dyndns.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _PEER_H_
+#define _PEER_H_
+
+#if 0
+#include <sys/queue.h>
+#endif
+
+#if 0
+snum stage {
+ PIECELESS, /* threshold 5% */
+ NORMAL,
+ ENDGAME, /* threshold 95% */
+ SEEDER
+};
+#endif
+
+enum msg {
+ MSG_KEEPALIVE = -1, /* no payload at all */
+ MSG_CHOKE,
+ MSG_UNCHOKE,
+ MSG_INTERESTED,
+ MSG_UNINTERESTED,
+ MSG_HAVE,
+ MSG_BITFIELD,
+ MSG_REQUEST,
+ MSG_PIECE,
+ MSG_CANCEL
+};
+
+/* peer wire message */
+struct btpwm {
+ u_int length;
+ u_char id;
+ void *payload;
+};
+
+enum state {
+ IDLE,
+ CONNECTING,
+ HANDSHAKE,
+ SUCCESS,
+ FAILED
+};
+
+#define MAX_TTL 10
+#define BLOCKSZ (16<10)
+
+struct btpeerstat { /* isn't used jet */
+ unsigned int choked:1;
+ unsigned int interested:1;
+};
+
+enum flags {
+ LOCAL_CHOKED,
+ LOCAL_INTERESTED,
+ REMOTE_CHOKED,
+ REMOTE_INTERESTED,
+ OPTIMISTIC_CHOKING
+};
+
+struct btpeer {
+ LIST_ENTRY(btpeer) link;
+#if 1
+ int sockd;
+ struct sockaddr_in sin;
+#else
+ struct btsock sock;
+#endif
+ u_char peerid[SHA1LEN]; /* isn't known in `compact' mode */
+ enum msg msg; /* ??? local/remote */
+ enum state state;
+ int ttl; /* TODO: choose resonable value */
+ char flags; /* chocked / interested / ... */
+ char *bitfield; /* alloc space to hold bitfield and
+ data arrays on successful connect */
+#if 1 /* obsolete */
+ /* request part */
+ int piece;
+ off_t offset;
+ size_t length;
+ void *data_in; /* holds unfinished parts of piece */
+ void *data_out;
+ void *data;
+#endif
+
+ char *msgbuf;
+ size_t buflen;
+ size_t bufoff;
+// size_t expect; /* expect to read */
+
+ /* statistics */
+ int dl; /* download rate */
+ int ul; /* upload rate */
+ int rank;
+};
+
+/* todo: read first 4 bytes, allocate space in msgbuf, read entry message,
+ decide what to do with it */
+
+LIST_HEAD(btplist, btpeer);
+
+__BEGIN_DECLS
+char *btgethandshake(const u_char *, const u_char *);
+int btchkhandshake(const char *, const u_char *, const u_char *);
+
+void btdumpplist(struct btplist *);
+int btaddpeer(struct btplist *, struct btpeer *);
+int btclearoldpeers(struct btplist *);
+void btdelplist(struct btplist *);
+void btdbg(struct btpeer *, char *, ...);
+__END_DECLS
+
+#endif /* not _PEER_H_ */