From 458ac1aba44b3287c539431f098ce3de26480274 Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Tue, 8 Jul 2014 15:03:38 +0300 Subject: [PATCH] ie: Simple informational element parser The parsing API goes through the byte stream and parses the TLV (Type, Length and Value) values and avoids data copying. --- Makefile.am | 2 +- src/ie.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/ie.h | 14 ++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/ie.c diff --git a/Makefile.am b/Makefile.am index c23ff105..40938d25 100644 --- a/Makefile.am +++ b/Makefile.am @@ -40,7 +40,7 @@ src_iwd_SOURCES = src/main.c linux/nl80211.h linux/kdbus.h \ src/kdbus.h src/kdbus.c \ src/netdev.h src/netdev.c \ src/sha1.h src/sha1.c \ - src/ie.h + src/ie.h src/ie.c src_iwd_LDADD = ell/libell-internal.la client_iwctl_SOURCES = client/main.c linux/kdbus.h \ diff --git a/src/ie.c b/src/ie.c new file mode 100644 index 00000000..35057cf7 --- /dev/null +++ b/src/ie.c @@ -0,0 +1,65 @@ +/* + * + * Wireless daemon for Linux + * + * Copyright (C) 2014 Intel Corporation. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "ie.h" + +void ie_tlv_iter_init(struct ie_tlv_iter *iter, const unsigned char *tlv, + unsigned int len) +{ + iter->tlv = tlv; + iter->max = len; + iter->pos = 0; +} + +unsigned int ie_tlv_iter_get_tag(struct ie_tlv_iter *iter) +{ + return iter->tag; +} + +bool ie_tlv_iter_next(struct ie_tlv_iter *iter) +{ + const unsigned char *tlv = iter->tlv + iter->pos; + const unsigned char *end = iter->tlv + iter->max; + unsigned int tag; + unsigned int len; + + tag = *tlv++; + len = *tlv++; + + if (tlv + len > end) + return false; + + iter->tag = tag; + iter->len = len; + iter->data = tlv; + + iter->pos = tlv + len - iter->tlv; + + return true; +} diff --git a/src/ie.h b/src/ie.h index fb57781a..8b3faa7f 100644 --- a/src/ie.h +++ b/src/ie.h @@ -153,3 +153,17 @@ enum ie_type { IE_TYPE_VENDOR_SPECIFIC = 221, /* Reserved 222 - 255 */ }; + +struct ie_tlv_iter { + unsigned int max; + unsigned int pos; + const unsigned char *tlv; + unsigned int tag; + unsigned int len; + const unsigned char *data; +}; + +void ie_tlv_iter_init(struct ie_tlv_iter *iter, const unsigned char *tlv, + unsigned int len); +unsigned int ie_tlv_iter_get_tag(struct ie_tlv_iter *iter); +bool ie_tlv_iter_next(struct ie_tlv_iter *iter);