1 /* Copyright (c) 2007 by Errata Security */
\r
3 #include "netframe.h"
\r
9 void process_gre_pptp(struct Seaper *seap, struct NetFrame *frame, const unsigned char *px, unsigned length)
\r
13 unsigned payload_length;
\r
15 unsigned sequence_number;
\r
16 unsigned acknowledgement_number;
\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
33 payload_length = ex16be(px+4);
\r
34 call_id = ex16be(px+6);
\r
36 if ((flags&0xE80F) != 0x2001) {
\r
37 FRAMERR_UNKNOWN_UNSIGNED(frame, "gre", flags);
\r
42 if (flags & 0x1000) {
\r
43 sequence_number = ex32be(px+offset);
\r
46 if (flags & 0x0080) {
\r
47 acknowledgement_number = ex32be(px+offset);
\r
50 if (offset >= length) {
\r
51 FRAMERR_TRUNCATED(frame, "gre");
\r
56 process_pptp(seap, frame, px+offset, length-offset);
\r
62 void process_gre(struct Seaper *seap, struct NetFrame *frame, const unsigned char *px, unsigned length)
\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
78 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\r
79 | Sequence Number (optional) |
\r
80 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\r
81 | Routing (optional)
\r
82 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\r
86 FRAMERR_TRUNCATED(frame, "gre");
\r
91 version = px[1]&0x7;
\r
92 protocol = ex16be(px+2);
\r
96 if (version == 1 && protocol == 0x880b)
\r
97 process_gre_pptp(seap, frame, px, length);
\r
99 FRAMERR_UNKNOWN_UNSIGNED(frame, "gre", version);
\r