chiark / gitweb /
Actual forwarder program compiles apparently ok.
[userv-utils] / ipif / mech-sequence.c
CommitLineData
84f87e82 1/*
2 * Sequence number / nonce mechanism
3 *
4 * arguments: none
5 *
6 * encoding: prepend 4 bytes of sequence arithmetic serial number
7 * decoding: check increasingness, or ignore
8 */
9
10#include <netinet/in.h>
11
aaa9ab3a 12#include "forwarder.h"
84f87e82 13
14struct mechdata {
15 uint32_t number;
16 int anyseen; /* decode only */
17};
18
19static void mes_sequence(struct mechdata **md_r, int *maxprefix_io, int *maxsuffix_io) {
20 struct mechdata *md;
21
22 XMALLOC(md);
23 get_random(&md->number,sizeof(md->number));
24 *maxprefix_io += 4;
25 *md_r= md;
26}
27
28static void mds_sequence(struct mechdata **md_r) {
29 struct mechdata *md;
30 XMALLOC(md);
31 md->anyseen= 0;
32 *md_r= md;
33}
34
35static void menc_sequence(struct mechdata *md, struct buffer *buf) {
36 md->number++;
37 *(uint32_t*)buf_prepend(buf,4)= htonl(md->number);
38}
39
40static const char *mdec_check(struct mechdata *md, struct buffer *buf) {
41 uint32_t *sp, sequence;
42
43 BUF_UNPREPEND(sp,buf,4);
44 sequence= ntohl(*sp);
45
46 if (md->anyseen)
47 if (sequence - md->number >= 0x800000UL) return "out of order packet";
48
49 md->number= sequence;
50 md->anyseen= 1;
51
52 return 0;
53}
54
55static const char *mdec_skip(struct mechdata *md, struct buffer *buf) {
56 uint32_t *sp;
57 BUF_UNPREPEND(sp,buf,4);
58 return 0;
59}
60
61const struct mechanism mechlist_sequence[]= {
aaa9ab3a 62 { "nonce", mes_sequence, mds_sequence, menc_sequence, mdec_skip },
63 { "sequence", mes_sequence, mds_sequence, menc_sequence, mdec_check },
84f87e82 64 { 0 }
65};