aboutsummaryrefslogtreecommitdiffstats
path: root/epan/ftypes
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2012-08-02 16:54:43 +0000
committerGuy Harris <guy@alum.mit.edu>2012-08-02 16:54:43 +0000
commit835111692f4a1313deb4d699a376e4496f8eabb2 (patch)
tree450e1533309ed244373923da34cafe84adca7b1c /epan/ftypes
parent89e6169fc56576893c9ffedc0541994b73521c0d (diff)
From Richard Stearn: support for AX.25, including support for
LINKTYPE_AX25. svn path=/trunk/; revision=44211
Diffstat (limited to 'epan/ftypes')
-rw-r--r--epan/ftypes/ftype-bytes.c82
-rw-r--r--epan/ftypes/ftypes.h2
2 files changed, 84 insertions, 0 deletions
diff --git a/epan/ftypes/ftype-bytes.c b/epan/ftypes/ftype-bytes.c
index 77712c71ba..4f5ab8ea3b 100644
--- a/epan/ftypes/ftype-bytes.c
+++ b/epan/ftypes/ftype-bytes.c
@@ -144,6 +144,13 @@ common_fvalue_set(fvalue_t *fv, guint8* data, guint len)
}
static void
+ax25_fvalue_set(fvalue_t *fv, gpointer value, gboolean already_copied)
+{
+ g_assert(!already_copied);
+ common_fvalue_set(fv, value, FT_AX25_ADDR_LEN);
+}
+
+static void
ether_fvalue_set(fvalue_t *fv, gpointer value, gboolean already_copied)
{
g_assert(!already_copied);
@@ -210,6 +217,42 @@ bytes_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, Log
}
static gboolean
+ax25_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc)
+{
+ gchar *mac;
+
+ /*
+ * Don't log a message if this fails; we'll try looking it
+ * up as another way if it does, and if that fails,
+ * we'll log a message.
+ */
+ if (bytes_from_unparsed(fv, s, TRUE, NULL)) {
+ if (fv->value.bytes->len > FT_AX25_ADDR_LEN) {
+ logfunc("\"%s\" contains too many bytes to be a valid AX.25 address.",
+ s);
+ return FALSE;
+ }
+ else if (fv->value.bytes->len < FT_AX25_ADDR_LEN && !allow_partial_value) {
+ logfunc("\"%s\" contains too few bytes to be a valid AX.25 address.",
+ s);
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ mac = get_ax25_name(s);
+ if (!mac) {
+ logfunc("\"%s\" is not a valid AX.25 address.",
+ s);
+ return FALSE;
+ }
+
+ ax25_fvalue_set(fv, mac, FALSE);
+ return TRUE;
+}
+
+static gboolean
ether_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc)
{
guint8 *mac;
@@ -536,6 +579,44 @@ ftype_register_bytes(void)
slice,
};
+ static ftype_t ax25_type = {
+ FT_AX25, /* ftype */
+ "FT_AX25", /* name */
+ "AX.25 address", /* pretty_name */
+ FT_AX25_ADDR_LEN, /* wire_size */
+ bytes_fvalue_new, /* new_value */
+ bytes_fvalue_free, /* free_value */
+ ax25_from_unparsed, /* val_from_unparsed */
+ NULL, /* val_from_string */
+ bytes_to_repr, /* val_to_string_repr */
+ bytes_repr_len, /* len_string_repr */
+
+ ax25_fvalue_set, /* set_value */
+ NULL, /* set_value_uinteger */
+ NULL, /* set_value_integer */
+ NULL, /* set_value_integer64 */
+ NULL, /* set_value_floating */
+
+ value_get, /* get_value */
+ NULL, /* set_value_uinteger */
+ NULL, /* get_value_integer */
+ NULL, /* get_value_integer64 */
+ NULL, /* get_value_floating */
+
+ cmp_eq,
+ cmp_ne,
+ cmp_gt,
+ cmp_ge,
+ cmp_lt,
+ cmp_le,
+ cmp_bitwise_and,
+ cmp_contains,
+ CMP_MATCHES,
+
+ len,
+ slice,
+ };
+
static ftype_t ether_type = {
FT_ETHER, /* ftype */
"FT_ETHER", /* name */
@@ -614,6 +695,7 @@ ftype_register_bytes(void)
ftype_register(FT_BYTES, &bytes_type);
ftype_register(FT_UINT_BYTES, &uint_bytes_type);
+ ftype_register(FT_AX25, &ax25_type);
ftype_register(FT_ETHER, &ether_type);
ftype_register(FT_OID, &oid_type);
}
diff --git a/epan/ftypes/ftypes.h b/epan/ftypes/ftypes.h
index 3b41664640..2b883908bb 100644
--- a/epan/ftypes/ftypes.h
+++ b/epan/ftypes/ftypes.h
@@ -63,6 +63,7 @@ enum ftenum {
FT_GUID, /* GUID, UUID */
FT_OID, /* OBJECT IDENTIFIER */
FT_EUI64,
+ FT_AX25,
FT_NUM_TYPES /* last item number plus one */
};
@@ -78,6 +79,7 @@ enum ftenum {
#define FT_IPv6_LEN 16
#define FT_IPXNET_LEN 4
#define FT_EUI64_LEN 8
+#define FT_AX25_ADDR_LEN 7
typedef enum ftenum ftenum_t;
typedef struct _ftype_t ftype_t;