Commit Graph

1134 Commits

Author SHA1 Message Date
Ravi kumar Veeramally d4380a1e40 net: Fix uip debug hex dump format
Print two digits (0 prepended) till 0x0F. Do not print any
count in the beginning of output.

Change-Id: I07e8437f827604565fc8b86d81a105b3986f0a72
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
2016-02-05 20:25:18 -05:00
Ravi kumar Veeramally 810c510664 net: coap: Fix wrong app data
CoAP context send message data pointer is internal to coap.
ip_buf_appdata points &uip_buf(buf)[UIP_IPUDPH_LEN]. coap
internal data pointer assignment to ip_buf_appdata is wrong.
So copy data to ip_buf_appdata.

Change-Id: I3f11da382a227572c9080b210104a5b8e3dc34b4
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
2016-02-05 20:25:18 -05:00
Mariusz Skamra af8ec50e0d Bluetooth: GATT: Fix warning message
Warning shall indicate that characteristic don't have value,
not descriptor.

Change-Id: Ic368f57ddafb8bad597ec71d3cfcfb9e61fde434
Signed-off-by: Mariusz Skamra <mariusz.skamra@tieto.com>
2016-02-05 20:25:18 -05:00
Mariusz Skamra dd0186c4d0 Bluetooth: GATT: Fix Read By Type response for Include attribute type
In Read By Type response, GATT Server shall send UUID of a included
service only if this service UUID is 16 bit. Otherwise GATT Client
will send Read Request to get 128 bit UUID.

Fix tested with PTS.

> ACL Data RX: Handle 64 flags 0x02 dlen 11     [hci0] 1125351.430506
      ATT: Read By Type Request (0x08) len 6
        Handle range: 0x0001-0xffff
        Attribute type: Include (0x2802)

< ACL Data TX: Handle 64 flags 0x00 dlen 12     [hci0] 1125351.435346
      ATT: Read By Type Response (0x09) len 7
        Attribute data length: 6
        Attribute data list: 1 entry
        Handle: 0x0002
        Value: 01000200

> ACL Data RX: Handle 64 flags 0x02 dlen 7      [hci0] 1125351.605504
      ATT: Read Request (0x0a) len 2
        Handle: 0x0001

< ACL Data TX: Handle 64 flags 0x00 dlen 21     [hci0] 1125351.613432
      ATT: Read Response (0x0b) len 16
        Value: efcdab89674523b10040510450aa00f0

Change-Id: Ie07ec7930663b04dc134ee1c5a95c4e0670f5926
Signed-off-by: Mariusz Skamra <mariusz.skamra@tieto.com>
2016-02-05 20:25:17 -05:00
Mariusz Skamra 4e5d6581c0 Bluetooth: GATT: Split Authorization Permission for Read and Write
According to Core Specification 4.2 Vol 3, Part G, 3.3.3.4,
Server Characteristic Configuration descriptor shall be:
"Readable with no authentication or authorization.
Writable with authentication and authorization defined by a
higher layer specification or is implementation specific."
So there shall be separate authorization permissions
for write and read access.

Change-Id: Ia2850acbb976571743bf96cf9cbe0c1128534073
Signed-off-by: Mariusz Skamra <mariusz.skamra@tieto.com>
2016-02-05 20:25:17 -05:00
Peter Mitsis 54b782a88b nano_sema: Simplify nano_xxx_sem_take() API family
Changes the nanokernel semaphore API so that the timeout parameter must be
specified when invoking nano_isr_sem_take(), nano_fiber_sem_take(),
nano_task_sem_take() and nano_sem_take().

This obsoletes the following APIs:
	nano_fiber_sem_take_wait()
	nano_fiber_sem_take_wait_timeout()
	nano_task_sem_take_wait()
	nano_task_sem_take_wait_timeout()
	nano_sem_take_wait()
	nano_sem_take_wait_timeout()

Change-Id: If7a4bce1bd8ec8d6410d04f3c16ff1922ff0910e
Signed-off-by: Peter Mitsis <peter.mitsis@windriver.com>
2016-02-05 20:25:14 -05:00
Peter Mitsis cd6db374de nano_fifo: Simplify nano_xxx_fifo_get() API family
Changes the nanokernel FIFO API so that the timeout parameter must be
specified when invoking nano_isr_fifo_get(), nano_fiber_fifo_get(),
nano_task_fifo_get() and nano_fifo_get().

This obsoletes the following APIs:
	nano_fiber_fifo_get_wait()
	nano_fiber_fifo_get_wait_timeout()
	nano_task_fifo_get_wait()
	nano_task_fifo_get_wait_timeout()
	nano_fifo_get_wait()
	nano_fifo_get_wait_timeout()

Change-Id: Icbd2909292f1ced0bad8a70a075478536a141ef2
Signed-off-by: Peter Mitsis <peter.mitsis@windriver.com>
2016-02-05 20:25:14 -05:00
Szymon Janc 075e2c430a Bluetooth: SMP: Fix missing buffer unref for LE SC only mode
If pairing is rejected due to unsatisfying auth requirements
pending response buffer should be freed.

Change-Id: I8bbdad5fac8cd6dbcd674c7ad9725cf44ef79004
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:10 -05:00
Szymon Janc f80deda9d2 Bluetooth: SMP: Add support for Secure Connection Only Mode
This patch introduce new Kconfig option that is used to indicate if
device should operate in Secure Connection Only Mode. Enabling this
option removes support for LE Legacy Pairing.

Change-Id: If224b6786f4c840959fe87a31f0224bc1e21f90e
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:10 -05:00
Johan Hedberg 005b9904a4 Bluetooth: Don't pass length of PIN code to bt_auth_pincode_entry
We can calculate the length with strlen() and there should be no need
to consider anything else except nul-terminated C strings.

Change-Id: I02ec4b1dddbb1bd457f035926c86b27f4c2ab050
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:25:10 -05:00
Arkadiusz Lichwa 9b861d9fee Bluetooth: BR/EDR: Enable link key notification handling
Enables generate link key notification event when legacy PIN code
pairing is done well and give possibility to grab the link key for
later connections.

Change-Id: I5e661c203bbebfa8aa931662a479a1b921f7ace9
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:10 -05:00
Arkadiusz Lichwa 05bdf42367 Bluetooth: BR/EDR: Enable cancel PIN code request
When PIN code authentication is requested now there's a way
for user to respond with negative reply.

Change-Id: I800bf535f6ae98ee367393c686d6897f50b5fe8b
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:10 -05:00
Arkadiusz Lichwa 6828fb7060 Bluetooth: BR/EDR: Implement PIN code reply API
Enables legacy PIN code reply API to user.

Change-Id: I65aa78c2f35dd39f60e48e7280d2379baf07107e
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:10 -05:00
Szymon Janc 9a367fc363 net: Fix not setting loopback address in loopback driver
Using empty eui64 array resulted in net_set_mac() failure and
address was never set. This used to work only due to
linkaddr_node_addr being being global (and hence zeroed).

Change-Id: Ie21de35a628956c6221b6f1e4c96a1807a1d2804
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:09 -05:00
Luiz Augusto von Dentz b839882c69 Bluetooth: UUID: Introduce bt_uuid_copy
This introduces bt_uuid_copy which can be used to copy UUID values.

Change-Id: I22d996bcace454769ac871a43b9acebe8b23db39
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
2016-02-05 20:25:09 -05:00
Arkadiusz Lichwa d34e498d04 Bluetooth: BR/EDR: Extend bt_conn_info type
Enables get basic connection info support for non-LE connections.

Change-Id: If295b552567886256cfc1e215bfe3149d2f1f60c
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:09 -05:00
Arkadiusz Lichwa 1fb522d0ff Bluetooth: BR/EDR: Rename connection req event handler
Shorten conn_req_event handler name to conn_req.

Change-Id: I74e69cc9e105a4b8c35c08dc182b36d15bfcaa41
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:09 -05:00
Arkadiusz Lichwa 19ee83ec19 Bluetooth: BR/EDR: Handle PIN code request
Unmasks pin code request to be able service
pairing request from legacy 2.0 devices.

Change-Id: I5c09232d8e6e2c7673a35205e0bfeb8c8240388e
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:09 -05:00
Arkadiusz Lichwa 0afdae9677 Bluetooth: SMP: Refactor authentication
Moves object handling user authentication callback interface exposed
in public API to hci core module and exports internally LE SMP
authentication handlers.
The stack authentication API methods call based on connection type
the correct internal methods. Currently only LE SMP backend
is implemented.
Make getting local io capa in runtime.

Change-Id: I17459096616a620467b4fa01c53fd4bc0b59af9b
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:09 -05:00
Szymon Janc aff8c2109c Bluetooth: Fix reading remote features after disconnect
If connection was disconnected from connected callback there is
no point in going with reading remote featurea and updating
connection parameters because.

> HCI Event: Command Status (0x0f) plen 4
      LE Create Connection (0x08|0x000d) ncmd 1
        Status: Success (0x00)
> HCI Event: LE Meta Event (0x3e) plen 19
      LE Connection Complete (0x01)
        Status: Success (0x00)
        Handle: 76
        Role: Master (0x00)
        Peer address type: Public (0x00)
        Peer address: 7C:2F:80:94:97:39 (Gigaset Communications GmbH)
        Connection interval: 50.00 msec (0x0028)
        Connection latency: 0.00 msec (0x0000)
        Supervision timeout: 4000 msec (0x0190)
        Master clock accuracy: 0x00
< HCI Command: Disconnect (0x01|0x0006) plen 3
        Handle: 76
        Reason: Remote User Terminated Connection (0x13)
> HCI Event: Command Status (0x0f) plen 4
      Disconnect (0x01|0x0006) ncmd 1
        Status: Success (0x00)
< HCI Command: LE Read Remote Used Features (0x08|0x0016) plen 2
        Handle: 76
> HCI Event: Command Status (0x0f) plen 4
      LE Read Remote Used Features (0x08|0x0016) ncmd 0
        Status: Success (0x00)
> HCI Event: Disconnect Complete (0x05) plen 4
        Status: Success (0x00)
        Handle: 76
        Reason: Connection Terminated By Local Host (0x16)
> HCI Event: LE Meta Event (0x3e) plen 12
      LE Read Remote Used Features (0x04)
        Status: Unknown Connection Identifier (0x02)
        Handle: 76
        Features: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

Change-Id: I1df211d429383406eda2d23eb1e5fec425ba3427
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:09 -05:00
Szymon Janc b6221d4a5c Bluetooth: Fix GATT client build without SMP
If GATT client is enabled but SMP is disabled NULL SMP backend
needs to provide bt_smp_sign stub.

  LD      zephyr.elf
net/built-in.o: In function `bt_att_send':
net/bluetooth/att.c:1747: undefined reference to `bt_smp_sign'
Makefile:757: recipe for target 'zephyr' failed
make[2]: *** [zephyr] Error 1

Change-Id: Ia740d6c7ca7d65b78f7ecb781275d1f4d635baf7
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:09 -05:00
Szymon Janc 89a7aa8d72 Bluetooth: SMP: Fix legacy pairing
This fix a regression where incorrect confirm function was used
for legacy pairing.

Change-Id: Ia39aed6b8e9a3cb24b451cdb0219f41ceb5e6c6e
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:09 -05:00
Johan Hedberg 8ff6884077 Bluetooth: Fix buffer overflow with ACL fragments
The fragments we create should not be greater than the connection ACL
MTU (which the code already does correctly) but they can also not be
greater than the buffer has room for data. Fix this by taking the
minimum of the connection MTU and the buffer tail room.

Change-Id: I27462d7e8752773c632d212b28e53a8cf6519972
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:25:09 -05:00
Szymon Janc bc18a867b4 Bluetooth: Fix compilation with SMP disabled
This fix SMP dependency checks in connection code.

Change-Id: Ic7e515885381bd243c89f2a6e10c356095e79b55
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:08 -05:00
Szymon Janc 74333b74af Bluetooth: SMP: Fix NULL backend compilation
This was not building due to bt_l2cap_create_pdu API change.

  CC      net/bluetooth/smp_null.o
net/bluetooth/smp_null.c: In function 'bt_smp_recv':
net/bluetooth/smp_null.c:59:2: warning: passing argument 1 of 'bt_l2cap_create_pdu' from incompatible pointer type [enabled by default]
  buf = bt_l2cap_create_pdu(conn);
  ^
In file included from net/bluetooth/smp_null.c:32:0:
net/bluetooth/l2cap_internal.h:136:17: note: expected 'struct nano_fifo *' but argument is of type 'struct bt_conn *'
 struct net_buf *bt_l2cap_create_pdu(struct nano_fifo *fifo);

Change-Id: I5fd8ce63da09af1c123b1092624d48edc009756b
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:08 -05:00
Andrei Emeltchenko 7160c9c95e Bluetooth: Move BT_STACK definitions to log.h
BT_STACK depends on BT_STACK_DEBUG_EXTRA, therefore moving it there.
It also allows to use BT_STACK in drivers, at the moment only
Bluetooth stack uses it.

Change-Id: I41e0e0d49dae6abef2dc3a8d1d109127787d3db0
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
2016-02-05 20:25:08 -05:00
Szymon Janc 349a5af841 Bluetooth: Refactor le_ltk_request function
This is in preparation for LE SC only mode support where slave LTK
support is not compiled in.

Change-Id: Ia30ca08010f8aa42752c4a422fd0ddc1fbdb4f31
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:08 -05:00
Szymon Janc f0cc127b5f Bluetooth: SMP: Rename gen_method table to gen_method_legacy
Make sure the name reflects that it is used only for legacy pairing.

Change-Id: I757311991e9f879f377978b8adb02c7f9758b6b2
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:08 -05:00
Szymon Janc 7e1e124b8c Bluetooth: SMP: Separate legacy pairing code
All legacy pairing code is now separated in dedicated helper functions
(with 'legacy' prefix). Main code flow is LE SC oriented and legacy
pairing is always handled as exception from LE SC code:

if (!atomic_test_bit(&smp->flags, SMP_FLAG_SC)) {
  return legacy_foo(smp);
}

This is in preparation for enabling LE SC only mode.

Change-Id: I89705e6b780014417adaed41bd3beaf4791d8d3f
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:08 -05:00
Szymon Janc 7f2de1dc7a Bluetooth: SMP: Make bt_smp_create_pdu static
This function is not used outside of smp.c file.

Change-Id: Ib2158330959f2b4b1d63695480e82ac506243ab8
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:08 -05:00
Szymon Janc 68a4aebde4 Bluetooth: SMP: Move some code up in a file
Those will be used in legacy pairing code.

Change-Id: I311e10254a603c2b4cc46c50f6c3d27593a10bd7
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:08 -05:00
Louis Caron 7fdb42a46f Bluetooth: add CPF descriptor support
In order to support more standard descriptors, the PF macro and helper
function are added.

Change-Id: I52db3c32f40f39b9c6bfdb9573d0a614d0f3295e
Signed-off-by: Louis Caron <louis.caron@intel.com>
2016-02-05 20:25:08 -05:00
Louis Caron d566c3314b Bluetooth: add CUD descriptor support
In order to support more standard descriptors, the UD macro and helper
function are added.

Change-Id: Ic9a82658668107b40abc5c98002fe5091dc10f08
Signed-off-by: Louis Caron <louis.caron@intel.com>
2016-02-05 20:25:08 -05:00
Mariusz Skamra b90d2c6dbd Bluetooth: GATT: Pass bt_conn to the discovery function callback
This patch replaces bt_gatt_attr_func_t with bt_gatt_discover_func_t
to be used as a type of discovery callback. The reason is
bt_gatt_attr_func_t don't return bt_conn which could be used
later on to issue other commands and to application to know
from which connection this results come.

Change-Id: I1f26c72ad5c8a0b97485a337c7005d34281586d7
Signed-off-by: Mariusz Skamra <mariusz.skamra@tieto.com>
2016-02-05 20:25:08 -05:00
Andrei Emeltchenko 54c0790b1f Bluetooth: Improve error message printed
Include expected opcode to print together with received opcode.

Change-Id: Iacc73c12f22fe0585e2753d709646bacd3e73d32
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
2016-02-05 20:25:07 -05:00
Andrei Emeltchenko cc7349b2d8 Bluetooth: Replace fiber_fiber_ with fiber_
We use fiber_delayed_start() for starting delayed fiber. Make use of
fiber_delayed_start_cancel() instead of
fiber_fiber_delayed_start_cancel().

Change-Id: I2399290496ed2a2b21b2a780d884881839f36767
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
2016-02-05 20:25:07 -05:00
Szymon Janc 873cbfb470 Bluetooth: Kconfig: Move SMP related option under BLUETOOTH_SMP
This makes menuconfig easier to navigate.

Change-Id: Ica49bbbde73c785f218846380fd46d5463424890
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:07 -05:00
Szymon Janc 3670e7fcd0 Bluetooth: SMP: Minor codestyle fix
Change-Id: I115fda172698881c69ed301e5f729bb32c1cb978
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:07 -05:00
Szymon Janc 755130ad68 Bluetooth: SMP: Fix setting ediv and rand for LE SC LTK
Change-Id: Ic8867a510864a8cfb30af30c505d25faa91c2fb7
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:25:07 -05:00
Johan Hedberg 7493cadee7 Bluetooth: Reduce hci_cmd_complete() stack usage
Instead of storing a pointer to the status (4 bytes) we can just copy
its value directly (1 byte). Since the previous variable is a 16-bit
opcode the smaller 1-byte variable should fit within the same 4-byte
word, saving 4 bytes from the stack.

Change-Id: I406c60c7b2563ba6397ab75cf1dbe3d346b6c0ed
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:25:07 -05:00
Luiz Augusto von Dentz 4a20bc14a7 Bluetooth: Make use of BT_UUID_DECLARE_16 for services
This makes it simpler to add the services directly into GATT services
table.

Change-Id: I090c7f9396329cf524947dd6647230c663a55f60
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
2016-02-05 20:25:07 -05:00
Johan Hedberg 30e0e64407 Bluetooth: Add color logging support
Add basic color logging support. Error logs will be printed in red
whereas warn() logs in yellow. The support is behind a Kconfig option
in case someone needs to build the stack for a terminal that doesn't
support the ANSI color codes.

Change-Id: I080e32db68f87e81f1bb54aa4c634f7cd38f1e33
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:25:07 -05:00
Anas Nashif f6f81868f8 build: Remove PROJECTINCLUDE from application makefiles
PROJECTINCLUDE is not required in app makefiles.

Change-Id: I3751b7c51c453dfe47d207bb11d171138668c4e7
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
2016-02-05 20:25:04 -05:00
Johan Hedberg c692c1672a Bluetooth: Fix passing bool instead of NULL pointer
Change-Id: I230c7b450587d85ba96cd4c71653eff0d9d56dcc
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:25:03 -05:00
Arkadiusz Lichwa bf8179be9e Bluetooth: BR/EDR: Enforce BLUETOOTH_CONN be set
Whenever selects BR/EDR support in Kconfig, make BLUETOOTH_CONN
option be set as well due to for BR/EDR devices fundamental behaviour
is interact with others by making ACL based connections.

Change-Id: Ieffd2fc6aa47278112be177e5a7e2021e50b0fa3
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:03 -05:00
Arkadiusz Lichwa f0572cfb61 Bluetooth: BR/EDR: Update of hci_disconn_complete
As a cleanup of just made disconnection don't touch LE specific
actions.

Change-Id: I0c7c42f47ac8f6683380124df571fa2b2afbf526
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:03 -05:00
Arkadiusz Lichwa 853ab787e7 Bluetooth: BR/EDR: Initial connection complete handling
Enables getting by host connection complete event and handle
internal state of related to the event connection object.

Change-Id: Ie6252ff33cc2e1fff5a4ce746fda7c3a59bf8aab
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:03 -05:00
Arkadiusz Lichwa 7abddd2bdf Bluetooth: BR/EDR: Look up conn by BT address helper
Defines helper routine to look up conn pool object for existance
of instance matching requested bluetooth address.

Change-Id: I31e05afb2346c7dab14e7ba1bd2f4e1378876ae0
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:03 -05:00
Arkadiusz Lichwa db57e259a7 Bluetooth: BR/EDR: Rename BT_CONN_TYPE_BREDR
To conform to API convention rename BT_CONN_TYPE_BREDR to BT_CONN_TYPE_BR.
Updates stack code so far uses it.

Change-Id: Ia759ef68bbdb232e3b0992740e0536d310e19010
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
2016-02-05 20:25:02 -05:00
Johan Hedberg ad425d4dae Bluetooth: Fix connection type check in bt_conn_lookup_state
Change-Id: I543b18ecaa714c1c15ed45b5bc911272dd13b49a
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
2016-02-05 20:25:02 -05:00