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  * \file
26  *
27  * \author James Riden <jamesr@europe.com>
28  *
29  * PPPOE Decoder
30  */
31 
32 #include "suricata-common.h"
33 
34 #include "packet-queue.h"
35 
36 #include "decode.h"
37 #include "decode-ppp.h"
38 #include "decode-pppoe.h"
39 #include "decode-events.h"
40 #include "flow.h"
41 
42 #include "util-validate.h"
43 #include "util-debug.h"
44 
45 /**
46  * \brief Main decoding function for PPPOE Discovery packets
47  */
49  ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len)
50 {
51  DEBUG_VALIDATE_BUG_ON(pkt == NULL);
52 
54 
57  return TM_ECODE_FAILED;
58  }
59 
60  PPPOEDiscoveryHdr *pppoedh = (PPPOEDiscoveryHdr *)pkt;
61 
62  /* parse the PPPOE code */
63  switch (pppoedh->pppoe_code) {
64  case PPPOE_CODE_PADI:
65  break;
66  case PPPOE_CODE_PADO:
67  break;
68  case PPPOE_CODE_PADR:
69  break;
70  case PPPOE_CODE_PADS:
71  break;
72  case PPPOE_CODE_PADT:
73  break;
74  default:
75  SCLogDebug("unknown PPPOE code: 0x%0" PRIX8 "", pppoedh->pppoe_code);
77  return TM_ECODE_OK;
78  }
79 
80  uint32_t pppoe_length = SCNtohs(pppoedh->pppoe_length);
81  uint32_t packet_length = len - PPPOE_DISCOVERY_HEADER_MIN_LEN;
82 
83  SCLogDebug("pppoe_length %" PRIu32 ", packet_length %" PRIu32 "", pppoe_length, packet_length);
84 
85  if (pppoe_length > packet_length) {
86  SCLogDebug("malformed PPPOE tags");
88  return TM_ECODE_OK;
89  }
90 
91 #ifdef DEBUG
92  /* parse any tags we have in the packet */
93 
94  uint32_t tag_length = 0;
95  const uint8_t *pkt_pppoedt = pkt + PPPOE_DISCOVERY_HEADER_MIN_LEN;
96 
97  // packet_length >= pppoe_length so we have enough data
98  while (pppoe_length >= sizeof(PPPOEDiscoveryTag)) {
99  PPPOEDiscoveryTag *pppoedt = (PPPOEDiscoveryTag *)pkt_pppoedt;
100  uint16_t tag_type = SCNtohs(pppoedt->pppoe_tag_type);
101  // upgrade to u32 to avoid u16 overflow
102  tag_length = SCNtohs(pppoedt->pppoe_tag_length);
103 
104  SCLogDebug("PPPoE Tag type %x, length %" PRIu32, tag_type, tag_length);
105 
106  if (pppoe_length >= (4 + tag_length)) {
107  pppoe_length -= (4 + tag_length);
108  pkt_pppoedt = pkt_pppoedt + (4 + tag_length);
109  } else {
110  pppoe_length = 0; // don't want an underflow
111  }
112  }
113 #endif
114 
115  return TM_ECODE_OK;
116 }
117 
118 /**
119  * \brief Main decoding function for PPPOE Session packets
120  */
122  ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len)
123 {
124  DEBUG_VALIDATE_BUG_ON(pkt == NULL);
125 
127 
130  return TM_ECODE_FAILED;
131  }
132 
133  PPPOESessionHdr *pppoesh = (PPPOESessionHdr *)pkt;
134 
135  SCLogDebug("PPPOE VERSION %" PRIu32 " TYPE %" PRIu32 " CODE %" PRIu32 " SESSIONID %" PRIu32
136  " LENGTH %" PRIu32 "",
138  pppoesh->pppoe_code, SCNtohs(pppoesh->session_id), SCNtohs(pppoesh->pppoe_length));
139 
140  /* can't use DecodePPP() here because we only get a single 2-byte word to indicate protocol
141  * instead of the full PPP header */
142  if (SCNtohs(pppoesh->pppoe_length) > 0) {
143  /* decode contained PPP packet */
144 
145  uint8_t pppoesh_len;
146  uint16_t ppp_protocol;
147  /* RFC1661: if LSB of the first protocol octet is set, it is a single-octet field. */
148  const uint8_t proto_hi = pkt[PPPOE_SESSION_HEADER_MIN_LEN - 1];
149  if (proto_hi & 0x01) {
150  /* Single-octet variant */
151  ppp_protocol = proto_hi;
152  pppoesh_len = PPPOE_SESSION_HEADER_MIN_LEN;
153  } else {
154  /* Double-octet variant; need one more byte */
155  pppoesh_len = PPPOE_SESSION_HEADER_MIN_LEN + 1;
156  if (len < pppoesh_len) {
158  return TM_ECODE_FAILED;
159  }
160  ppp_protocol =
161  (uint16_t)(((uint16_t)proto_hi << 8) | pkt[PPPOE_SESSION_HEADER_MIN_LEN]);
162  }
163 
164  SCLogDebug("Protocol %" PRIu16 " len %" PRIu8 "", ppp_protocol, pppoesh_len);
165 
166  switch (ppp_protocol) {
167  case PPP_VJ_COMP:
168  case PPP_IPX:
169  case PPP_OSI:
170  case PPP_NS:
171  case PPP_DECNET:
172  case PPP_APPLE:
173  case PPP_BRPDU:
174  case PPP_STII:
175  case PPP_VINES:
176  case PPP_HELLO:
177  case PPP_LUXCOM:
178  case PPP_SNS:
179  case PPP_MPLS_UCAST:
180  case PPP_MPLS_MCAST:
181  case PPP_OSICP:
182  case PPP_NSCP:
183  case PPP_DECNETCP:
184  case PPP_APPLECP:
185  case PPP_IPXCP:
186  case PPP_STIICP:
187  case PPP_VINESCP:
188  case PPP_MPLSCP:
190  break;
191 
192  case PPP_IPCP:
193  case PPP_IPV6CP:
194  case PPP_LCP:
195  case PPP_PAP:
196  case PPP_CHAP:
197  case PPP_CCP:
198  case PPP_LQM:
199  case PPP_CBCP:
200  case PPP_COMP_DGRAM:
201  case PPP_CDPCP:
202  /* Valid types to be in PPP but don't inspect validity. */
203  break;
204 
205  case PPP_VJ_UCOMP:
206 
207  if (len - pppoesh_len < IPV4_HEADER_LEN) {
209  return TM_ECODE_OK;
210  }
211  if (unlikely(len - pppoesh_len > USHRT_MAX)) {
212  return TM_ECODE_FAILED;
213  }
214 
215  if (IPV4_GET_RAW_VER((IPV4Hdr *)(pkt + pppoesh_len)) == 4) {
216  DecodeIPV4(tv, dtv, p, pkt + pppoesh_len, (uint16_t)(len - pppoesh_len));
217  }
218  break;
219 
220  case PPP_IP:
221  if (len - pppoesh_len < IPV4_HEADER_LEN) {
223  return TM_ECODE_OK;
224  }
225  if (unlikely(len - pppoesh_len > USHRT_MAX)) {
226  return TM_ECODE_FAILED;
227  }
228  DecodeIPV4(tv, dtv, p, pkt + pppoesh_len, (uint16_t)(len - pppoesh_len));
229  break;
230 
231  /* PPP IPv6 was not tested */
232  case PPP_IPV6:
233  if (len - pppoesh_len < IPV6_HEADER_LEN) {
235  return TM_ECODE_OK;
236  }
237  DecodeIPV6(tv, dtv, p, pkt + pppoesh_len, len - pppoesh_len);
238  break;
239 
240  default:
241  SCLogDebug("unknown PPP protocol: %" PRIx32 "", ppp_protocol);
243  return TM_ECODE_OK;
244  }
245  }
246  return TM_ECODE_OK;
247 }
248 
249 #ifdef UNITTESTS
250 /** DecodePPPOEtest01
251  * \brief Decode malformed PPPOE packet (too short)
252  * \retval 1 Expected test value
253  */
254 static int DecodePPPOEtest01(void)
255 {
256 
257  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x00, 0x00 };
259  FAIL_IF_NULL(p);
260  ThreadVars tv;
262 
263  memset(&tv, 0, sizeof(ThreadVars));
264  memset(&dtv, 0, sizeof(DecodeThreadVars));
265 
266  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
267 
269 
270  PacketFree(p);
271  PASS;
272 }
273 
274 /** DecodePPPOEtest02
275  * \brief Valid PPPOE packet - check the invalid ICMP type encapsulated is flagged
276  * \retval 0 Expected test value
277  */
278 static int DecodePPPOEtest02(void)
279 {
280 
281  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x21, 0x45, 0x00, 0x00, 0x3c,
282  0x05, 0x5c, 0x00, 0x00, 0x20, 0x01, 0xff, 0x30, 0xc0, 0xa8, 0x0a, 0x7f, 0xc0, 0xa8, 0x0a,
283  0x65, 0xab, 0xcd, 0x16, 0x5e, 0x02, 0x00, 0x37, 0x00, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
284  0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55,
285  0x56, 0x57, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49 };
286 
288  FAIL_IF_NULL(p);
289  ThreadVars tv;
291 
292  memset(&tv, 0, sizeof(ThreadVars));
293  memset(&dtv, 0, sizeof(DecodeThreadVars));
294 
296 
297  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
298 
300 
301  // and we insist that the invalid ICMP encapsulated (type 0xab, code 0xcd) is flagged
303 
304  FlowShutdown();
305  PacketFree(p);
306  PASS;
307 }
308 
309 /** DecodePPPOEtest03
310  * \brief Valid example PADO packet PPPOE packet taken from RFC2516
311  * \retval 0 Expected test value
312  */
313 static int DecodePPPOEtest03(void)
314 {
315  /* example PADO packet taken from RFC2516 */
316  uint8_t raw_pppoe[] = { 0x11, 0x07, 0x00, 0x00, 0x00, 0x20, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02,
317  0x00, 0x18, 0x47, 0x6f, 0x20, 0x52, 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x20, 0x2d, 0x20,
318  0x65, 0x73, 0x68, 0x73, 0x68, 0x65, 0x73, 0x68, 0x6f, 0x6f, 0x74 };
319 
321  FAIL_IF_NULL(p);
322  ThreadVars tv;
324 
325  memset(&tv, 0, sizeof(ThreadVars));
326  memset(&dtv, 0, sizeof(DecodeThreadVars));
327 
328  int r = DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
329  FAIL_IF_NOT(r == TM_ECODE_OK);
330 
331  PacketFree(p);
332  PASS;
333 }
334 
335 /** DecodePPPOEtest04
336  * \brief Valid example PPPOE packet taken from RFC2516 - but with wrong PPPOE code
337  * \retval 1 Expected test value
338  */
339 static int DecodePPPOEtest04(void)
340 {
341 
342  /* example PADI packet taken from RFC2516, but with wrong code */
343  uint8_t raw_pppoe[] = { 0x11, 0xbb, 0x00, 0x00, 0x00, 0x04, 0x01, 0x01, 0x00, 0x00 };
344 
346  FAIL_IF_NULL(p);
347  ThreadVars tv;
349 
350  memset(&tv, 0, sizeof(ThreadVars));
351  memset(&dtv, 0, sizeof(DecodeThreadVars));
352 
353  DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
354 
356 
357  PacketFree(p);
358  PASS;
359 }
360 
361 /** DecodePPPOEtest05
362  * \brief Valid example PADO PPPOE packet taken from RFC2516, but too short for given length
363  * \retval 0 Expected test value
364  */
365 static int DecodePPPOEtest05(void)
366 {
367 
368  /* example PADI packet taken from RFC2516 */
369  uint8_t raw_pppoe[] = { 0x11, 0x07, 0x00, 0x00, 0x00, 0x20, 0x01, 0x01, 0x00, 0x00, 0x01, 0x02,
370  0x00, 0x18, 0x47, 0x6f, 0x20, 0x52, 0x65, 0x64, 0x42, 0x61, 0x63, 0x6b, 0x20, 0x2d, 0x20,
371  0x65, 0x73, 0x68, 0x73, 0x68 };
372 
374  FAIL_IF_NULL(p);
375  ThreadVars tv;
377 
378  memset(&tv, 0, sizeof(ThreadVars));
379  memset(&dtv, 0, sizeof(DecodeThreadVars));
380 
381  DecodePPPOEDiscovery(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
382 
384 
385  PacketFree(p);
386  PASS;
387 }
388 
389 /** DecodePPPOEtest06
390  * \brief Check that the macros work as expected. Type and version are
391  * fields of 4 bits length. So they are sharing the same var and the macros
392  * should extract the first 4 bits for version and the second 4 bits for type
393  * \retval 1 Expected test value
394  */
395 static int DecodePPPOEtest06(void)
396 {
397 
398  PPPOESessionHdr pppoesh;
399  PPPOEDiscoveryHdr pppoedh;
400  pppoesh.pppoe_version_type = 0xAB;
401  pppoedh.pppoe_version_type = 0xCD;
402 
403  FAIL_IF(PPPOE_SESSION_GET_VERSION(&pppoesh) != 0x0A);
404  FAIL_IF(PPPOE_SESSION_GET_TYPE(&pppoesh) != 0x0B);
405  FAIL_IF(PPPOE_DISCOVERY_GET_VERSION(&pppoedh) != 0x0C);
406  FAIL_IF(PPPOE_DISCOVERY_GET_TYPE(&pppoedh) != 0x0D);
407  PASS;
408 }
409 
410 /** DecodePPPOEtest07
411  * \brief Valid PPPOE packet with 8 bit protocol field - check the valid ICMP type is accepted
412  * \retval 1 Expected test value
413  */
414 static int DecodePPPOEtest07(void)
415 {
416 
417  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x2d, 0x00, 0x1c, 0x21, 0x45, 0x00, 0x00, 0x1d, 0x97,
418  0xc3, 0x00, 0x00, 0x40, 0x01, 0x47, 0x0f, 0x0a, 0x64, 0x00, 0x00, 0xc0, 0xa8, 0xd1, 0x01,
419  0x08, 0x00, 0xd4, 0x4c, 0x1f, 0x32, 0x04, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420  0x00, 0x00, 0x00, 0x00 };
421 
423  FAIL_IF_NULL(p);
424  ThreadVars tv;
426 
427  memset(&tv, 0, sizeof(ThreadVars));
428  memset(&dtv, 0, sizeof(DecodeThreadVars));
429 
430  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
431 
433  PacketFree(p);
434  PASS;
435 }
436 
437 /** DecodePPPOEtest08
438  * \brief Valid PPPOE packet with 8 bit protocol field - check the valid HTTP type is accepted
439  * \retval 1 Expected test value
440  */
441 static int DecodePPPOEtest08(void)
442 {
443 
444  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x2d, 0x00, 0x3d, 0x21, 0x45, 0x00, 0x00, 0x3c, 0x00,
445  0x00, 0x40, 0x00, 0x40, 0x06, 0xed, 0xda, 0x0a, 0x64, 0x00, 0x00, 0x8e, 0xfa, 0xb3, 0x83,
446  0xde, 0xb5, 0x00, 0x50, 0xd4, 0xbd, 0x76, 0x54, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, 0xfe,
447  0xcc, 0x74, 0x2f, 0x00, 0x00, 0x02, 0x04, 0x05, 0xac, 0x01, 0x03, 0x03, 0x07, 0x04, 0x02,
448  0x08, 0x0a, 0xcb, 0xae, 0x92, 0x63, 0x00, 0x00, 0x00, 0x00 };
449 
451  FAIL_IF_NULL(p);
452  ThreadVars tv;
454 
455  memset(&tv, 0, sizeof(ThreadVars));
456  memset(&dtv, 0, sizeof(DecodeThreadVars));
457 
458  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
459 
461  PacketFree(p);
462  PASS;
463 }
464 
465 /** DecodePPPOEtest09
466  * \brief Valid PPPOE packet with 16 bit protocol field - check the valid ICMP type is accepted
467  * \retval 1 Expected test value
468  */
469 static int DecodePPPOEtest09(void)
470 {
471 
472  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x2d, 0x00, 0x1c, 0x00, 0x21, 0x45, 0x00, 0x00, 0x1d,
473  0x97, 0xc3, 0x00, 0x00, 0x40, 0x01, 0x47, 0x0f, 0x0a, 0x64, 0x00, 0x00, 0xc0, 0xa8, 0xd1,
474  0x01, 0x08, 0x00, 0xd4, 0x4c, 0x1f, 0x32, 0x04, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
475  0x00, 0x00, 0x00, 0x00, 0x00 };
476 
478  FAIL_IF_NULL(p);
479  ThreadVars tv;
481 
482  memset(&tv, 0, sizeof(ThreadVars));
483  memset(&dtv, 0, sizeof(DecodeThreadVars));
484 
485  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
486 
488  PacketFree(p);
489  PASS;
490 }
491 
492 /** DecodePPPOEtest10
493  * \brief Valid PPPOE packet with 16 bit protocol field - check the valid HTTP type is accepted
494  * \retval 1 Expected test value
495  */
496 static int DecodePPPOEtest10(void)
497 {
498 
499  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x2d, 0x00, 0x3d, 0x00, 0x21, 0x45, 0x00, 0x00, 0x3c,
500  0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0xed, 0xda, 0x0a, 0x64, 0x00, 0x00, 0x8e, 0xfa, 0xb3,
501  0x83, 0xde, 0xb5, 0x00, 0x50, 0xd4, 0xbd, 0x76, 0x54, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02,
502  0xfe, 0xcc, 0x74, 0x2f, 0x00, 0x00, 0x02, 0x04, 0x05, 0xac, 0x01, 0x03, 0x03, 0x07, 0x04,
503  0x02, 0x08, 0x0a, 0xcb, 0xae, 0x92, 0x63, 0x00, 0x00, 0x00, 0x00 };
504 
506  FAIL_IF_NULL(p);
507  ThreadVars tv;
509 
510  memset(&tv, 0, sizeof(ThreadVars));
511  memset(&dtv, 0, sizeof(DecodeThreadVars));
512 
513  DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
514 
516  PacketFree(p);
517  PASS;
518 }
519 
520 /**
521  * \brief PPPOE session packet of exactly PPPOE_SESSION_HEADER_MIN_LEN bytes with a
522  * double-octet protocol field, so packet is too small.
523  */
524 static int DecodePPPOEtest11(void)
525 {
526  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x2d, 0x00, 0x01, 0x00 };
528  FAIL_IF_NULL(p);
529  ThreadVars tv;
531 
532  memset(&tv, 0, sizeof(ThreadVars));
533  memset(&dtv, 0, sizeof(DecodeThreadVars));
534 
535  int ret = DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
536  FAIL_IF(ret != TM_ECODE_FAILED);
538 
539  PacketFree(p);
540  PASS;
541 }
542 
543 /**
544  * \brief PPPOE session packet of exactly PPPOE_SESSION_HEADER_MIN_LEN bytes with a
545  * single-octet protocol field (PPP_IP)
546  */
547 static int DecodePPPOEtest12(void)
548 {
549  uint8_t raw_pppoe[] = { 0x11, 0x00, 0x00, 0x2d, 0x00, 0x01, 0x21 };
551  FAIL_IF_NULL(p);
552  ThreadVars tv;
554 
555  memset(&tv, 0, sizeof(ThreadVars));
556  memset(&dtv, 0, sizeof(DecodeThreadVars));
557 
558  int ret = DecodePPPOESession(&tv, &dtv, p, raw_pppoe, sizeof(raw_pppoe));
559  FAIL_IF(ret != TM_ECODE_OK);
562 
563  PacketFree(p);
564  PASS;
565 }
566 #endif /* UNITTESTS */
567 
568 /**
569  * \brief Registers PPPOE unit tests
570  * \todo More PPPOE tests
571  */
573 {
574 #ifdef UNITTESTS
575  UtRegisterTest("DecodePPPOEtest01", DecodePPPOEtest01);
576  UtRegisterTest("DecodePPPOEtest02", DecodePPPOEtest02);
577  UtRegisterTest("DecodePPPOEtest03", DecodePPPOEtest03);
578  UtRegisterTest("DecodePPPOEtest04", DecodePPPOEtest04);
579  UtRegisterTest("DecodePPPOEtest05", DecodePPPOEtest05);
580  UtRegisterTest("DecodePPPOEtest06", DecodePPPOEtest06);
581  UtRegisterTest("DecodePPPOEtest07", DecodePPPOEtest07);
582  UtRegisterTest("DecodePPPOEtest08", DecodePPPOEtest08);
583  UtRegisterTest("DecodePPPOEtest09", DecodePPPOEtest09);
584  UtRegisterTest("DecodePPPOEtest10", DecodePPPOEtest10);
585  UtRegisterTest("DecodePPPOEtest11", DecodePPPOEtest11);
586  UtRegisterTest("DecodePPPOEtest12", DecodePPPOEtest12);
587 #endif /* UNITTESTS */
588 }
589 
590 /**
591  * @}
592  */
ENGINE_SET_EVENT
#define ENGINE_SET_EVENT(p, e)
Definition: decode.h:1231
PPP_MPLS_MCAST
#define PPP_MPLS_MCAST
Definition: decode-ppp.h:47
PPPVJU_PKT_TOO_SMALL
@ PPPVJU_PKT_TOO_SMALL
Definition: decode-events.h:124
len
uint8_t len
Definition: app-layer-dnp3.h:2
PPP_PAP
#define PPP_PAP
Definition: decode-ppp.h:60
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
PPPOE_CODE_PADS
#define PPPOE_CODE_PADS
Definition: decode-pppoe.h:59
PPP_LQM
#define PPP_LQM
Definition: decode-ppp.h:61
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:101
PPPOESessionHdr_
Definition: decode-pppoe.h:35
PPP_CDPCP
#define PPP_CDPCP
Definition: decode-ppp.h:57
ENGINE_ISSET_EVENT
#define ENGINE_ISSET_EVENT(p, e)
Definition: decode.h:1244
PPP_COMP_DGRAM
#define PPP_COMP_DGRAM
Definition: decode-ppp.h:65
SCLogDebug
#define SCLogDebug(...)
Definition: util-debug.h:282
PPP_NSCP
#define PPP_NSCP
Definition: decode-ppp.h:50
PPP_VINES
#define PPP_VINES
Definition: decode-ppp.h:42
PPP_CBCP
#define PPP_CBCP
Definition: decode-ppp.h:64
PPPOESessionHdr_::session_id
uint16_t session_id
Definition: decode-pppoe.h:38
packet-queue.h
DecodeThreadVars_::counter_pppoe
StatsCounterId counter_pppoe
Definition: decode.h:1046
PPP_IP
#define PPP_IP
Definition: decode-ppp.h:28
p
Packet * p
Definition: fuzz_dataset.c:30
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:82
PPP_WRONG_TYPE
@ PPP_WRONG_TYPE
Definition: decode-events.h:127
ICMPV4_UNKNOWN_TYPE
@ ICMPV4_UNKNOWN_TYPE
Definition: decode-events.h:53
PPP_BRPDU
#define PPP_BRPDU
Definition: decode-ppp.h:40
FAIL_IF_NOT
#define FAIL_IF_NOT(expr)
Fail a test if expression evaluates to false.
Definition: util-unittest.h:82
TM_ECODE_OK
@ TM_ECODE_OK
Definition: tm-threads-common.h:81
PPP_LUXCOM
#define PPP_LUXCOM
Definition: decode-ppp.h:44
FlowInitConfig
void FlowInitConfig(bool quiet)
initialize the configuration
Definition: flow.c:574
decode.h
util-debug.h
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
PPPIPV4_PKT_TOO_SMALL
@ PPPIPV4_PKT_TOO_SMALL
Definition: decode-events.h:125
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
StatsCounterIncr
void StatsCounterIncr(StatsThreadContext *stats, StatsCounterId id)
Increments the local counter.
Definition: counters.c:163
PacketFree
void PacketFree(Packet *p)
Return a malloced packet.
Definition: decode.c:221
PPPOE_WRONG_CODE
@ PPPOE_WRONG_CODE
Definition: decode-events.h:132
PPP_VJ_COMP
#define PPP_VJ_COMP
Definition: decode-ppp.h:34
PPP_VINESCP
#define PPP_VINESCP
Definition: decode-ppp.h:55
PPP_MPLSCP
#define PPP_MPLSCP
Definition: decode-ppp.h:58
PPPOE_PKT_TOO_SMALL
@ PPPOE_PKT_TOO_SMALL
Definition: decode-events.h:131
pppoe_length
uint16_t pppoe_length
Definition: decode-pppoe.h:3
PPPOE_CODE_PADI
#define PPPOE_CODE_PADI
Definition: decode-pppoe.h:56
Packet_
Definition: decode.h:516
PPPOE_CODE_PADT
#define PPPOE_CODE_PADT
Definition: decode-pppoe.h:60
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
DecodeIPV6
int DecodeIPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len)
Definition: decode-ipv6.c:551
decode-events.h
dtv
DecodeThreadVars * dtv
Definition: fuzz_decodepcapfile.c:35
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:48
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:436
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:718
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:572
PPP_CCP
#define PPP_CCP
Definition: decode-ppp.h:63
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:34
PPPOESessionHdr_::pppoe_code
uint8_t pppoe_code
Definition: decode-pppoe.h:37
util-validate.h
PacketGetFromAlloc
Packet * PacketGetFromAlloc(void)
Get a malloced packet.
Definition: decode.c:260
PPP_UNSUP_PROTO
@ PPP_UNSUP_PROTO
Definition: decode-events.h:128
PPP_IPV6
#define PPP_IPV6
Definition: decode-ppp.h:29
DecodeThreadVars_
Structure to hold thread specific data for all decode modules.
Definition: decode.h:995
PPPOE_CODE_PADO
#define PPPOE_CODE_PADO
Definition: decode-pppoe.h:57
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:121
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:62
PPP_APPLECP
#define PPP_APPLECP
Definition: decode-ppp.h:52
PPPIPV6_PKT_TOO_SMALL
@ PPPIPV6_PKT_TOO_SMALL
Definition: decode-events.h:126
ENGINE_SET_INVALID_EVENT
#define ENGINE_SET_INVALID_EVENT(p, e)
Definition: decode.h:1239
FLOW_QUIET
#define FLOW_QUIET
Definition: flow.h:43
PPP_IPXCP
#define PPP_IPXCP
Definition: decode-ppp.h:53
PPPOESessionHdr_::pppoe_length
uint16_t pppoe_length
Definition: decode-pppoe.h:39
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:58
flow.h
DecodeIPV4
int DecodeIPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint16_t len)
Definition: decode-ipv4.c:515
PPP_IPV6CP
#define PPP_IPV6CP
Definition: decode-ppp.h:56
ThreadVars_::stats
StatsThreadContext stats
Definition: threadvars.h:120
PPPOESessionHdr_::pppoe_version_type
uint8_t pppoe_version_type
Definition: decode-pppoe.h:36
DEBUG_VALIDATE_BUG_ON
#define DEBUG_VALIDATE_BUG_ON(exp)
Definition: util-validate.h:109
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:59
PPPOE_MALFORMED_TAGS
@ PPPOE_MALFORMED_TAGS
Definition: decode-events.h:133