diff options
author | Guido Günther <agx@sigxcpu.org> | 2014-02-05 08:40:16 +0100 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2014-02-05 08:40:16 +0100 |
commit | fa2b467e288cb137ffd792becbf0c1e757d85be4 (patch) | |
tree | ce308eb0886e93805e7d88bccce48c93797fd6dd /libqcdm | |
parent | afc4b839a31c530d73b91aa2483795f185eb7e52 (diff) |
New upstream version 1.2.0upstream/1.2.0upstream
Diffstat (limited to 'libqcdm')
-rw-r--r-- | libqcdm/Makefile.in | 26 | ||||
-rw-r--r-- | libqcdm/src/Makefile.in | 26 | ||||
-rw-r--r-- | libqcdm/src/commands.c | 88 | ||||
-rw-r--r-- | libqcdm/src/commands.h | 23 | ||||
-rw-r--r-- | libqcdm/src/nv-items.h | 13 | ||||
-rw-r--r-- | libqcdm/tests/Makefile.am | 8 | ||||
-rw-r--r-- | libqcdm/tests/Makefile.in | 78 | ||||
-rw-r--r-- | libqcdm/tests/ipv6pref.c | 316 | ||||
-rw-r--r-- | libqcdm/tests/test-qcdm-com.c | 55 | ||||
-rw-r--r-- | libqcdm/tests/test-qcdm-com.h | 2 | ||||
-rw-r--r-- | libqcdm/tests/test-qcdm.c | 1 |
11 files changed, 603 insertions, 33 deletions
diff --git a/libqcdm/Makefile.in b/libqcdm/Makefile.in index 5a5e248..4034356 100644 --- a/libqcdm/Makefile.in +++ b/libqcdm/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -84,12 +84,13 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ - $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/lib-ld.m4 \ - $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ - $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/vapigen.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) @@ -236,6 +237,14 @@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ @@ -302,6 +311,9 @@ STRIP = @STRIP@ SYSTEMD_UNIT_DIR = @SYSTEMD_UNIT_DIR@ UDEV_BASE_DIR = @UDEV_BASE_DIR@ USE_NLS = @USE_NLS@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ diff --git a/libqcdm/src/Makefile.in b/libqcdm/src/Makefile.in index dcca09d..7870d0c 100644 --- a/libqcdm/src/Makefile.in +++ b/libqcdm/src/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -85,12 +85,13 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ - $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/lib-ld.m4 \ - $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ - $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/vapigen.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) @@ -230,6 +231,14 @@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ @@ -296,6 +305,9 @@ STRIP = @STRIP@ SYSTEMD_UNIT_DIR = @SYSTEMD_UNIT_DIR@ UDEV_BASE_DIR = @UDEV_BASE_DIR@ USE_NLS = @USE_NLS@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ diff --git a/libqcdm/src/commands.c b/libqcdm/src/commands.c index 541cad7..ff7d232 100644 --- a/libqcdm/src/commands.c +++ b/libqcdm/src/commands.c @@ -1087,6 +1087,94 @@ qcdm_cmd_nv_set_hybrid_pref_result (const char *buf, size_t len, int *out_error) /**********************************************************************/ +size_t +qcdm_cmd_nv_get_ipv6_enabled_new (char *buf, size_t len) +{ + char cmdbuf[sizeof (DMCmdNVReadWrite) + 2]; + DMCmdNVReadWrite *cmd = (DMCmdNVReadWrite *) &cmdbuf[0]; + + qcdm_return_val_if_fail (buf != NULL, 0); + qcdm_return_val_if_fail (len >= sizeof (*cmd) + DIAG_TRAILER_LEN, 0); + + memset (cmd, 0, sizeof (*cmd)); + cmd->code = DIAG_CMD_NV_READ; + cmd->nv_item = htole16 (DIAG_NV_IPV6_ENABLED); + + return dm_encapsulate_buffer (cmdbuf, sizeof (*cmd), sizeof (cmdbuf), buf, len); +} + +QcdmResult * +qcdm_cmd_nv_get_ipv6_enabled_result (const char *buf, size_t len, int *out_error) +{ + QcdmResult *result = NULL; + DMCmdNVReadWrite *rsp = (DMCmdNVReadWrite *) buf; + DMNVItemIPv6Enabled *ipv6; + + qcdm_return_val_if_fail (buf != NULL, NULL); + + if (!check_command (buf, len, DIAG_CMD_NV_READ, sizeof (DMCmdNVReadWrite), out_error)) + return NULL; + + if (!check_nv_cmd (rsp, DIAG_NV_IPV6_ENABLED, out_error)) + return NULL; + + ipv6 = (DMNVItemIPv6Enabled *) &rsp->data[0]; + + if (ipv6->enabled > 1) + qcdm_warn (0, "Unknown ipv6 preference 0x%X", ipv6->enabled); + + result = qcdm_result_new (); + qcdm_result_add_u8 (result, QCDM_CMD_NV_GET_IPV6_ENABLED_ITEM_ENABLED, ipv6->enabled); + + return result; +} + +size_t +qcdm_cmd_nv_set_ipv6_enabled_new (char *buf, + size_t len, + u_int8_t enabled) +{ + char cmdbuf[sizeof (DMCmdNVReadWrite) + 2]; + DMCmdNVReadWrite *cmd = (DMCmdNVReadWrite *) &cmdbuf[0]; + DMNVItemIPv6Enabled *req; + + qcdm_return_val_if_fail (buf != NULL, 0); + qcdm_return_val_if_fail (len >= sizeof (*cmd) + DIAG_TRAILER_LEN, 0); + + if (enabled > QCDM_CMD_NV_IPV6_ENABLED_ON) { + qcdm_err (0, "Invalid ipv6 preference %d", enabled); + return 0; + } + + memset (cmd, 0, sizeof (*cmd)); + cmd->code = DIAG_CMD_NV_WRITE; + cmd->nv_item = htole16 (DIAG_NV_IPV6_ENABLED); + + req = (DMNVItemIPv6Enabled *) &cmd->data[0]; + if (enabled == QCDM_CMD_NV_IPV6_ENABLED_OFF) + req->enabled = DIAG_NV_IPV6_ENABLED_OFF; + else if (enabled == QCDM_CMD_NV_IPV6_ENABLED_ON) + req->enabled = DIAG_NV_IPV6_ENABLED_ON; + + return dm_encapsulate_buffer (cmdbuf, sizeof (*cmd), sizeof (cmdbuf), buf, len); +} + +QcdmResult * +qcdm_cmd_nv_set_ipv6_enabled_result (const char *buf, size_t len, int *out_error) +{ + qcdm_return_val_if_fail (buf != NULL, NULL); + + if (!check_command (buf, len, DIAG_CMD_NV_WRITE, sizeof (DMCmdNVReadWrite), out_error)) + return NULL; + + if (!check_nv_cmd ((DMCmdNVReadWrite *) buf, DIAG_NV_IPV6_ENABLED, out_error)) + return NULL; + + return qcdm_result_new (); +} + +/**********************************************************************/ + static qcdmbool hdr_rev_pref_validate (u_int8_t dm) { diff --git a/libqcdm/src/commands.h b/libqcdm/src/commands.h index 437261b..6f05f1c 100644 --- a/libqcdm/src/commands.h +++ b/libqcdm/src/commands.h @@ -351,6 +351,29 @@ QcdmResult *qcdm_cmd_nv_set_hybrid_pref_result (const char *buf, /**********************************************************************/ +enum { + QCDM_CMD_NV_IPV6_ENABLED_OFF = 0x00, + QCDM_CMD_NV_IPV6_ENABLED_ON = 0x01, +}; + +#define QCDM_CMD_NV_GET_IPV6_ENABLED_ITEM_ENABLED "ipv6-enabled" + +size_t qcdm_cmd_nv_get_ipv6_enabled_new (char *buf, size_t len); + +QcdmResult *qcdm_cmd_nv_get_ipv6_enabled_result (const char *buf, + size_t len, + int *out_error); + +size_t qcdm_cmd_nv_set_ipv6_enabled_new (char *buf, + size_t len, + u_int8_t enabled); + +QcdmResult *qcdm_cmd_nv_set_ipv6_enabled_result (const char *buf, + size_t len, + int *out_error); + +/**********************************************************************/ + /* Values for QCDM_CMD_NV_GET_HDR_REV_PREF_ITEM_REV_PREF */ enum { QCDM_CMD_NV_HDR_REV_PREF_ITEM_REV_PREF_0 = 0x00, diff --git a/libqcdm/src/nv-items.h b/libqcdm/src/nv-items.h index 1a5db67..dae7f9d 100644 --- a/libqcdm/src/nv-items.h +++ b/libqcdm/src/nv-items.h @@ -37,6 +37,7 @@ enum { DIAG_NV_DIR_NUMBER = 178, /* Mobile Directory Number (MDN) */ DIAG_NV_ROAM_PREF = 442, /* Roaming preference */ DIAG_NV_HYBRID_PREF = 562, /* Hybrid 1x + HDR preference */ + DIAG_NV_IPV6_ENABLED = 1896, /* Enable IPv6 */ DIAG_NV_HDR_REV_PREF = 4964, /* HDR mode preference(?): rev0, revA, eHRPD */ }; @@ -114,5 +115,17 @@ struct DMNVItemHybridPref { } __attribute__ ((packed)); typedef struct DMNVItemHybridPref DMNVItemHybridPref; +/* IPv6 enable */ +enum { + DIAG_NV_IPV6_ENABLED_OFF = 0x00, + DIAG_NV_IPV6_ENABLED_ON = 0x01, +}; + +/* DIAG_NV_IPV6_ENABLED */ +struct DMNVItemIPv6Enabled { + u_int8_t enabled; +} __attribute__ ((packed)); +typedef struct DMNVItemIPv6Enabled DMNVItemIPv6Enabled; + #endif /* LIBQCDM_NV_ITEMS_H */ diff --git a/libqcdm/tests/Makefile.am b/libqcdm/tests/Makefile.am index ddf7d7b..241ae03 100644 --- a/libqcdm/tests/Makefile.am +++ b/libqcdm/tests/Makefile.am @@ -1,6 +1,6 @@ include $(top_srcdir)/gtester.make -noinst_PROGRAMS = test-qcdm modepref +noinst_PROGRAMS = test-qcdm modepref ipv6pref TEST_PROGS += test-qcdm INCLUDES = \ @@ -26,10 +26,16 @@ modepref_SOURCES = modepref.c modepref_CPPFLAGS = $(MM_CFLAGS) modepref_LDADD = $(MM_LIBS) +ipv6pref_SOURCES = ipv6pref.c +ipv6pref_CPPFLAGS = $(MM_CFLAGS) +ipv6pref_LDADD = $(MM_LIBS) + if QCDM_STANDALONE test_qcdm_LDADD += $(top_builddir)/src/libqcdm.la modepref_LDADD += $(top_builddir)/src/libqcdm.la +ipv6pref_LDADD += $(top_builddir)/src/libqcdm.la else test_qcdm_LDADD += $(top_builddir)/libqcdm/src/libqcdm.la modepref_LDADD += $(top_builddir)/libqcdm/src/libqcdm.la +ipv6pref_LDADD += $(top_builddir)/libqcdm/src/libqcdm.la endif diff --git a/libqcdm/tests/Makefile.in b/libqcdm/tests/Makefile.in index 7ac8360..0765132 100644 --- a/libqcdm/tests/Makefile.in +++ b/libqcdm/tests/Makefile.in @@ -1,4 +1,4 @@ -# Makefile.in generated by automake 1.13.4 from Makefile.am. +# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. @@ -80,22 +80,26 @@ build_triplet = @build@ host_triplet = @host@ DIST_COMMON = $(top_srcdir)/gtester.make $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/depcomp -noinst_PROGRAMS = test-qcdm$(EXEEXT) modepref$(EXEEXT) +noinst_PROGRAMS = test-qcdm$(EXEEXT) modepref$(EXEEXT) \ + ipv6pref$(EXEEXT) @QCDM_STANDALONE_TRUE@am__append_1 = $(top_builddir)/src/libqcdm.la @QCDM_STANDALONE_TRUE@am__append_2 = $(top_builddir)/src/libqcdm.la -@QCDM_STANDALONE_FALSE@am__append_3 = $(top_builddir)/libqcdm/src/libqcdm.la +@QCDM_STANDALONE_TRUE@am__append_3 = $(top_builddir)/src/libqcdm.la @QCDM_STANDALONE_FALSE@am__append_4 = $(top_builddir)/libqcdm/src/libqcdm.la +@QCDM_STANDALONE_FALSE@am__append_5 = $(top_builddir)/libqcdm/src/libqcdm.la +@QCDM_STANDALONE_FALSE@am__append_6 = $(top_builddir)/libqcdm/src/libqcdm.la subdir = libqcdm/tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ - $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/lib-ld.m4 \ - $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ - $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/vapigen.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) @@ -104,15 +108,19 @@ CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) -am_modepref_OBJECTS = modepref-modepref.$(OBJEXT) -modepref_OBJECTS = $(am_modepref_OBJECTS) +am_ipv6pref_OBJECTS = ipv6pref-ipv6pref.$(OBJEXT) +ipv6pref_OBJECTS = $(am_ipv6pref_OBJECTS) am__DEPENDENCIES_1 = -modepref_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__append_2) \ - $(am__append_4) +ipv6pref_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__append_3) \ + $(am__append_6) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = +am_modepref_OBJECTS = modepref-modepref.$(OBJEXT) +modepref_OBJECTS = $(am_modepref_OBJECTS) +modepref_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__append_2) \ + $(am__append_5) am_test_qcdm_OBJECTS = test_qcdm-test-qcdm-crc.$(OBJEXT) \ test_qcdm-test-qcdm-escaping.$(OBJEXT) \ test_qcdm-test-qcdm-utils.$(OBJEXT) \ @@ -121,7 +129,7 @@ am_test_qcdm_OBJECTS = test_qcdm-test-qcdm-crc.$(OBJEXT) \ test_qcdm-test-qcdm.$(OBJEXT) test_qcdm_OBJECTS = $(am_test_qcdm_OBJECTS) test_qcdm_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__append_1) \ - $(am__append_3) + $(am__append_4) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false @@ -156,8 +164,9 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = -SOURCES = $(modepref_SOURCES) $(test_qcdm_SOURCES) -DIST_SOURCES = $(modepref_SOURCES) $(test_qcdm_SOURCES) +SOURCES = $(ipv6pref_SOURCES) $(modepref_SOURCES) $(test_qcdm_SOURCES) +DIST_SOURCES = $(ipv6pref_SOURCES) $(modepref_SOURCES) \ + $(test_qcdm_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -241,6 +250,14 @@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ +INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ +INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ +INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ +INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ +INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ +INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ +INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ @@ -307,6 +324,9 @@ STRIP = @STRIP@ SYSTEMD_UNIT_DIR = @SYSTEMD_UNIT_DIR@ UDEV_BASE_DIR = @UDEV_BASE_DIR@ USE_NLS = @USE_NLS@ +VAPIGEN = @VAPIGEN@ +VAPIGEN_MAKEFILE = @VAPIGEN_MAKEFILE@ +VAPIGEN_VAPIDIR = @VAPIGEN_VAPIDIR@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ @@ -389,10 +409,13 @@ test_qcdm_SOURCES = \ test-qcdm.c test_qcdm_CPPFLAGS = $(MM_CFLAGS) -test_qcdm_LDADD = $(MM_LIBS) $(am__append_1) $(am__append_3) +test_qcdm_LDADD = $(MM_LIBS) $(am__append_1) $(am__append_4) modepref_SOURCES = modepref.c modepref_CPPFLAGS = $(MM_CFLAGS) -modepref_LDADD = $(MM_LIBS) $(am__append_2) $(am__append_4) +modepref_LDADD = $(MM_LIBS) $(am__append_2) $(am__append_5) +ipv6pref_SOURCES = ipv6pref.c +ipv6pref_CPPFLAGS = $(MM_CFLAGS) +ipv6pref_LDADD = $(MM_LIBS) $(am__append_3) $(am__append_6) all: all-am .SUFFIXES: @@ -438,6 +461,10 @@ clean-noinstPROGRAMS: echo " rm -f" $$list; \ rm -f $$list +ipv6pref$(EXEEXT): $(ipv6pref_OBJECTS) $(ipv6pref_DEPENDENCIES) $(EXTRA_ipv6pref_DEPENDENCIES) + @rm -f ipv6pref$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ipv6pref_OBJECTS) $(ipv6pref_LDADD) $(LIBS) + modepref$(EXEEXT): $(modepref_OBJECTS) $(modepref_DEPENDENCIES) $(EXTRA_modepref_DEPENDENCIES) @rm -f modepref$(EXEEXT) $(AM_V_CCLD)$(LINK) $(modepref_OBJECTS) $(modepref_LDADD) $(LIBS) @@ -452,6 +479,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipv6pref-ipv6pref.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modepref-modepref.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_qcdm-test-qcdm-com.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_qcdm-test-qcdm-crc.Po@am__quote@ @@ -484,6 +512,20 @@ distclean-compile: @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< +ipv6pref-ipv6pref.o: ipv6pref.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipv6pref_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipv6pref-ipv6pref.o -MD -MP -MF $(DEPDIR)/ipv6pref-ipv6pref.Tpo -c -o ipv6pref-ipv6pref.o `test -f 'ipv6pref.c' || echo '$(srcdir)/'`ipv6pref.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ipv6pref-ipv6pref.Tpo $(DEPDIR)/ipv6pref-ipv6pref.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipv6pref.c' object='ipv6pref-ipv6pref.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipv6pref_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipv6pref-ipv6pref.o `test -f 'ipv6pref.c' || echo '$(srcdir)/'`ipv6pref.c + +ipv6pref-ipv6pref.obj: ipv6pref.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipv6pref_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipv6pref-ipv6pref.obj -MD -MP -MF $(DEPDIR)/ipv6pref-ipv6pref.Tpo -c -o ipv6pref-ipv6pref.obj `if test -f 'ipv6pref.c'; then $(CYGPATH_W) 'ipv6pref.c'; else $(CYGPATH_W) '$(srcdir)/ipv6pref.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ipv6pref-ipv6pref.Tpo $(DEPDIR)/ipv6pref-ipv6pref.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipv6pref.c' object='ipv6pref-ipv6pref.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipv6pref_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipv6pref-ipv6pref.obj `if test -f 'ipv6pref.c'; then $(CYGPATH_W) 'ipv6pref.c'; else $(CYGPATH_W) '$(srcdir)/ipv6pref.c'; fi` + modepref-modepref.o: modepref.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(modepref_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT modepref-modepref.o -MD -MP -MF $(DEPDIR)/modepref-modepref.Tpo -c -o modepref-modepref.o `test -f 'modepref.c' || echo '$(srcdir)/'`modepref.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/modepref-modepref.Tpo $(DEPDIR)/modepref-modepref.Po diff --git a/libqcdm/tests/ipv6pref.c b/libqcdm/tests/ipv6pref.c new file mode 100644 index 0000000..ba777d8 --- /dev/null +++ b/libqcdm/tests/ipv6pref.c @@ -0,0 +1,316 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Copyright (C) 2012 Red Hat, Inc. + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <errno.h> +#include <sys/ioctl.h> +#include <fcntl.h> +#include <termios.h> +#include <assert.h> +#include <unistd.h> + +#include "utils.h" +#include "errors.h" +#include "commands.h" +#include "com.h" + +static int debug = 0; + +static void +print_buf (const char *detail, const char *buf, size_t len) +{ + int i = 0, z; + qcdmbool newline = FALSE; + char tmp[500]; + u_int32_t flen; + + flen = snprintf (tmp, sizeof (tmp) - 1, "%s (%zu) ", detail, len); + fprintf (stdout, "%s", tmp); + for (i = 0; i < len; i++) { + fprintf (stdout, "%02x ", buf[i] & 0xFF); + if (((i + 1) % 16) == 0) { + fprintf (stdout, "\n"); + z = flen; + while (z--) + fprintf (stdout, " "); + newline = TRUE; + } else + newline = FALSE; + } + + if (!newline) + fprintf (stdout, "\n"); +} + +static int +com_setup (const char *port) +{ + int ret, fd; + + errno = 0; + fd = open (port, O_RDWR | O_EXCL | O_NONBLOCK | O_NOCTTY); + if (fd < 0) { + fprintf (stderr, "E: failed to open port %s\n", port); + return -1; + } + + ret = ioctl (fd, TIOCEXCL); + if (ret) { + fprintf (stderr, "E: failed to lock port %s\n", port); + close (fd); + return -1; + } + + return fd; +} + +/******************************************************************/ + +static qcdmbool +qcdm_send (int fd, char *buf, size_t len) +{ + int status; + int eagain_count = 1000; + size_t i = 0; + + if (debug) + print_buf ("DM:ENC>>>", buf, len); + + while (i < len) { + errno = 0; + status = write (fd, &buf[i], 1); + if (status < 0) { + if (errno == EAGAIN) { + eagain_count--; + if (eagain_count <= 0) + return FALSE; + } else + assert (errno == 0); + } else + i++; + + usleep (1000); + } + + return TRUE; +} + +static size_t +qcdm_wait_reply (int fd, char *buf, size_t len) +{ + fd_set in; + int result; + struct timeval timeout = { 1, 0 }; + char readbuf[1024]; + ssize_t bytes_read; + int total = 0, retries = 0; + size_t decap_len = 0; + + FD_ZERO (&in); + FD_SET (fd, &in); + result = select (fd + 1, &in, NULL, NULL, &timeout); + if (result != 1 || !FD_ISSET (fd, &in)) + return 0; + + do { + errno = 0; + bytes_read = read (fd, &readbuf[total], 1); + if ((bytes_read == 0) || (errno == EAGAIN)) { + /* Haven't gotten the async control char yet */ + if (retries > 20) + return 0; /* 2 seconds, give up */ + + /* Otherwise wait a bit and try again */ + usleep (100000); + retries++; + continue; + } else if (bytes_read == 1) { + qcdmbool more = FALSE; + qcdmbool success; + size_t used = 0; + + total++; + decap_len = 0; + success = dm_decapsulate_buffer (readbuf, total, buf, len, &decap_len, &used, &more); + + /* Discard used data */ + if (used > 0) { + total -= used; + memmove (readbuf, &readbuf[used], total); + } + + if (success && !more) { + /* Success; we have a packet */ + break; + } + } else { + /* Some error occurred */ + return 0; + } + } while (total < sizeof (readbuf)); + + if (debug) + print_buf ("QCDM:DEC<<", buf, decap_len); + + return decap_len; +} + +static int +qcdm_set_ipv6_enabled (int fd, u_int8_t ipv6pref) +{ + int err; + char buf[512]; + size_t len; + QcdmResult *result; + size_t reply_len; + + len = qcdm_cmd_nv_set_ipv6_enabled_new (buf, sizeof (buf), ipv6pref); + assert (len); + + /* Send the command */ + if (!qcdm_send (fd, buf, len)) { + fprintf (stderr, "E: failed to send QCDM IPv6 enabled command\n"); + return -1; + } + + reply_len = qcdm_wait_reply (fd, buf, sizeof (buf)); + if (!reply_len) { + fprintf (stderr, "E: failed to receive QCDM IPv6 enabled command reply\n"); + return -1; + } + + /* Parse the response into a result structure */ + err = QCDM_SUCCESS; + result = qcdm_cmd_nv_set_ipv6_enabled_result (buf, reply_len, &err); + if (!result) { + fprintf (stderr, "E: failed to parse QCDM IPv6 enabled command reply: %d\n", err); + return -1; + } + + qcdm_result_unref (result); + return 0; +} + +static int +qcdm_get_ipv6_enabled (int fd) +{ + int err; + char buf[512]; + size_t len; + QcdmResult *result; + size_t reply_len; + u_int8_t mode; + + len = qcdm_cmd_nv_get_ipv6_enabled_new (buf, sizeof (buf)); + assert (len); + + /* Send the command */ + if (!qcdm_send (fd, buf, len)) { + fprintf (stderr, "E: failed to send QCDM IPv6 enabled command\n"); + return -1; + } + + reply_len = qcdm_wait_reply (fd, buf, sizeof (buf)); + if (!reply_len) { + fprintf (stderr, "E: failed to receive QCDM IPv6 pref command reply\n"); + return -1; + } + + /* Parse the response into a result structure */ + err = QCDM_SUCCESS; + result = qcdm_cmd_nv_get_ipv6_enabled_result (buf, reply_len, &err); + if (!result) { + /* An inactive NVRAM entry has the same effect as setting "disabled" */ + if (err == -QCDM_ERROR_NV_ERROR_INACTIVE) + return QCDM_CMD_NV_IPV6_ENABLED_OFF; + + fprintf (stderr, "E: failed to parse QCDM IPv6 enabled command reply: %d\n", err); + return -1; + } + + err = qcdm_result_get_u8 (result, QCDM_CMD_NV_GET_IPV6_ENABLED_ITEM_ENABLED, &mode); + qcdm_result_unref (result); + return mode; +} + +/******************************************************************/ + +static void +usage (const char *prog) +{ + fprintf (stderr, "Usage: %s <DM port> [--enable|--disable] [--debug]\n", prog); + fprintf (stderr, " Current mode will always be printed.\n\n"); +} + +int +main (int argc, char *argv[]) +{ + const char *dmport = argv[1]; + int fd, err, old, new = -1; + + if (argc < 2 || argc > 4) { + usage (argv[0]); + return 1; + } + + if (argc >= 3) { + if (strcasecmp (argv[2], "--debug") == 0) + debug = 1; + else if (strcasecmp (argv[2], "--enable") == 0) + new = QCDM_CMD_NV_IPV6_ENABLED_ON; + else if (strcasecmp (argv[2], "--disable") == 0) + new = QCDM_CMD_NV_IPV6_ENABLED_OFF; + else + usage (argv[0]); + + if (argc >= 4 && strcasecmp (argv[3], "--debug") == 0) + debug = 1; + } + + if (debug) + putenv ("QCDM_DEBUG=1"); + + fd = com_setup (dmport); + if (fd < 0) + return 1; + + err = qcdm_port_setup (fd); + if (err != QCDM_SUCCESS) { + fprintf (stderr, "E: failed to set up DM port %s: %d\n", dmport, err); + return 1; + } + + old = qcdm_get_ipv6_enabled (fd); + if (old < 0) { + fprintf (stderr, "E: failed to get IPv6 state\n"); + return 1; + } + fprintf (stdout, "IPv6: %s\n", old ? "enabled" : "disabled"); + + if (new >=0 && old != new) { + if (qcdm_set_ipv6_enabled (fd, new)) + fprintf (stdout, "Failed to %s IPv6\n", new ? "enable" : "disable"); + else + fprintf (stdout, "IPv6 successfully %s. Replug your device.\n", new ? "enabled" : "disabled"); + } + + return 0; +} + diff --git a/libqcdm/tests/test-qcdm-com.c b/libqcdm/tests/test-qcdm-com.c index 369e7d4..8615284 100644 --- a/libqcdm/tests/test-qcdm-com.c +++ b/libqcdm/tests/test-qcdm-com.c @@ -698,6 +698,61 @@ test_com_read_hybrid_pref (void *f, void *data) } void +test_com_read_ipv6_enabled (void *f, void *data) +{ + TestComData *d = data; + gboolean success; + int err = QCDM_SUCCESS; + char buf[512]; + guint8 pref; + const char *msg; + gint len; + QcdmResult *result; + gsize reply_len; + + len = qcdm_cmd_nv_get_ipv6_enabled_new (buf, sizeof (buf)); + g_assert (len > 0); + + /* Send the command */ + success = send_command (d, buf, len); + g_assert (success); + + /* Get a response */ + reply_len = wait_reply (d, buf, sizeof (buf)); + + /* Parse the response into a result structure */ + result = qcdm_cmd_nv_get_ipv6_enabled_result (buf, reply_len, &err); + if (!result) { + if ( err == -QCDM_ERROR_NVCMD_FAILED + || err == -QCDM_ERROR_RESPONSE_BAD_PARAMETER + || err == -QCDM_ERROR_NV_ERROR_INACTIVE + || err == -QCDM_ERROR_NV_ERROR_BAD_PARAMETER) + return; + g_assert_cmpint (err, ==, QCDM_SUCCESS); + } + + g_print ("\n"); + + err = qcdm_result_get_u8 (result, QCDM_CMD_NV_GET_IPV6_ENABLED_ITEM_ENABLED, &pref); + g_assert_cmpint (err, ==, QCDM_SUCCESS); + + switch (pref) { + case QCDM_CMD_NV_IPV6_ENABLED_OFF: + msg = "disabled"; + break; + case QCDM_CMD_NV_IPV6_ENABLED_ON: + msg = "enabled"; + break; + default: + msg = "unknown"; + break; + } + g_message ("%s: IPv6 preference: 0x%02X (%s)", __func__, pref, msg); + + qcdm_result_unref (result); +} + +void test_com_read_hdr_rev_pref (void *f, void *data) { TestComData *d = data; diff --git a/libqcdm/tests/test-qcdm-com.h b/libqcdm/tests/test-qcdm-com.h index 341d44e..2a6d58f 100644 --- a/libqcdm/tests/test-qcdm-com.h +++ b/libqcdm/tests/test-qcdm-com.h @@ -35,6 +35,8 @@ void test_com_read_mode_pref (void *f, void *data); void test_com_read_hybrid_pref (void *f, void *data); +void test_com_read_ipv6_enabled (void *f, void *data); + void test_com_read_hdr_rev_pref (void *f, void *data); void test_com_status (void *f, void *data); diff --git a/libqcdm/tests/test-qcdm.c b/libqcdm/tests/test-qcdm.c index 8448364..2a21522 100644 --- a/libqcdm/tests/test-qcdm.c +++ b/libqcdm/tests/test-qcdm.c @@ -100,6 +100,7 @@ int main (int argc, char **argv) g_test_suite_add (suite, TESTCASE (test_com_read_roam_pref, data->com_data)); g_test_suite_add (suite, TESTCASE (test_com_read_mode_pref, data->com_data)); g_test_suite_add (suite, TESTCASE (test_com_read_hybrid_pref, data->com_data)); + g_test_suite_add (suite, TESTCASE (test_com_read_ipv6_enabled, data->com_data)); g_test_suite_add (suite, TESTCASE (test_com_read_hdr_rev_pref, data->com_data)); g_test_suite_add (suite, TESTCASE (test_com_status, data->com_data)); g_test_suite_add (suite, TESTCASE (test_com_sw_version, data->com_data)); |