diff options
author | Jiri Pirko <jiri@resnulli.us> | 2013-03-16 18:18:08 +0100 |
---|---|---|
committer | Jiri Pirko <jiri@resnulli.us> | 2013-03-17 11:11:48 +0100 |
commit | 3407d519b8eb9a2cda25eefcd53bf4ce950a5d64 (patch) | |
tree | 9e214c081b70984a4907c89e338ee07cdc6d4287 /libndp | |
parent | d909910c6a1ae3cc1252c6d9a7478596727b2190 (diff) | |
download | libndp-3407d519b8eb9a2cda25eefcd53bf4ce950a5d64.tar.gz |
lib: remove msg->type and rather use in header value
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Diffstat (limited to 'libndp')
-rw-r--r-- | libndp/libndp.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/libndp/libndp.c b/libndp/libndp.c index 0b75666..a9e4a69 100644 --- a/libndp/libndp.c +++ b/libndp/libndp.c @@ -29,6 +29,7 @@ #include <netinet/icmp6.h> #include <netdb.h> #include <net/ethernet.h> +#include <assert.h> #include <ndp.h> #include "ndp_private.h" @@ -127,6 +128,7 @@ void ndp_set_log_priority(struct ndp *ndp, int priority) */ #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#define BUG_ON(expr) { if (expr) assert(0); } static void *myzalloc(size_t size) { @@ -661,7 +663,6 @@ struct ndp_msg { size_t len; struct in6_addr addrto; uint32_t ifindex; - enum ndp_msg_type type; struct icmp6_hdr * icmp6_hdr; unsigned char * opts_start; /* pointer to buf at the place where opts start */ @@ -743,9 +744,11 @@ static struct ndp_msg *ndp_msg_alloc(void) return msg; } +static void ndp_msg_type_set(struct ndp_msg *msg, enum ndp_msg_type msg_type); + static void ndp_msg_init(struct ndp_msg *msg, enum ndp_msg_type msg_type) { - msg->type = msg_type; + ndp_msg_type_set(msg, msg_type); msg->opts_start = msg->buf + ndp_msg_type_info(msg_type)->raw_struct_size; } @@ -945,7 +948,18 @@ struct ndp_msgr *ndp_msgr(struct ndp_msg *msg) NDP_EXPORT enum ndp_msg_type ndp_msg_type(struct ndp_msg *msg) { - return msg->type; + enum ndp_msg_type msg_type; + int err; + + err = ndp_msg_type_by_raw_type(&msg_type, msg->icmp6_hdr->icmp6_type); + /* Type should be always set correctly (ensured by ndp_msg_init) */ + BUG_ON(err); + return msg_type; +} + +static void ndp_msg_type_set(struct ndp_msg *msg, enum ndp_msg_type msg_type) +{ + msg->icmp6_hdr->icmp6_type = ndp_msg_type_info(msg_type)->raw_type; } /** @@ -1132,7 +1146,7 @@ static int ndp_call_handlers(struct ndp *ndp, struct ndp_msg *msg) list_for_each_node_entry(handler_item, &ndp->msgrcv_handler_list, list) { if (handler_item->msg_type != NDP_MSG_ALL && - handler_item->msg_type != msg->type) + handler_item->msg_type != ndp_msg_type(msg)) continue; if (handler_item->ifindex && handler_item->ifindex != msg->ifindex) |