diff options
author | Guy Harris <guy@alum.mit.edu> | 2012-08-02 16:54:43 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2012-08-02 16:54:43 +0000 |
commit | 835111692f4a1313deb4d699a376e4496f8eabb2 (patch) | |
tree | 450e1533309ed244373923da34cafe84adca7b1c /epan/ftypes | |
parent | 89e6169fc56576893c9ffedc0541994b73521c0d (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.c | 82 | ||||
-rw-r--r-- | epan/ftypes/ftypes.h | 2 |
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, ðer_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; |