ead: add support for instance ids to prevent interference from packet reception on...
[openwrt/svn-archive/archive.git] / package / ead / src / ead.h
1 /*
2 * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2
6 * as published by the Free Software Foundation
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14 #ifndef __EAD_H
15 #define __EAD_H
16
17 #define EAD_DEBUGLEVEL 1
18
19 #include <stdint.h>
20 #include <stddef.h>
21
22 #ifndef MAXSALTLEN
23 #define MAXSALTLEN 32
24 #endif
25
26 #define EAD_PORT 56026UL
27 #define EAD_MAGIC 3671771902UL
28 #define EAD_CMD_TIMEOUT 10
29
30 #define EAD_MAX_IV_INCR 128
31
32 /* request/response types */
33 /* response id == request id + 1 */
34 enum ead_type {
35 EAD_TYPE_PING,
36 EAD_TYPE_PONG,
37
38 EAD_TYPE_SET_USERNAME,
39 EAD_TYPE_ACK_USERNAME,
40
41 EAD_TYPE_GET_PRIME,
42 EAD_TYPE_PRIME,
43
44 EAD_TYPE_SEND_A,
45 EAD_TYPE_SEND_B,
46
47 EAD_TYPE_SEND_AUTH,
48 EAD_TYPE_DONE_AUTH,
49
50 EAD_TYPE_SEND_CMD,
51 EAD_TYPE_RESULT_CMD,
52
53 EAD_TYPE_LAST
54 };
55
56 enum ead_auth_type {
57 EAD_AUTH_DEFAULT,
58 EAD_AUTH_MD5
59 };
60
61 enum ead_cmd_type {
62 EAD_CMD_NORMAL,
63 EAD_CMD_BACKGROUND,
64 EAD_CMD_LAST
65 };
66
67 struct ead_msg_pong {
68 uint16_t auth_type;
69 char name[];
70 } __attribute__((packed));
71
72 struct ead_msg_number {
73 uint8_t id;
74 unsigned char data[];
75 } __attribute__((packed));
76
77 struct ead_msg_salt {
78 uint8_t prime;
79 uint8_t len;
80 unsigned char salt[MAXSALTLEN];
81 unsigned char ext_salt[MAXSALTLEN];
82 } __attribute__((packed));
83
84 struct ead_msg_user {
85 char username[32];
86 } __attribute__((packed));
87
88 struct ead_msg_auth {
89 unsigned char data[20];
90 } __attribute__((packed));
91
92 struct ead_msg_cmd {
93 uint8_t type;
94 uint16_t timeout;
95 unsigned char data[];
96 } __attribute__((packed));
97
98 struct ead_msg_cmd_data {
99 uint8_t done;
100 unsigned char data[];
101 } __attribute__((packed));
102
103 struct ead_msg_encrypted {
104 uint32_t hash[5];
105 uint32_t iv;
106 uint8_t pad;
107 union {
108 struct ead_msg_cmd cmd;
109 struct ead_msg_cmd_data cmd_data;
110 } data[];
111 } __attribute__((packed));
112
113
114 #define EAD_DATA(_msg, _type) (&((_msg)->data[0]._type))
115 #define EAD_ENC_DATA(_msg, _type) (&((_msg)->data[0].enc.data[0]._type))
116
117 /* for ead_msg::sid */
118 #define EAD_INSTANCE_MASK 0xf000
119 #define EAD_INSTANCE_SHIFT 12
120
121 struct ead_msg {
122 uint32_t magic;
123 uint32_t len;
124 uint32_t type;
125 uint16_t nid; /* node id */
126 uint16_t sid; /* session id */
127 uint32_t ip; /* source ip for responses from the server */
128 union {
129 struct ead_msg_pong pong;
130 struct ead_msg_user user;
131 struct ead_msg_number number;
132 struct ead_msg_auth auth;
133 struct ead_msg_salt salt;
134 struct ead_msg_encrypted enc;
135 } data[];
136 } __attribute__((packed));
137
138
139 #endif