suricata
decode-pppoe.c
Go to the documentation of this file.
1 /* Copyright (C) 2007-2021 Open Information Security Foundation
2  *
3  * You can copy, redistribute or modify this Program under the terms of
4  * the GNU General Public License version 2 as published by the Free
5  * Software Foundation.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * version 2 along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15  * 02110-1301, USA.
16  */
17 
18 /**
19  * \ingroup decode
20  *
21  * @{
22  */
23 
24 
25 /**
26  * \file
27  *
28  * \author James Riden <jamesr@europe.com>
29  *
30  * PPPOE Decoder
31  */
32 
33 #include "suricata-common.h"
34 
35 #include "packet-queue.h"
36 
37 #include "decode.h"
38 #include "decode-ppp.h"
39 #include "decode-pppoe.h"
40 #include "decode-events.h"
41 #include "flow.h"
42 
43 #include "util-validate.h"
44 #include "util-unittest.h"
45 #include "util-debug.h"
46 
47 /**
48  * \brief Main decoding function for PPPOE Discovery packets
49  */
51  const uint8_t *pkt, uint32_t len)
52 {
53  DEBUG_VALIDATE_BUG_ON(pkt == NULL);
54 
56 
59  return TM_ECODE_FAILED;
60  }
61 
62  p->pppoedh = (PPPOEDiscoveryHdr *)pkt;
63 
64  /* parse the PPPOE code */
65  switch (p->pppoedh->pppoe_code)
66  {
67  case PPPOE_CODE_PADI:
68  break;
69  case PPPOE_CODE_PADO:
70  break;
71  case PPPOE_CODE_PADR:
72  break;
73  case PPPOE_CODE_PADS:
74  break;
75  case PPPOE_CODE_PADT:
76  break;
77  default:
78  SCLogDebug("unknown PPPOE code: 0x%0"PRIX8"", p->pppoedh->pppoe_code);
80  return TM_ECODE_OK;
81  }
82 
83  uint32_t pppoe_length = SCNtohs(p->pppoedh->pppoe_length);
84  uint32_t packet_length = len - PPPOE_DISCOVERY_HEADER_MIN_LEN ;
85 
86  SCLogDebug("pppoe_length %"PRIu32", packet_length %"PRIu32"",
87  pppoe_length, packet_length);
88 
89  if (pppoe_length > packet_length) {
90  SCLogDebug("malformed PPPOE tags");
92  return TM_ECODE_OK;
93  }
94 
95 #ifdef DEBUG
96  /* parse any tags we have in the packet */
97 
98  uint32_t tag_length = 0;
99  const uint8_t *pkt_pppoedt = pkt + PPPOE_DISCOVERY_HEADER_MIN_LEN;
100 
101  // packet_length >= pppoe_length so we have enough data
102  while (pppoe_length >= sizeof(PPPOEDiscoveryTag)) {
103  PPPOEDiscoveryTag *pppoedt = (PPPOEDiscoveryTag *)pkt_pppoedt;
104  uint16_t tag_type = SCNtohs(pppoedt->pppoe_tag_type);
105  // upgrade to u32 to avoid u16 overflow
106  tag_length = SCNtohs(pppoedt->pppoe_tag_length);
107 
108  SCLogDebug ("PPPoE Tag type %x, length %"PRIu32, tag_type, tag_length);
109 
110  if (pppoe_length >= (4 + tag_length)) {
111  pppoe_length -= (4 + tag_length);
112  pkt_pppoedt = pkt_pppoedt + (4 + tag_length);
113  } else {
114  pppoe_length = 0; // don't want an underflow
115  }
116  }
117 #endif
118 
119  return TM_ECODE_OK;
120 }
121 
122 /**
123  * \brief Main decoding function for PPPOE Session packets
124  */
126  const uint8_t *pkt, uint32_t len)
127 {
128  DEBUG_VALIDATE_BUG_ON(pkt == NULL);
129 
131 
134  return TM_ECODE_FAILED;
135  }
136 
137  p->pppoesh = (PPPOESessionHdr *)pkt;
138 
139  SCLogDebug("PPPOE VERSION %" PRIu32 " TYPE %" PRIu32 " CODE %" PRIu32 " SESSIONID %" PRIu32 " LENGTH %" PRIu32 "",
141 
142  /* can't use DecodePPP() here because we only get a single 2-byte word to indicate protocol instead of the full PPP header */
143  if (SCNtohs(p->pppoesh->pppoe_length) > 0) {
144  /* decode contained PPP packet */
145 
146  uint8_t pppoesh_len;
147  uint16_t ppp_protocol = SCNtohs(p->pppoesh->protocol);
148 
149  /* According to RFC1661-2, if the least significant bit of the most significant octet is
150  * set, we're dealing with a single-octet protocol field */
151  if (ppp_protocol & 0x0100) {
152  /* Single-octet variant */
153  ppp_protocol >>= 8;
154  pppoesh_len = PPPOE_SESSION_HEADER_MIN_LEN;
155  } else {
156  /* Double-octet variant; increase the length of the session header accordingly */
157  pppoesh_len = PPPOE_SESSION_HEADER_MIN_LEN + 1;
158 
159  if (len < pppoesh_len) {
161  return TM_ECODE_FAILED;
162  }
163  }
164 
165  SCLogDebug("Protocol %" PRIu16 " len %" PRIu8 "", ppp_protocol, pppoesh_len);
166 
167  switch (ppp_protocol) {
168  case PPP_VJ_COMP:
169  case PPP_IPX:
170  case PPP_OSI:
171  case PPP_NS:
172  case PPP_DECNET:
173  case PPP_APPLE:
174  case PPP_BRPDU:
175  case PPP_STII:
176  case PPP_VINES:
177  case PPP_HELLO:
178  case PPP_LUXCOM:
179  case PPP_SNS:
180  case PPP_MPLS_UCAST:
181  case PPP_MPLS_MCAST:
182  case PPP_IPCP:
183  case PPP_OSICP:
184  case PPP_NSCP:
185  case PPP_DECNETCP:
186  case PPP_APPLECP:
187  case PPP_IPXCP:
188  case PPP_STIICP:
189  case PPP_VINESCP:
190  case PPP_IPV6CP:
191  case PPP_MPLSCP:
192  case PPP_LCP:
193  case PPP_PAP:
194  case PPP_LQM:
195  case PPP_CHAP:
197  break;
198 
199  case PPP_VJ_UCOMP:
200 
201  if (len - pppoesh_len < IPV4_HEADER_LEN) {
203  return TM_ECODE_OK;
204  }
205  if (unlikely(len - pppoesh_len > USHRT_MAX)) {
206  return TM_ECODE_FAILED;
207  }
208 
209  if (IPV4_GET_RAW_VER((IPV4Hdr *)(pkt + pppoesh_len)) == 4) {
210  DecodeIPV4(tv, dtv, p, pkt + pppoesh_len, (uint16_t)(len - pppoesh_len));
211  }
212  break;
213 
214  case PPP_IP:
215  if (len - pppoesh_len < IPV4_HEADER_LEN) {
217  return TM_ECODE_OK;
218  }
219  if (unlikely(len - pppoesh_len > USHRT_MAX)) {
220  return TM_ECODE_FAILED;
221  }
222  DecodeIPV4(tv, dtv, p, pkt + pppoesh_len, (uint16_t)(len - pppoesh_len));
223  break;
224 
225  /* PPP IPv6 was not tested */
226  case PPP_IPV6:
227  if (len - pppoesh_len < IPV6_HEADER_LEN) {
229  return TM_ECODE_OK;
230  }
231  if (unlikely(len - pppoesh_len > USHRT_MAX)) {
232  return TM_ECODE_FAILED;
233  }
234 
235  DecodeIPV6(tv, dtv, p, pkt + pppoesh_len, (uint16_t)(len - pppoesh_len));
236  break;
237 
238  default:
239  SCLogDebug("unknown PPP protocol: %" PRIx32 "", ppp_protocol);
241  return TM_ECODE_OK;
242  }
243  }
244  return TM_ECODE_OK;
245 }
246 
247 #ifdef UNITTESTS
248 /** DecodePPPOEtest01
249  * \brief Decode malformed PPPOE packet (too short)
250  * \retval 1 Expected test value
251  */
252 static int DecodePPPOEtest01 (void)
253 {
254 
255  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x00, 0x00 };
256  Packet *p = PacketGetFromAlloc();
257  FAIL_IF_NULL(p);
258  ThreadVars tv;
260 
261  memset(&tv, 0, sizeof(ThreadVars));
262  memset(&dtv, 0, sizeof(DecodeThreadVars));
263 
264  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
265 
267 
268  SCFree(p);
269  PASS;
270 }
271 
272 /** DecodePPPOEtest02
273  * \brief Valid PPPOE packet - check the invalid ICMP type encapsulated is flagged
274  * \retval 0 Expected test value
275  */
276 static int DecodePPPOEtest02 (void)
277 {
278 
279  uint8_t raw_pppoe[] = {
280  0x11, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x21,
281  0x45, 0x00, 0x00, 0x3c, 0x05, 0x5c, 0x00, 0x00,
282  0x20, 0x01, 0xff, 0x30, 0xc0, 0xa8, 0x0a, 0x7f,
283  0xc0, 0xa8, 0x0a, 0x65, 0xab, 0xcd, 0x16, 0x5e,
284  0x02, 0x00, 0x37, 0x00, 0x41, 0x42, 0x43, 0x44,
285  0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c,
286  0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
287  0x55, 0x56, 0x57, 0x41, 0x42, 0x43, 0x44, 0x45,
288  0x46, 0x47, 0x48, 0x49 };
289 
290  Packet *p = PacketGetFromAlloc();
291  FAIL_IF_NULL(p);
292  ThreadVars tv;
294 
295  memset(&tv, 0, sizeof(ThreadVars));
296  memset(&dtv, 0, sizeof(DecodeThreadVars));
297 
299 
300  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
301 
303 
304  // and we insist that the invalid ICMP encapsulated (type 0xab, code 0xcd) is flagged
306 
307  FlowShutdown();
308  SCFree(p);
309  PASS;
310 }
311 
312 
313 /** DecodePPPOEtest03
314  * \brief Valid example PADO packet PPPOE packet taken from RFC2516
315  * \retval 0 Expected test value
316  */
317 static int DecodePPPOEtest03 (void)
318 {
319 
320  /* example PADO packet taken from RFC2516 */
321  uint8_t raw_pppoe[] = {
322  0x11, 0x07, 0x00, 0x00, 0x00, 0x20, 0x01, 0x01,
323  0x00, 0x00, 0x01, 0x02, 0x00, 0x18, 0x47, 0x6f,
324  0x20, 0x52, 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b,
325  0x20, 0x2d, 0x20, 0x65, 0x73, 0x68, 0x73, 0x68,
326  0x65, 0x73, 0x68, 0x6f, 0x6f, 0x74
327  };
328 
329  Packet *p = PacketGetFromAlloc();
330  FAIL_IF_NULL(p);
331  ThreadVars tv;
333 
334  memset(&tv, 0, sizeof(ThreadVars));
335  memset(&dtv, 0, sizeof(DecodeThreadVars));
336 
337  DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
338  FAIL_IF_NULL(p->pppoedh);
339 
340  SCFree(p);
341  PASS;
342 }
343 
344 /** DecodePPPOEtest04
345  * \brief Valid example PPPOE packet taken from RFC2516 - but with wrong PPPOE code
346  * \retval 1 Expected test value
347  */
348 static int DecodePPPOEtest04 (void)
349 {
350 
351  /* example PADI packet taken from RFC2516, but with wrong code */
352  uint8_t raw_pppoe[] = {
353  0x11, 0xbb, 0x00, 0x00, 0x00, 0x04, 0x01, 0x01,
354  0x00, 0x00
355  };
356 
357  Packet *p = PacketGetFromAlloc();
358  FAIL_IF_NULL(p);
359  ThreadVars tv;
361 
362  memset(&tv, 0, sizeof(ThreadVars));
363  memset(&dtv, 0, sizeof(DecodeThreadVars));
364 
365  DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
366 
368 
369  SCFree(p);
370  PASS;
371 }
372 
373 /** DecodePPPOEtest05
374  * \brief Valid example PADO PPPOE packet taken from RFC2516, but too short for given length
375  * \retval 0 Expected test value
376  */
377 static int DecodePPPOEtest05 (void)
378 {
379 
380  /* example PADI packet taken from RFC2516 */
381  uint8_t raw_pppoe[] = {
382  0x11, 0x07, 0x00, 0x00, 0x00, 0x20, 0x01, 0x01,
383  0x00, 0x00, 0x01, 0x02, 0x00, 0x18, 0x47, 0x6f,
384  0x20, 0x52, 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b,
385  0x20, 0x2d, 0x20, 0x65, 0x73, 0x68, 0x73, 0x68
386  };
387 
388  Packet *p = PacketGetFromAlloc();
389  FAIL_IF_NULL(p);
390  ThreadVars tv;
392 
393  memset(&tv, 0, sizeof(ThreadVars));
394  memset(&dtv, 0, sizeof(DecodeThreadVars));
395 
396  DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
397 
399 
400  SCFree(p);
401  PASS;
402 }
403 
404 /** DecodePPPOEtest06
405  * \brief Check that the macros work as expected. Type and version are
406  * fields of 4 bits length. So they are sharing the same var and the macros
407  * should extract the first 4 bits for version and the second 4 bits for type
408  * \retval 1 Expected test value
409  */
410 static int DecodePPPOEtest06 (void)
411 {
412 
413  PPPOESessionHdr pppoesh;
414  PPPOEDiscoveryHdr pppoedh;
415  pppoesh.pppoe_version_type = 0xAB;
416  pppoedh.pppoe_version_type = 0xCD;
417 
418  FAIL_IF(PPPOE_SESSION_GET_VERSION(&pppoesh) != 0x0A);
419  FAIL_IF(PPPOE_SESSION_GET_TYPE(&pppoesh) != 0x0B);
420  FAIL_IF(PPPOE_DISCOVERY_GET_VERSION(&pppoedh) != 0x0C);
421  FAIL_IF(PPPOE_DISCOVERY_GET_TYPE(&pppoedh) != 0x0D);
422  PASS;
423 }
424 
425 /** DecodePPPOEtest07
426  * \brief Valid PPPOE packet with 8 bit protocol field - check the valid ICMP type is accepted
427  * \retval 1 Expected test value
428  */
429 static int DecodePPPOEtest07(void)
430 {
431 
432  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x2d, 0x00, 0x1c, 0x21, 0x45, 0x00, 0x00, 0x1d, 0x97,
433  0xc3, 0x00, 0x00, 0x40, 0x01, 0x47, 0x0f, 0x0a, 0x64, 0x00, 0x00, 0xc0, 0xa8, 0xd1, 0x01,
434  0x08, 0x00, 0xd4, 0x4c, 0x1f, 0x32, 0x04, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
435  0x00, 0x00, 0x00, 0x00 };
436 
437  Packet *p = PacketGetFromAlloc();
438  FAIL_IF_NULL(p);
439  ThreadVars tv;
441 
442  memset(&tv, 0, sizeof(ThreadVars));
443  memset(&dtv, 0, sizeof(DecodeThreadVars));
444 
445  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
446 
448  SCFree(p);
449  PASS;
450 }
451 
452 /** DecodePPPOEtest08
453  * \brief Valid PPPOE packet with 8 bit protocol field - check the valid HTTP type is accepted
454  * \retval 1 Expected test value
455  */
456 static int DecodePPPOEtest08(void)
457 {
458 
459  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x2d, 0x00, 0x3d, 0x21, 0x45, 0x00, 0x00, 0x3c, 0x00,
460  0x00, 0x40, 0x00, 0x40, 0x06, 0xed, 0xda, 0x0a, 0x64, 0x00, 0x00, 0x8e, 0xfa, 0xb3, 0x83,
461  0xde, 0xb5, 0x00, 0x50, 0xd4, 0xbd, 0x76, 0x54, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0xfe,
462  0xcc, 0x74, 0x2f, 0x00, 0x00, 0x02, 0x04, 0x05, 0xac, 0x01, 0x03, 0x03, 0x07, 0x04, 0x02,
463  0x08, 0x0a, 0xcb, 0xae, 0x92, 0x63, 0x00, 0x00, 0x00, 0x00 };
464 
465  Packet *p = PacketGetFromAlloc();
466  FAIL_IF_NULL(p);
467  ThreadVars tv;
469 
470  memset(&tv, 0, sizeof(ThreadVars));
471  memset(&dtv, 0, sizeof(DecodeThreadVars));
472 
473  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
474 
476  SCFree(p);
477  PASS;
478 }
479 
480 /** DecodePPPOEtest09
481  * \brief Valid PPPOE packet with 16 bit protocol field - check the valid ICMP type is accepted
482  * \retval 1 Expected test value
483  */
484 static int DecodePPPOEtest09(void)
485 {
486 
487  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x2d, 0x00, 0x1c, 0x00, 0x21, 0x45, 0x00, 0x00, 0x1d,
488  0x97, 0xc3, 0x00, 0x00, 0x40, 0x01, 0x47, 0x0f, 0x0a, 0x64, 0x00, 0x00, 0xc0, 0xa8, 0xd1,
489  0x01, 0x08, 0x00, 0xd4, 0x4c, 0x1f, 0x32, 0x04, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490  0x00, 0x00, 0x00, 0x00, 0x00 };
491 
492  Packet *p = PacketGetFromAlloc();
493  FAIL_IF_NULL(p);
494  ThreadVars tv;
496 
497  memset(&tv, 0, sizeof(ThreadVars));
498  memset(&dtv, 0, sizeof(DecodeThreadVars));
499 
500  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
501 
503  SCFree(p);
504  PASS;
505 }
506 
507 /** DecodePPPOEtest10
508  * \brief Valid PPPOE packet with 16 bit protocol field - check the valid HTTP type is accepted
509  * \retval 1 Expected test value
510  */
511 static int DecodePPPOEtest10(void)
512 {
513 
514  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x2d, 0x00, 0x3d, 0x00, 0x21, 0x45, 0x00, 0x00, 0x3c,
515  0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0xed, 0xda, 0x0a, 0x64, 0x00, 0x00, 0x8e, 0xfa, 0xb3,
516  0x83, 0xde, 0xb5, 0x00, 0x50, 0xd4, 0xbd, 0x76, 0x54, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02,
517  0xfe, 0xcc, 0x74, 0x2f, 0x00, 0x00, 0x02, 0x04, 0x05, 0xac, 0x01, 0x03, 0x03, 0x07, 0x04,
518  0x02, 0x08, 0x0a, 0xcb, 0xae, 0x92, 0x63, 0x00, 0x00, 0x00, 0x00 };
519 
520  Packet *p = PacketGetFromAlloc();
521  FAIL_IF_NULL(p);
522  ThreadVars tv;
524 
525  memset(&tv, 0, sizeof(ThreadVars));
526  memset(&dtv, 0, sizeof(DecodeThreadVars));
527 
528  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
529 
531  SCFree(p);
532  PASS;
533 }
534 #endif /* UNITTESTS */
535 
536 /**
537  * \brief Registers PPPOE unit tests
538  * \todo More PPPOE tests
539  */
541 {
542 #ifdef UNITTESTS
543  UtRegisterTest("DecodePPPOEtest01", DecodePPPOEtest01);
544  UtRegisterTest("DecodePPPOEtest02", DecodePPPOEtest02);
545  UtRegisterTest("DecodePPPOEtest03", DecodePPPOEtest03);
546  UtRegisterTest("DecodePPPOEtest04", DecodePPPOEtest04);
547  UtRegisterTest("DecodePPPOEtest05", DecodePPPOEtest05);
548  UtRegisterTest("DecodePPPOEtest06", DecodePPPOEtest06);
549  UtRegisterTest("DecodePPPOEtest07", DecodePPPOEtest07);
550  UtRegisterTest("DecodePPPOEtest08", DecodePPPOEtest08);
551  UtRegisterTest("DecodePPPOEtest09", DecodePPPOEtest09);
552  UtRegisterTest("DecodePPPOEtest10", DecodePPPOEtest10);
553 #endif /* UNITTESTS */
554 }
555 
556 /**
557  * @}
558  */
PPP_WRONG_TYPE
@ PPP_WRONG_TYPE
Definition: decode-events.h:119
ENGINE_SET_EVENT
#define ENGINE_SET_EVENT(p, e)
Definition: decode.h:904
PPP_MPLS_MCAST
#define PPP_MPLS_MCAST
Definition: decode-ppp.h:47
PPPIPV4_PKT_TOO_SMALL
@ PPPIPV4_PKT_TOO_SMALL
Definition: decode-events.h:117
len
uint8_t len
Definition: app-layer-dnp3.h:2
PPP_PAP
#define PPP_PAP
Definition: decode-ppp.h:59
PPPVJU_PKT_TOO_SMALL
@ PPPVJU_PKT_TOO_SMALL
Definition: decode-events.h:116
FAIL_IF_NULL
#define FAIL_IF_NULL(expr)
Fail a test if expression evaluates to NULL.
Definition: util-unittest.h:89
PPPOE_SESSION_HEADER_MIN_LEN
#define PPPOE_SESSION_HEADER_MIN_LEN
Definition: decode-pppoe.h:28
PPP_HELLO
#define PPP_HELLO
Definition: decode-ppp.h:43
StatsIncr
void StatsIncr(ThreadVars *tv, uint16_t id)
Increments the local counter.
Definition: counters.c:167
PPPOE_CODE_PADS
#define PPPOE_CODE_PADS
Definition: decode-pppoe.h:62
PPP_UNSUP_PROTO
@ PPP_UNSUP_PROTO
Definition: decode-events.h:120
PPP_LQM
#define PPP_LQM
Definition: decode-ppp.h:60
decode-pppoe.h
unlikely
#define unlikely(expr)
Definition: util-optimize.h:35
PPP_SNS
#define PPP_SNS
Definition: decode-ppp.h:45
UtRegisterTest
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
Definition: util-unittest.c:103
PPPOESessionHdr_
Definition: decode-pppoe.h:36
ENGINE_ISSET_EVENT
#define ENGINE_ISSET_EVENT(p, e)
Definition: decode.h:919
SCLogDebug
#define SCLogDebug(...)
Definition: util-debug.h:269
PPPOESessionHdr_::protocol
uint16_t protocol
Definition: decode-pppoe.h:41
PPP_NSCP
#define PPP_NSCP
Definition: decode-ppp.h:50
PPP_VINES
#define PPP_VINES
Definition: decode-ppp.h:42
PPPOESessionHdr_::session_id
uint16_t session_id
Definition: decode-pppoe.h:39
packet-queue.h
Packet_::pppoesh
PPPOESessionHdr * pppoesh
Definition: decode.h:579
PPP_IP
#define PPP_IP
Definition: decode-ppp.h:28
PPPOE_SESSION_GET_TYPE
#define PPPOE_SESSION_GET_TYPE(hdr)
Definition: decode-pppoe.h:31
TM_ECODE_FAILED
@ TM_ECODE_FAILED
Definition: tm-threads-common.h:85
PPP_BRPDU
#define PPP_BRPDU
Definition: decode-ppp.h:40
util-unittest.h
TM_ECODE_OK
@ TM_ECODE_OK
Definition: tm-threads-common.h:84
PPP_LUXCOM
#define PPP_LUXCOM
Definition: decode-ppp.h:44
FlowInitConfig
void FlowInitConfig(bool quiet)
initialize the configuration
Definition: flow.c:522
decode.h
util-debug.h
PPPOE_MALFORMED_TAGS
@ PPPOE_MALFORMED_TAGS
Definition: decode-events.h:125
PPP_STIICP
#define PPP_STIICP
Definition: decode-ppp.h:54
PASS
#define PASS
Pass the test.
Definition: util-unittest.h:105
PPP_IPX
#define PPP_IPX
Definition: decode-ppp.h:35
decode-ppp.h
ThreadVars_
Per thread variable structure.
Definition: threadvars.h:57
PPP_IPCP
#define PPP_IPCP
Definition: decode-ppp.h:48
PPPOE_SESSION_GET_VERSION
#define PPPOE_SESSION_GET_VERSION(hdr)
Definition: decode-pppoe.h:30
PPPOE_PKT_TOO_SMALL
@ PPPOE_PKT_TOO_SMALL
Definition: decode-events.h:123
PPPIPV6_PKT_TOO_SMALL
@ PPPIPV6_PKT_TOO_SMALL
Definition: decode-events.h:118
PPP_VJ_COMP
#define PPP_VJ_COMP
Definition: decode-ppp.h:34
PPP_VINESCP
#define PPP_VINESCP
Definition: decode-ppp.h:55
PPPOE_WRONG_CODE
@ PPPOE_WRONG_CODE
Definition: decode-events.h:124
ICMPV4_UNKNOWN_TYPE
@ ICMPV4_UNKNOWN_TYPE
Definition: decode-events.h:49
PPP_MPLSCP
#define PPP_MPLSCP
Definition: decode-ppp.h:57
pppoe_length
uint16_t pppoe_length
Definition: decode-pppoe.h:3
PPPOE_CODE_PADI
#define PPPOE_CODE_PADI
Definition: decode-pppoe.h:59
Packet_
Definition: decode.h:437
DecodeIPV6
int DecodeIPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint16_t len)
Definition: decode-ipv6.c:564
PPPOE_CODE_PADT
#define PPPOE_CODE_PADT
Definition: decode-pppoe.h:63
IPV4_GET_RAW_VER
#define IPV4_GET_RAW_VER(ip4h)
Definition: decode-ipv4.h:95
PPP_DECNETCP
#define PPP_DECNETCP
Definition: decode-ppp.h:51
decode-events.h
dtv
DecodeThreadVars * dtv
Definition: fuzz_decodepcapfile.c:33
IPV4Hdr_
Definition: decode-ipv4.h:72
DecodePPPOEDiscovery
int DecodePPPOEDiscovery(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len)
Main decoding function for PPPOE Discovery packets.
Definition: decode-pppoe.c:50
PPP_APPLE
#define PPP_APPLE
Definition: decode-ppp.h:39
PPPOE_DISCOVERY_GET_TYPE
#define PPPOE_DISCOVERY_GET_TYPE(hdr)
Definition: decode-pppoe.h:33
FAIL_IF
#define FAIL_IF(expr)
Fail a test if expression evaluates to true.
Definition: util-unittest.h:71
SCNtohs
#define SCNtohs(x)
Definition: suricata-common.h:414
suricata-common.h
PPPOE_DISCOVERY_GET_VERSION
#define PPPOE_DISCOVERY_GET_VERSION(hdr)
Definition: decode-pppoe.h:32
FlowShutdown
void FlowShutdown(void)
shutdown the flow engine
Definition: flow.c:670
PPP_MPLS_UCAST
#define PPP_MPLS_UCAST
Definition: decode-ppp.h:46
IPV4_HEADER_LEN
#define IPV4_HEADER_LEN
Definition: decode-ipv4.h:28
DecodePPPOERegisterTests
void DecodePPPOERegisterTests(void)
Registers PPPOE unit tests.
Definition: decode-pppoe.c:540
PPP_NS
#define PPP_NS
Definition: decode-ppp.h:37
PPP_DECNET
#define PPP_DECNET
Definition: decode-ppp.h:38
tv
ThreadVars * tv
Definition: fuzz_decodepcapfile.c:32
PPPOESessionHdr_::pppoe_code
uint8_t pppoe_code
Definition: decode-pppoe.h:38
util-validate.h
PacketGetFromAlloc
Packet * PacketGetFromAlloc(void)
Get a malloced packet.
Definition: decode.c:229
PPP_IPV6
#define PPP_IPV6
Definition: decode-ppp.h:29
DecodeThreadVars_::counter_pppoe
uint16_t counter_pppoe
Definition: decode.h:727
SCFree
#define SCFree(p)
Definition: util-mem.h:61
DecodeThreadVars_
Structure to hold thread specific data for all decode modules.
Definition: decode.h:685
PPPOE_CODE_PADO
#define PPPOE_CODE_PADO
Definition: decode-pppoe.h:60
DecodePPPOESession
int DecodePPPOESession(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len)
Main decoding function for PPPOE Session packets.
Definition: decode-pppoe.c:125
Packet_::pppoedh
PPPOEDiscoveryHdr * pppoedh
Definition: decode.h:580
PPPOE_DISCOVERY_HEADER_MIN_LEN
#define PPPOE_DISCOVERY_HEADER_MIN_LEN
Definition: decode-pppoe.h:29
PPP_STII
#define PPP_STII
Definition: decode-ppp.h:41
PPP_CHAP
#define PPP_CHAP
Definition: decode-ppp.h:61
PPP_APPLECP
#define PPP_APPLECP
Definition: decode-ppp.h:52
ENGINE_SET_INVALID_EVENT
#define ENGINE_SET_INVALID_EVENT(p, e)
Definition: decode.h:912
FLOW_QUIET
#define FLOW_QUIET
Definition: flow.h:42
PPP_IPXCP
#define PPP_IPXCP
Definition: decode-ppp.h:53
PPPOESessionHdr_::pppoe_length
uint16_t pppoe_length
Definition: decode-pppoe.h:40
IPV6_HEADER_LEN
#define IPV6_HEADER_LEN
Definition: decode-ipv6.h:27
PPP_VJ_UCOMP
#define PPP_VJ_UCOMP
Definition: decode-ppp.h:30
PPPOE_CODE_PADR
#define PPPOE_CODE_PADR
Definition: decode-pppoe.h:61
flow.h
DecodeIPV4
int DecodeIPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint16_t len)
Definition: decode-ipv4.c:520
PPP_IPV6CP
#define PPP_IPV6CP
Definition: decode-ppp.h:56
PPPOESessionHdr_::pppoe_version_type
uint8_t pppoe_version_type
Definition: decode-pppoe.h:37
DEBUG_VALIDATE_BUG_ON
#define DEBUG_VALIDATE_BUG_ON(exp)
Definition: util-validate.h:103
PPP_OSI
#define PPP_OSI
Definition: decode-ppp.h:36
PPP_OSICP
#define PPP_OSICP
Definition: decode-ppp.h:49
PPP_LCP
#define PPP_LCP
Definition: decode-ppp.h:58