OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / user / ferret / gre.c
1 /* Copyright (c) 2007 by Errata Security */\r
2 #include "protos.h"\r
3 #include "netframe.h"\r
4 #include "ferret.h"\r
5 #include "formats.h"\r
6 #include <string.h>\r
7 \r
8 \r
9 void process_gre_pptp(struct Seaper *seap, struct NetFrame *frame, const unsigned char *px, unsigned length)\r
10 {\r
11         unsigned flags;\r
12         unsigned offset;\r
13         unsigned payload_length;\r
14         unsigned call_id;\r
15         unsigned sequence_number;\r
16         unsigned acknowledgement_number;\r
17 \r
18 \r
19         /*\r
20                 0                   1                   2                   3\r
21                 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
22            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
23            |C|R|K|S|s|Recur|A| Flags | Ver |         Protocol Type         |\r
24            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
25            |    Key (HW) Payload Length    |       Key (LW) Call ID        |\r
26            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
27            |                  Sequence Number (Optional)                   |\r
28            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
29            |               Acknowledgment Number (Optional)                |\r
30            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
31         */\r
32         flags = ex16be(px);\r
33         payload_length = ex16be(px+4);\r
34         call_id = ex16be(px+6);\r
35 \r
36         if ((flags&0xE80F) != 0x2001) {\r
37                 FRAMERR_UNKNOWN_UNSIGNED(frame, "gre", flags);\r
38                 return;\r
39         }\r
40 \r
41         offset = 8;\r
42         if (flags & 0x1000) {\r
43                 sequence_number = ex32be(px+offset);\r
44                 offset += 4;\r
45         }\r
46         if (flags & 0x0080) {\r
47                 acknowledgement_number = ex32be(px+offset);\r
48                 offset += 4;\r
49         }\r
50         if (offset >= length) {\r
51                 FRAMERR_TRUNCATED(frame, "gre");\r
52                 return;\r
53         }\r
54 \r
55 \r
56         process_pptp(seap, frame, px+offset, length-offset);\r
57 \r
58 \r
59 }\r
60 \r
61 \r
62 void process_gre(struct Seaper *seap, struct NetFrame *frame, const unsigned char *px, unsigned length)\r
63 {\r
64         unsigned flags;\r
65         unsigned version;\r
66         unsigned protocol;\r
67         unsigned offset;\r
68         \r
69 /*\r
70       0                   1                   2                   3\r
71        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\r
72       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
73       |C|R|K|S|s|Recur|  Flags  | Ver |         Protocol Type         |\r
74       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
75       |      Checksum (optional)      |       Offset (optional)       |\r
76       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
77       |                         Key (optional)                        |\r
78       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
79       |                    Sequence Number (optional)                 |\r
80       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
81       |                         Routing (optional)\r
82       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
83 */\r
84 \r
85         if (length < 8) {\r
86                 FRAMERR_TRUNCATED(frame, "gre");\r
87                 return;\r
88         }\r
89 \r
90         flags = ex16be(px);\r
91         version = px[1]&0x7;\r
92         protocol = ex16be(px+2);\r
93 \r
94         offset = 4;\r
95 \r
96         if (version == 1 && protocol == 0x880b)\r
97                 process_gre_pptp(seap, frame, px, length);\r
98         else {\r
99                 FRAMERR_UNKNOWN_UNSIGNED(frame, "gre", version);\r
100         }\r
101 \r
102 \r
103 }\r
104 \r