From f36fde5054be41bd1f7af43752eef63844786761 Mon Sep 17 00:00:00 2001 From: angt Date: Thu, 10 Dec 2015 13:17:27 +0100 Subject: [PATCH] Add ip_get_proto() --- src/common-static.h | 5 +++++ src/common.h | 2 ++ src/ip-static.h | 17 +++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/common-static.h b/src/common-static.h index 0e2e9f1..05f37e5 100644 --- a/src/common-static.h +++ b/src/common-static.h @@ -43,6 +43,7 @@ static inline size_t str_cpy (char *restrict dst, const char *restrict src, size return i; } +_pure_ static inline int str_cmp (const char *restrict sa, const char *restrict sb) { if (!sa || !sb) @@ -55,6 +56,7 @@ static inline int str_cmp (const char *restrict sa, const char *restrict sb) return 1; } +_pure_ static inline size_t str_len (const char *restrict str) { if (!str) @@ -111,16 +113,19 @@ static inline void buffer_format (buffer_t *buffer) buffer->read = buffer->data; } +_pure_ static inline size_t buffer_size (buffer_t *buffer) { return buffer->end-buffer->data; } +_pure_ static inline size_t buffer_write_size (buffer_t *buffer) { return buffer->end-buffer->write; } +_pure_ static inline size_t buffer_read_size (buffer_t *buffer) { return buffer->write-buffer->read; diff --git a/src/common.h b/src/common.h index 1573c59..699c30b 100644 --- a/src/common.h +++ b/src/common.h @@ -20,6 +20,8 @@ #define _printf_(A,B) __attribute__((format(printf,A,B))) #define _noreturn_ __attribute__((noreturn)) #define _unused_ __attribute__((unused)) +#define _pure_ __attribute__((pure)) +#define _const_ __attribute__((const)) #define _align_(...) __attribute__((aligned(__VA_ARGS__))) typedef struct buffer buffer_t; diff --git a/src/ip-static.h b/src/ip-static.h index 368048d..074bcb3 100644 --- a/src/ip-static.h +++ b/src/ip-static.h @@ -2,6 +2,7 @@ #include +_pure_ static inline int ip_get_version (const uint8_t *data, size_t size) { if (size<20) // XXX @@ -10,6 +11,7 @@ static inline int ip_get_version (const uint8_t *data, size_t size) return data[0]>>4; } +_pure_ static inline ssize_t ip_get_size (const uint8_t *data, size_t size) { switch (ip_get_version(data, size)) { @@ -23,3 +25,18 @@ static inline ssize_t ip_get_size (const uint8_t *data, size_t size) return 0; } + +_pure_ +static inline ssize_t ip_get_proto (const uint8_t *data, size_t size) +{ + switch (ip_get_version(data, size)) { + case 4: + return data[9]; + case 6: + return data[6]; + case -1: + return -1; + } + + return 0; +}