The network application API is a higher level API for creating
client and server type applications. Instead of applications
dealing with low level details, the network application API
provides services that most of the applications can use directly.
This commit removes the internal net_sample_*() API and converts
the existing users of it to use the new net_app API.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If ICMP packets do not fit in 1 net_pkt fragment the checksum
will be calculated incorrectly.
The problem shows up when using ping with the -s option to
create large ping requests. Eventhough the ping command does
accept the reply without complaining, Wireshark warns that
the icmp checksum is incorrect.
Signed-off-by: Erwin Rol <erwin@erwinrol.com>
In LISTEN state ignore a TCP RST. In SYN RCVD state, reset TCP
connection state to LISTEN when a valid RST segment is received. In all
other states close the connection - except that these other states will
not be handled in tcp_syn_rcvd() function.
Jira: ZEP-2279
Signed-off-by: Patrik Flykt <patrik.flykt@intel.com>
If the CONFIG_NET_TCP_TIME_WAIT support is disabled, then do not
start to wait for reply to sent FIN in active close, but unref
the corresponding net_context in order to close the connection
as soon as possible.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Moving the net_buf_pool objects to a dedicated area lets us access
them by array offset into this area instead of directly by pointer.
This helps reduce the size of net_buf objects by 4 bytes.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
The net_pkt_split() was incorrectly checking fragA pointer
even before it was allocated.
The unit test is fixed and converted to ztest.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
From
http://pubs.opengroup.org/onlinepubs/7908799/xns/netinetin.h.html:
in_addr_t
An unsigned integral type of exactly 32 bits.
[] the in_addr structure [] includes at least the following member:
in_addr_t s_addr
In other words, POSIX requires s_addr to be a single integer value,
whereas Zephyr defines it as an array, and then access as s_addr[0]
everywhere. Fix that by following POSIX definition, which helps to
port existing apps to Zephyr.
Jira: ZEP-2264
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
The shell takes care of removing the module name so it is no longer
necessary to have this adjustment.
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
In certain TCP states we should not try to send RESET segment
to peer. So check this and do not try to use NULL pkt to send
a message.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The "net http monitor" command turns on HTTP monitoring,
which means that for each incoming HTTP or HTTPS request,
a information about source and destination address, and
the HTTP request URL is printed.
User can disable the monitoring by "net http" command.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If we cannot send network data, then print the error code when
printing debug information about the issue. This is needed when
debugging the issue.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
When src and dst addresses are compressed based on context
information, uncompression method should verify CID bit,
SAC and DAC bits and context ID's. But it has missed some
cases which resulted in invalid uncompressed IPv6 header.
e.g. CID is set, SAC is 0 and DAC is 1 and context id's provided.
Uncompression method assumed that src address is compressed based
on context information but it is not.
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Empty RPL HBH header will be inserted while finalizing IPv6 packet
but updated after finding nexthop and sent the packet. In case of
Bluetooth or multicast dst address it was missed. Resulted in
empty RPL HBH header and packet dropped at peer node. It should
be updated in all circumstances.
Jira: ZEP-2088
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Semantics of ENOENT error as used previously is "named entity not
found", whereas for "I/O handle is not valid", there's EBADF. For
example, POSIX/SUSV2 doesn't even list ENOENT as a possible error
for accept(), connect(), recv(), etc. whereas it lists EBADF, e.g.:
http://pubs.opengroup.org/onlinepubs/7908799/xns/connect.html
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
Instead of waiting forever for a free net_buf, set a timeout to
the allocations (500 ms). This way the application will not be
blocked by memory exhaustion.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Defines a new tunable, CONFIG_NET_TCP_RETRY_COUNT, that determines the
number of segment retransmissions that the IP stack will attempt to
perform before resetting the connection.
The default value is 9 retransmissions, which amounts to 1:42 minutes,
as close as possible to the minimum recommended by RFC1122.
Jira: ZEP-1956, ZEP-1957
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
If we receive unknown option in neighbor advertisement message,
then skip those properly. Old code did not check the length of
the extension options which could cause infinite loop.
Jira: ZEP-2219
Signed-off-by: Ruslan Mstoi <ruslan.mstoi@intel.com>
Fixes the following issue:
"In expression 1UL << chan - 1U, left shifting by more than 31
bits has undefined behavior. The shift amount, chan - 1U, is
4294967295."
Coverity-CID: 167140
Jira: ZEP-2131
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
Print also network buffers that are allocated by the IPv6
fragment handler. This is very useful in debugging.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If the user really wants, it is possible to increase the
maximum size of the fragmented packet. According to RFC 2460
chapter 5, we do not need to accept larger than 1500 byte IPv6
packets, so the max pkt limit is set to 2. But if really needed
the limit can be raised by defining NET_IPV6_FRAGMENTS_MAX_PKT
to some new value. Currently there is no Kconfig option for
doing this as it is unlikely that this is needed.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The cancellation of reassembly did not work as expected because
K_WORK_INITIALIZER() did not setup the timeout function properly.
So do the timer initialization at runtime instead.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The IPv6 fragmentation was not working properly when the large
IPv6 packet was being sent. There is unit tests in next commit
that will test the IPv6 fragmentation sending.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If the fragmented IPv6 packet was very large, we could run out
of resources. When that happened, we leaked the memory for the
pending fragments that were waiting reassembly.
Jira: ZEP-2166
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The previous default 60 seconds is way too long for our limited
amount of memory. It might be that the 5 sec is still too long
but that can be changed in the future.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Shell itself already have a help command, so instead of creating a net
specific help just fill the help description of each command.
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Shell modules are registered at link time thus it makes no sense to
leave it behind net_shell_init.
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
If we receive unknown option in neighbor solicitation message,
then skip those properly. Old code did not check the length of
the extension options which could cause infinite loop.
Jira: ZEP-2174
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If we could not split the packet properly, make sure that the
fragments that we managed to allocate are unreffed and marked
as NULL.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Print also the character when hexdumping a memory area.
This is useful so that one does not need to convert hex
values to characters in head. Unprintable chars are printed
as '.'
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The address family of the UDP port listener was not set. This
caused weird debug prints in net-shell. Now the listener will
be registering IPv4 any address as it should.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
When a connection handler was registered, the checker function
introduced in commit 43b37cef ("Check duplicate UDP/TCP connection
handlers") did not check the address family (IPv4 or IPv6) of
the local end point properly. This caused duplicate connection
error to be returned to the caller.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The uncompressed source address in packets was not handled properly if
NET_6LO_CONTEXT was enabled.
This implementation is identical to the contextless case.
Signed-off-by: Piotr Zierhoffer <pzierhoffer@antmicro.com>
If we do not receive last ACK when the connection is tore down,
then do not wait forever as that would eat all the resources in
the network stack. So when we enter the LAST_ACK state, we setup
a timer that will unref the connection if the last ACK is not
received.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Without change to add ACK to FIN, invalid TCP packet is generated,
where ack sequence number is non-zero. Without adjusting sequence
number as done, ACK which we send in response to peer's FIN/ACK is
not recognized by peer, and peer keeps retransmitting its FIN/ACK.
Jira: ZEP-2104
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
When connection handler was unregistered, we did not remove
it from cache. This caused invalid connection to be passed to
net_context after connection unregister if connection caching
was enabled.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
We did not check UDP or TCP checksum to be valid after receiving
the packet. Fix this so that the checksum is validated when
packet is received in connection handler. As the checksum validation
can be resource intensive, do it after we have verified that
there is a connection handler for this connection.
The checksum calculation can be turned OFF if needed, but it is
ON by default.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The commit "net: tcp: Handle retransmitted packets from peer"
introduced over 80 character line that was missed in review.
Fixing it now.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If user has enabled RPL and STATISTICS, then enable RPL
statistics by default as that is probably what user want.
Same thing for MLD statistics.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
When we receive a packet with the sequence we already seen (and
processed), the most likely cause of it is that our ACK was lost,
and peer has to retransmit that packet. Then, we should just ACK
it, because otherwise peer will retransmit it again and again,
falling into exponential backoff and hosing the entire TCP
connection.
This makes changes to send_ack(), adding a flag to force sending
an ACK regardless of its cached status, and remove inline modifier,
as the function is big and called from many places.
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
We must check if we receive RST in any of the TCP states.
If we do not do this, then the net_context might leak as it
would never be released in some of the states. Receiving RST
in any TCP state is not described in TCP state diagram but is
described in RFC 793 which says in chapter "Reset Processing"
that system "...aborts the connection and advises the user and
goes to the CLOSED state."
We need to also validate the received RST and accept only those
TCP reset packets that contain valid sequence number.
The validate_state_transitions() function is also changed to
accept CLOSED state transition from various other states.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
net_if_get_default() was documented as returning "Default interface
or NULL if no interfaces are configured.", but actually didn't
return NULL in the latter case. Instead, it effectively returned
a pointer to random area of memory, shared with other system
structures, so calling functions like net_if_ipv4_set_netmask(),
etc. could trash unrelated memory.
Jira: ZEP-2105
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
RFC793, "Transmission Control Protocol", defines sequence numbers
just as 32-bit numbers without a sign. It doesn't specify any adhoc
rules for comparing them, so standard modular arithmetic should be
used.
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
When a new UDP or TCP connection handler is to be registered,
we need to check if identical handler has already been created.
If a duplicate is found, the registering call will return -EALREADY.
The earlier code did not check this but allowed two identical
handlers to be created. The latter handler was never called in
this case.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This helper copies desired amount of data from network packet
buffer info a user provided linear buffer.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
When we send TCP data segment, we need to set the length
of the application data by calling net_pkt_set_appdatalen().
This is done so that sequence number can be properly
advanced when we receive ACK to that pending packet.
Signed-off-by: xiaorui hu <xiaorui.hu@linaro.org>
fix misspelling in Kconfig files that would show up in configuration
documentation and screens.
Signed-off-by: David B. Kinder <david.b.kinder@intel.com>
When adding link-local address to the cache the type needs to be
properly set as net_ipv6_addr_create_iid will attempt to use it
when generating the IPv6 address.
Jira: ZEP-2077
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This is related to commit "net: tcp: Make sure ACK timer is not
run if cancelled" which did not set the cancel flag when the timer
was cancelled from tcp.c.
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
And print a warning if that happens.
This will also avoid to raise an ASSERT on net_if_tx_thread()'s k_poll
as this one will be called with no events to work with.
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Some applications may want to reuse implementations of these
commands for debugging/diagnostics purpose even if they don't
use net shell per se, or implement an alternative shell.
Jira: ZEP-2064
Change-Id: I48cb66ccc41bd41a75a4eb8eb3c366316ec5a096
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
net_if_ipv6_router_add() will return router pointer on success.
This information must be cached in RPL instance, otherwise RPL
instance doesn't know about default route.
Change-Id: Ic6d80ebfa95c9a64df9adf2621ae2631d9bdb990
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
When router or default router timer expired, interface will remove
router from the list. In this case RPL does not know about this.
When RPL node receives DIO messages it only verifies whether parent
exists or not. This extra checks will verify whether router really
in "used" state or not.
Jira: ZEP-2080
Change-Id: I4b36b3a2d495e76a38caddd058451daff08fab0c
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
net_if_ipv6_router_rm() is the correct API to remove IPv6 router
from the interface as it also cancels the timer and raises a mgmt
event. The net_if_router_rm() only sets router as unused and
nothing else.
Change-Id: I55114288c9ae748520b67b206edcd4f5e420b1af
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Bluetooth only cares about the actual payload so net_pkt can be unref
as soon as the data fragments are detached.
Jira: ZEP-2070
Change-Id: Id528d5440f42903378883f5e696b3f663bbfa313
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
For stream-based protocols (TCP), adding less data than requested
("short write") is generally not a problem - the rest of data can
be sent in the next packet. So, make net_pkt_append() return length
of written data instead of just bool flag, which makes it closer
to the behavior of POSIX send()/write() calls.
There're many users of older net_pkt_append() in the codebase
however, so net_pkt_append_all() convenience function is added which
keeps returning a boolean flag. All current users were converted to
this function, except for two:
samples/net/http_server/src/ssl_utils.c
samples/net/mbedtls_sslclient/src/tcp.c
Both are related to TLS and implement mbedTLS "tx callback", which
follows POSIX short-write semantics. Both cases also had a code to
workaround previous boolean-only behavior of net_pkt_append() - after
calling it, they measured length of the actual data added (but only
in case of successful return of net_pkt_append(), so that didn't
really help). So, these 2 cases are already improved.
Jira: ZEP-1984
Change-Id: Ibaf7c029b15e91b516d73dab3612eed190ee982b
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
Instead of just plain assert, check that the packet we receive
is ok before passing it to processing function.
Jira: ZEP-2057
Change-Id: I5754c82d16e1522d8fcee561eea280eadeec31ee
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The TCP trace values were not printed because of incorrect
config option used. Print also seq and ack values in decimal
in order to make it easier to correlate the values in other
prints in tcp.c.
Change-Id: I44d1535a84dcba8c6c937d348516ba801193ca23
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Use ready-made utility function which can take care of endianness
Change-Id: I1edd0b2ce1a086dd637e97308145f9b434e48a1f
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
When connect to diffrent router with the same gateway ip address,
need to clear arp cache when disable interface,
or it will use the wrong gateway mac address.
Call net_arp_clear_cache function replace to set arp_table 0.
Change-Id: Ib403a0c0030832ba48824db4d2d3fcb8add63d16
Signed-off-by: june li <junelizh@foxmail.com>
Convert code to use u{8,16,32,64}_t and s{8,16,32,64}_t instead of C99
integer types.
Jira: ZEP-2051
Change-Id: I4ec03eb2183d59ef86ea2c20d956e5d272656837
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
There was compiler error if CONFIG_NET_DEBUG_CONN was set.
Change-Id: Ibb6721c55dd2c56cd0097359a53563c6221859ea
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
We need to set the connect_cb for the context before sending SYN packet.
This is required if we have a loopback connection in which case everything
is happening more or less synchronously and the connect_cb would not be
called in this case because its value would still be null.
For remote network connections this patch makes no difference.
Change-Id: Id7f837cd9e81cd79c4666c98cae84f6cb1a77af0
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
We must not let ACK timer to run if we have already cancelled it.
So keep track that the timer is cancelled and refuse to run it
if it was indeed cancelled. The reason why the timer might be run
in this case is because the timer might be scheduled to be triggered
after which one cannot cancel it.
Change-Id: I1c8b8cee72bc7a644e02db154d9d009b8d98ade2
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The local port was set to 0 for IPv6 when registering
the connection handler. For IPv4, the code was not setting
the port in local_addr struct.
Change-Id: I82f0c08641a94d75d255ac306eca7bec6c332fba
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Without this info it is a bit difficult to notice what is going
on in loopback case.
Change-Id: I8f61330c01d025e41f00d663bd26947b8cafb5c0
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Add support to print connection handler information in net-shell.
There exists one connection handler for each UDP/TCP port that we
are listening. These prints are only available if CONFIG_NET_DEBUG_CONN
is enabled because the net_context has the same information. Thus the
connection handler info is only printed if debugging is active in order
to verify that handler information is proper.
Change-Id: I0be39a5adb89b2cdbd85524c5d943e4a562b0fde
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If TCP debugging is enabled but if the loglevel is set to lower
than 4, then compiler prints warning about unused flags variable
in net_tcp_trace().
Change-Id: I2e663644b50fe97b75088202e21b286aa010953e
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Only 2 attributes lacked this prefix, which makes sense to have, so
applying it accordingly and changing the helpers as well.
Change-Id: I095b2729f977f8fb1624eff8801a4a4e21416693
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Most of these macros are not exactly exposing a buffer, but a specific
header pointer (ipv6, ivp4, ethernet and so on), so it relevant to
rename them accordingly.
Change-Id: I66e32f7c3f2bc75994befb28d823e24299a53f5c
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
IPv6 next headers are processed in a way so it is not required to store
which header has been already seen in the net_pkt, as the processing loop
can store internally which one it has seen already.
Change-Id: I266ba8a3a0081a162318cdafb474a0fc44a3185e
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This is actually useless as there is only 1 RX memory slab, and thus can
be removed to reduce net_pkt structure size.
Change-Id: I62d716515120e7356ee1e2d75bbe1ec32e22c35d
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
- net_pkt becomes a stand-alone structure with network packet meta
information.
- network packet data is still managed through net_buf, mostly named
'frag'.
- net_pkt memory management is done through k_mem_slab
- function got introduced or relevantly renamed to target eithe net_pkt
or net_buf fragments.
- net_buf's sent_list ends up in net_pkt now, and thus helps to save
memory when TCP is enabled.
Change-Id: Ibd5c17df4f75891dec79db723a4c9fc704eb843d
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
There have been long lasting confusion between net_buf and net_nbuf.
While the first is actually a buffer, the second one is not. It's a
network buffer descriptor. More precisely it provides meta data about a
network packet, and holds the chain of buffer fragments made of net_buf.
Thus renaming net_nbuf to net_pkt and all names around it as well
(function, Kconfig option, ..).
Though net_pkt if the new name, it still inherit its logic from net_buf.
'
This patch is the first of a serie that will separate completely net_pkt
from net_buf.
Change-Id: Iecb32d2a0d8f4647692e5328e54b5c35454194cd
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Fix warning using incorrect format specifier
Change-Id: Ib6800c40b2cd769612ae6f107e41a941926d8e66
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
We need to check whether buf_sent was true when resending the TCP
segment, and do a buf ref if needed. If this is not done, the buf
will be unref after send, which will cause unpredictable results.
Change-Id: Ibd4490305de88ac6ffd04ec42bba196e57da5c10
Signed-off-by: june li <junelizh@foxmail.com>
While very unlikely it might happen that fragment pointer is NULL
when going through fragment list.
Coverity-CID: 167148
Change-Id: Ic3dbed7ee29c7b864d4830d726f65d7f62dcea84
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
When net_ipv6_finalize_raw() inserts RPL(HBH) header after IPv6 header,
it updates IPv6 next header as HBH and HBH next header as original IPv6
next header.
Then net_ipv6_prepare_for_send() will update RPL HBH header if it exists.
But net_rpl_update_header() is comparing HBH option and IPv6 next header,
which is wrong. Wrong comparion does not update RPL instance id and
sender rank. Peer nodes drops all the packets due to invalid instance
ID and sender rank.
Change-Id: I91c1870a09c60f8e1ebc73e434dcc208caf6299a
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Following flow does not work:
net_context_get
net_context_bind
..
..
net_context_put
net_context_get
net_context_bind
At instance of call to net_context_bind, conn_handler
is not NULL and returns with EISCONN.
This patch sets conn_handler to NULL in net_context_unref
Change-Id: I56a50839101b22161644b3cd7c5f510fa1abae3e
Signed-off-by: Mitul Shah <mitul.a.shah@intel.com>
This is a start to move away from the C99 {u}int{8,16,32,64}_t types to
Zephyr defined u{8,16,32,64}_t and s{8,16,32,64}_t. This allows Zephyr
to define the sized types in a consistent manor across all the
architectures we support and not conflict with what various compilers
and libc might do with regards to the C99 types.
We introduce <zephyr/types.h> as part of this and have it include
<stdint.h> for now until we transition all the code away from the C99
types.
We go with u{8,16,32,64}_t and s{8,16,32,64}_t as there are some
existing variables defined u8 & u16 as well as to be consistent with
Zephyr naming conventions.
Jira: ZEP-2051
Change-Id: I451fed0623b029d65866622e478225dfab2c0ca8
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Fix doxygen comment typos used to generate API docs
Change-Id: I3efff6f5fa26f87d1e658d6336fef01ce45f5bb0
Signed-off-by: David B. Kinder <david.b.kinder@intel.com>
Use UNALIGNED_GET and UNALIGNED_PUT throughout the networking stack to
access fields from the IP address structure. These structures can be
mapped directly to buffers and the macros are required for correct
unaligned memory access.
Jira: ZEP-2012
Change-Id: I55f9da7b143a22fa869d5d215c661de988cd9b91
Signed-off-by: Bogdan Davidoaia <bogdan.davidoaia@linaro.org>
This can be useful to override the default value, for testing.
Change-Id: I23b559152c71955ff5aa6fd3643f1f40f5594194
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This permits to tweak the TX power in dbm.
Change-Id: Idadff397941a39010ce3c374d9ca74b777934626
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This does not save any space but sets the fields in the
structs in more natural order. Move IPv6 related
fields in net_if into internal ipv6 struct so that all
IPv6 fields are located inside one struct. Same thing
is done for IPv4 fields which are now located inside
IPv4 internal struct in net_if.
There is no functionality changes by this commit.
Change-Id: I7d72ec0a28e2b88c79a4c294655d5ef6da6ccb25
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
So manipulating it requires to be ready to swap it if the CPU is BE.
Change-Id: I8d657c31cecfc9f3fcd010efbb6d090bf021f5f5
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
We need a way to know when IPv6 address is successfully set
into network interface.
If IPv6 DAD (Duplicate Address Detection) succeeds or fails,
we send a management event for that. This can be used by
other components to detect when the network interface is in
usable state.
Change-Id: Ifb22415fe21f31f5dba4f55455d6e0f89b414d32
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Some of the IPv6 utility functions were missing const in
one of the parameters that are not modified by the corresponding
function.
Change-Id: Ic9fe53daac288570c14423fd9410dcf15d1c5cfa
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This makes net_ipv6_nbr_add able to update entries so it can be reused
when receiving RA or NS requests, so it now performs a lookup before
creating a new entry (using nbr_new to reuse more code) and in case it
finds a match attempts to update the lladdr.
Change-Id: I305a67a955e037cbbb862fef947a5fcfe131507c
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net_ipv6_nbr_add shall init the delayed work as nbr_new does, so this
unifies both codes into nbr_init which does take care of initializing
the fields properly.
Change-Id: I91746276d346a3dc3c36be20d49bcf1968245fc5
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Route lifetime was printed using wrong modifier.
Change-Id: Ib503d50b5817491984d51bbdaadf7457fdde178b
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Make sure the RPL is compiled ok if CONFIG_NET_RPL_MRHOF is
enabled in the configuration.
Change-Id: I51fc0e20f854164c7e0374fa6a1ebf1d4e4dbc5b
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If multicast routing is set meaning that MOP3 (Mode of Operation)
is enabled, then the code was not compiling properly.
Change-Id: Ice8a9f7b705c781536d3c2c5ca6cc2bb77a7acc1
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The default hop limit is defined in struct net_if. It is possible
that user might want to tweak it for each network packet. For this
purpose, a net_nbuf_set_ipv6_hop_limit(buf) function is created.
Change-Id: I7568330358f80f0f5007d6d3c411c120b043c04f
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The Kconfig.rpl file was missing option to actually collect
RPL statistics. Unified the config option name to be
CONFIG_NET_STATISTICS_RPL as there was two conflicting settings
in the code and both of them were missing from Kconfig file.
Change-Id: I4ce4fcbaa317b36cac315ea3b3f710fa7a344b25
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The probing_timer is only available if CONFIG_NET_RPL_PROBING
is defined.
Change-Id: I2835d17e6c3d616f815f8beefd87d2571a5ad94c
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
After failing to send the buf we need to release it.
This is not done for Bluetooth or IEEE 802.15.4 links which
create a copy of the sent buf and the failure case is already
checked by net_tcp_send_buf().
Change-Id: Ia556376b58ad74f68accb64eb2221a78d59dc2ec
Signed-off-by: june li <junelizh@foxmail.com>
Use UNALIGNED_GET in net_addr_ntop as the uint16_t pointer used in this
function can point to an unalined address.
Jira: ZEP-2012
Change-Id: Idfbfa8da4c8d4e10299c4ae4d6431b10466cc988
Signed-off-by: Bogdan Davidoaia <bogdan.davidoaia@linaro.org>
If the IPv6 fragmentation support is enabled, then print current
status of the IPv6 packet reassembly in "net conn" command.
Change-Id: I384e35928b67dd39ac720c77683b1767e2a1ce88
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Figure out what is the last extension header in IPv6 packet
and return offset to it. This is needed by IPv6 fragmentation
when fragmentation header is added to the packet.
Change-Id: I925ab806a5de076a425ff354711730d4f4b3c52f
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit adds support for IPv6 packet fragmentation when
receiving (IPv6 reassembly) and when sending larger than 1280 bytes
long IPv6 packet. See RFC 2460 chapter 4.5 for more details.
Jira: ZEP-1718
Change-Id: Ia31c147cce4d456ee48f39276cca99aa09ce81d6
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Add net_nbuf_split() function that can be used to split
an existing net_buf fragment into two arbitrary length pieces,
and return the two new fragments to the caller. The data from
the original fragment is copied into these two new fragments.
Existing fragment is not modified.
Change-Id: I463e675232c6e19c2a42929f480893a6d1265873
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Use UNALIGNED_PUT() to store the MSS value into network packet
because the memory location cannot be guaranteed to be properly
aligned.
Change-Id: I77fd7a70ef45eedb657cac29457b0239b0a1d4c2
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This helps debugging as printable string of the ICMPv6 type is
printed when packet is received if debugging is active.
Change-Id: I22b84bb6b28db7fba030699af3e561a0775b53d2
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
It requires a net_nbuf, so the actual buf, and not a frag here.
Change-Id: I4fd888c9a91f5e3f3dd664ae5e3bf93f90a2f597
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This will refactor net_core.c and move IPv4 specific code
into ipv4.c which is a more logical place for it.
Change-Id: Ia60c5bfec488d2d1a664f113dc3df88e7d5badd1
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This will refactor net_core.c and move IPv6 specific code
into ipv6.c which is a more logical place for it.
Change-Id: I5bbecbb760111326b9a6bbef5802c53d7f6efda9
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
DROP is only on error case, here it should return NET_OK if it was a
proper ARP packet and it got properly handled.
Change-Id: If347e80a76b3a56a9455b70d11b735c1fd910117
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
The context buffer pool was introduced to deal with TCP holding buffers
when 6LO may modify them, therefore it makes sense to have it enabled
by default when TCP and 6LO are enabled given that the code can deal
with NULL pool in case the application don't implement one.
Change-Id: I600ca31ab40c96ee27937c2e885e332b0cee4995
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Shell crashes if you try to retrieve IPv6 nbr reachable time
when CONFIG_NET_IPV6_ND is disabled.
Change-Id: I3c5b3b5614abf80373b892943fa1ab936d235f3c
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Return proper verdict on handling of DIS messages. Otherwise debug
prints will be confusing that packet dropped.
Change-Id: Ia4e18d6238868e3aed4b17e2c9ea11aa432869be
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
No functionality changes, just refactored few rpl functions to
to align nicely.
Change-Id: I05c0397de7a8392cc781de2747802b2dd1bb8146
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Following changes are made:
1. Output using NET_INFO logging level. This function is not part of
automatic logging, and must be called explicitly by a user application.
But if it outputs using NET_DEBUG, then DEBUG level needs to be
enabled, and the output of this function will be drowned in logging
spam. So, let user to enable just INFO level.
2. Show entire structure of the fragment chain, *including* the head
net_buf which holds net_nbuf structure. It is numbered as -1 in the
output to preserve existing order (and not change existing size
calculations).
3. Show owning pool (and its properties, like buffer size/user_data
size) for each buffer.
4. Check for NULL pointer, e.g. for convenience of calling directly
from net_context receive callback (which will be called with NULL
on TCP peer closed connection event).
With these changes, a newcomer from one look at the output of this
function will be able to have a clear basic picture of network
buffer management in Zephyr, and recurring user will be able to
recall any details at once.
Change-Id: I8f9562748329d749f765cc6af7989a448256d7e0
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
No functionality changes, just refactored net_rpl_update_header
function to align nicely.
Change-Id: I5b3e099593bb964245ca06c9fb2ec85859a0640c
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Search destination address in IPv6 neighbor table. If it doesn't
exist in IPv6 neighbor table then go for routing. Added sanitycheck
to verify destination ll address is not the source ll address of
original packet (that means we are re-routing back to original sender).
Change-Id: I24adace6a0d17fbd1d2a36a5d75c79320de0a883
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
net_ipv6_nbr_lookup_by_index() will always find first matching entry
in IPv6 nbr table with lladdr index. But there can be multiple neighbors
linked to same lladdr index. So find route nexthop with ipv6_nbr_data
from nbr(ipv6 nbr) data pointer.
Change-Id: I5081d40330f5bc1ef0d96def03f4add4808b2fe9
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Router lifetime timer initialized in router_init but not submitted.
Change-Id: If5a77f413832db52eff99e7191f82d2a8fc8f081
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Extra data size was not considered in nbr size calculation.
Change-Id: Idc572abf55c8f9fd19940edb719f58e02e7f8ecd
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Route lookup is necessary only if life time is
NET_RPL_ZERO_LIFETIME, otherwise lookup not required.
Change-Id: I25fb85c53e2d43cfdce08411af385f3ae26384cc
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
If DAO message is routed through different nodes or sent directly
to a parent and ACK lost somewhere in noicy network. Node can not
join RPL mesh network properly. So try re-sending DAO message for
max number of trials (Kconfigurable).
Change-Id: I7f6a065deacd1e3942c89118ce8da4fbaa34af51
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
When sending TCP data, check if the retry timer needs
to be started.
Change-Id: Iea90716e918dec0b22e60bf32467b11c0d1a296f
Signed-off-by: june li <junelizh@foxmail.com>
It needs to check if current event matches:
- cb's layer
- cb's layer code
- cb's command
If none match, it will not raise the event.
Fixing the unit test as layer must be always != 0.
Jira: ZEP-1940
Change-Id: Iadd63e751fa6e534a10e7da9cae0f5bb5a384461
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Most (if not all) 802.15.4 devices can handle ACK replies by
themselves.
Change-Id: I0319d59de767b20eb67c1592bacaa4a7b7015cad
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Now that interface is not directly used in data and mac frame creation,
let's just pass context pointer.
Change-Id: If002e6790d044eeffc57cb5685ac9525fbd6e43c
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Now that RFD is default, the extended address can be changed through net
mgmt API, and thus no longer be the same as device's generated mac address.
Change-Id: I07ee647615c2caa1994712147c6c8a2b4306900d
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
There is no need of interface anymore.
After previous changes, it appears that net_if parameter is not used so
we can remove it.
Change-Id: Id3570f50865696818a9be2280172e2e25fc537f7
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
commit id 7a11439020 changed this.
Hopefully that changed did not affect anything.
Reducing minimal frame length and applying the change everywhere where
relevant.
Change-Id: I5ae203751bfcf70cef833620106d2c2d0e33b7a5
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
And use them accordingly in the common code part.
Change-Id: Id91b76e5baea607c0d68eebcde6f84e4e35ca44c
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
ORFD was a hack, from the beginning of the IEEE 802.15.4 Soft MAC stack,
but is now useless and can therefore be removed.
Change-Id: I74d5e1995993f4a0749b6d9d553406d5ae162bda
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
In order to simplify when 802.15.4 is selected on these samples, let's
setup the device through a common code.
For this to work, RFD is now the default.
Change-Id: I46590864442f77d83f681cc0e854c94344648856
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
It's more readable and along with other part of the system.
Change-Id: Ib4be787d74310d838f38b1f1d5624e7357da8969
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
These should be used by samples to fix basic 15.4 settings.
Change-Id: I31ad1540008ac760b7aef720e520bf8e72d3a805
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
s/SAMPLES/APP for name shortening. Applying the change where relevant.
Not only IP addresse will be available as samples settings there but
also IEEE 802.15.4 channel, pan_id, and more for instance.
Change-Id: I05dd24989bd0c804d9588092d67044a3e063bc88
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This will be needed for Thread/MLE.
Change-Id: Ib421da66cfc4da8111ff131f08cac74a11674928
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
These requests are used to set/get the key, the mode and the level of
the IEEE 802.15.4 link layer security.
Only implicit key mode is supported for now.
Change-Id: Ifbc9a5d08f9fbf0d51d6c3e4b650cfdce3d263db
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Initialize the ciphers.
Once the header is parsed and validated, we get all the necessary info
to decrypt the frame properly.
Change-Id: I3142fa572c7566b40efe18cf9d4e3f2b4bce0612
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
It's not only about decrypting and authentifying but also setting the
right frag's length after that.
Change-Id: Ifc766b212b37d4e3593c210f6646ee85dff2ab6d
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Take into account the current security context to compute the header
size.
Provide the function to fill-in the aux security header in a frame.
Finally, call the generic encryption function which will process the
frame relevantly according to the given security context.
For now, only implicit key mode is supported.
Change-Id: I5412c32179e70217c0946b1b54d9a752375d522f
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This provides the means to authentify with/without encryption or
decryption of a frame following a generic 15.4 security context.
Change-Id: Ia5dbb7f43936a8131112fe4b16c9780e30f904c1
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Some call use a boolean for it, and since it's supposed to be 1 or 0
let's ask for a boolean always.
Change-Id: If4fbe5d58d5c25fb2a86719435c59af53ea02445
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
When applying security, there will be needs for accessing payload as
well, thus providing the whole frag directly instead of a data pointer
on the ll part.
Change-Id: Ia97a1f07f2a12fc5cdf085c3cc6350d50b419cae
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This will ensure basic auxiliary security header fields are relevantly
filled-in as well as moving the parsing buffer pointer to the right
position for further parsing.
Change-Id: Ib09e312add783b13bf8b59a81a2ffe64eb6f8dc2
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
These will be used to parse and create 802.15.4 frames with security
enabled.
Change-Id: Icad214c8d7aa658b8483bf601b091b266e1b8d77
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
If the destination IP address is one of our own address,
then reroute it back to us.
Jira: ZEP-1966
Change-Id: I8b93fc5425f3f18b0b9e85ca9a57cb122129c47f
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The fields in "net conn" output were unaligned and looked
generally very ugly.
Change-Id: I56b29982d4f6b984405944d155bbb6c682383318
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
It is possible that CONFIG_NET_CONTEXT_NBUF_POOL is set but
application has not defined any pools. In this case the tx and
data pool pointers will be NULL in net_context struct and we
must use the default pools instead.
Change-Id: I286f34c87d9182aace71e0a61f038945810e4916
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The default timeout (4 min) is very long. Allow tweaking the
value via Kconfig option.
Change-Id: Iddfd48b96f3612b9bba7caa4d64357505df9644d
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Match neighbour with link layer address. And get RPL parent with
matching ll address. DAG id different which is prefix based address
from the parent.
Change-Id: I75ecdfa7aa63da210676a3f44b8510d24c38d1d5
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Let intermediate node reply DAO ACK only if it can not forward original
DAO messages to it's parent. If DAO forwarding is success let the final
parent sends DAO ACK.
Change-Id: I14ff9b5b110a639cad6415741dde71c2cdd222ef
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
DIO message suboptions can contain PAD1, PADN, Metric container,
Routing information, DODAG configuration and Prefix information.
Right now we are not skipping PADN and unknown options payload.
Change-Id: I43557962784f68a223ea209eae5ca0367a3d5410
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
DAO message suboptions can contain PAD1, PADN, Target, Transit
and Target descriptor. Right now we are not skipping PADN and
Target descriptor payload.
Change-Id: I89a9c3cb59de5397d1430f0fa5de95beee193880
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Parse DAO ACK from parent and analyze it.
Change-Id: I2394bd5e339ff00c87b9b4835dd5a21e2bafb2e5
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Indentation is wrong for few options. And few options does not
properly aligned.
Change-Id: Ib4a8a90a17fd20ddd16ec6f29558eb937f035bb9
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Earlier net_nbuf_copy() mangled the original buffer. So cacheing
src and dst address was necessary. Now original buffer does not
get affected by net_nbuf_copy() call. Cacheing is not required.
Change-Id: I25f60bc6db2a75612e562e56024d4459478d80b4
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Do not call callback if destination ll address is not set. This
happens when dst is multicast or broadcast.
Change-Id: I34dda92799a987d9cff031dc97f4a01b94437561
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
There is no transition from tentative state etc... It should directly go
to preferred.
This is fixing ND processing when DAD is disabled: source address was
never set, as tentative state is not a valid in
is_proper_ipv6_address().
Change-Id: I6f0a0fdd99dd13d28849f9749f89ec21fdd370d8
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Add "net dns <hostname> [A | AAAA]" command support that can be
used to query IPv4 or IPv6 address for a given host name.
Change-Id: I86b2258efa994a67163f9b3b340f44d65767f11b
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If the config file contains DNS server addresses, then
configure the DNS resolver to use them.
Change-Id: Ie7f2bdcf7ac4bb7ee0ecf7fb5b7bd2df3379cdc3
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Length parameter was always useless, only used in debugging, so that can
be removed.
Change-Id: If597f424840f37955202fa5fe827dd992e4cf776
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Thus the ping command is more user-friendly: at least user knows the
ping got a reply or not.
Change-Id: I740a2f77d288f6287ac04c908f3d517a49df57d2
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
As it is done for ICMPv6. This will prove to be useful for implementing
an echo reply handler in a ping for instance.
Change-Id: I969a1da60f2a4ea59eee5c9983eb6e340923e2ef
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
net_addr_pton always returns -EINVAL in case of error, so let's play with
it to factorize the code.
net_icmpv<4/6>_send_echo_request always returns -EIO in case of error.
Change-Id: I89e5ccd4b936701f7dad194089dda845fab5d738
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Refining the names around IPv6's neighbor states to differentiate them
easily from any net_nbr related names (which are not tighten to IPv6).
Change-Id: Ibc24df2a9485477a53fe5fe1c8f993f0fcd91635
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Probably some refactoring left-over.
Change-Id: I9715441a54b2e675135ce4072651dcead3216d3b
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
We incorrectly changed the state from FIN_WAIT_1 to CLOSE_WAIT.
This caused ACK be sent in CLOSE_WAIT state when the connection
was closed by peer. Sending ACK in this state is not allowed
according to RFC. The connection was still closed but slightly
wrong way.
Jira: ZEP-1961
Change-Id: Ie4aa6818128d4190230b679e26ac9630c7d45d69
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
User can open a TCP connection (just one at a time) by
using "tcp connect <ip> port" command.
Data can be sent by "tcp send <data>" command.
Connection can be closed by "tcp close" command.
Change-Id: I75aedd873a30575a6f742926b716afb7dbbfb92b
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
No functionality changes, use separate variable so that we do
not need to do big-endian conversion multiple times.
Change-Id: I8874b427bd39dfa2d952034a2623c47544a644fc
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If IPv6 router is added, then NET_EVENT_IPV6_ROUTER_ADD event
is generated. When router is removed, NET_EVENT_IPV6_ROUTER_DEL
is then generated. This is useful info if we want to have a generic
connectivity to outside of our local network.
Change-Id: Ia03958a071ceb998127894025c99ab72a8b648d5
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If the bind port is set to 0, then return the real bind port and
show it in the debug print.
Change-Id: If75b52bdacfc916329222d0d9e8aa4669e7a7160
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This is part of a patch series to decouple TCP/IP offload, which
currently occurs at the transport layer (L4), from the data link
layer (L2).
- Rename struct net_l2_offload_ip to struct net_offload
- Rename struct field offload_ip to just offload
- Rename include/net/offload_ip.h -> include/net/net_offload.h
Change-Id: I3cd891c2b13e0e8f3ad1c66264f90b5031ae17c2
Signed-off-by: Gil Pitney <gil.pitney@linaro.org>
This is part of a patch series to decouple TCP/IP offload, which
currently occurs at the transport layer (L4), from the data link
layer (L2).
This patch simply renames the NET_L2_OFFLOAD_IP Kconfig variable
to NET_OFFLOAD.
Change-Id: Ic8b1d004cbac09b7c636475aaed75b0a31e4be1c
Signed-off-by: Gil Pitney <gil.pitney@linaro.org>
When route not found try with default router if it exists. Consider
default router as nexthop. If default router also does not exist
then drop the packet.
Change-Id: I56cc9e4a1432fc25687cbaea600bfe9cf5b1d51e
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
No memory leak but debug prints shows buffer dropped due to
NET_DROP verdict. Added TODO comments to support DAO ACK.
Change-Id: I32deb2e1d2eea98f19ef26ad429ba8d03ae13751
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
When an intermediate node received DAO message, it should forward it
to its parent (if exists) and it ack to orignal DAO sender. But
dao_forward() function steals frag chain from original buffer. Src
and dst address pointers to original buffer are not valid to
continue in dao_ack_send. So cache them for DAO ACK.
Change-Id: I3a4df4837a133afe4e2badb183f729c37d267f63
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
When DAO message is required to be forwarding to a parent addr,
only frag chain and iface is considered. But for newly created Tx buf
other metadata also required. In this particular case setting
inet type, ip header length. Also update checksum as dst address
is changed.
Change-Id: If0e0a52e943db66be4aeecb6d0e3b9d7c3f04f58
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Path lifetime exists at 6 byte in RPL Transit information. So after
type and option length 3 bytes should be skipped to read lifetime.
Change-Id: Ic90c3bd75e3c7c63ffe9be27c0d206fc8fd58604
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
NET_RPL_DAO_ACK Kconfig option was missed. subsys/net/ip/rpl.c has
functionality of this option. By default it is disabled. Enable it
if you want to know the status of DAO message.
Change-Id: If5ed86c9c8c6c62991fc92d2f1e2a35331811356
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
If DAO message is not inteded to destination node then
intermediate node will forward original message with final
destination address. But verdict not passed properly.
Change-Id: If61c7b683b55b24b68f5235d0eee5ed60b611aef
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Two size_t variables were printed using %d which gave warning
if RPL debugging was enabled.
Change-Id: I6bc135c76a31da304e94af34ecd571163ddf2a0e
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Selecting RPL will need to enable NBR cache support,
it is not enough just to select IPv6.
Change-Id: I8162497111354d0fa9e44564fa5cc5ee46110b96
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Instead of simply dropping the packet if the destination IPv6
address is not ours, try to figure out if there is a route
to real destination and then re-route the IPv6 packet there.
Change-Id: I6b2a0d7096b3d7877b82b04f38e3a6e588587c11
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
k_delayed_work_init shall only be called once per work and not every
time before as that can trash the workqueue list if the work is pending.
Change-Id: Ib04b6689c59d03328687b0b579e80012dbd2f853
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
k_delayed_work_init shall only be called once per work and not every
time before as that can trash the workqueue list if the work is pending.
Change-Id: I454f40b63133bb7d6239dbe902858932bacfc454
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Print TCP header information in one line as there is really no
need to use multiple lines. Also use debug level when printing
the header info so that it is only seen if debugging is activated.
Change-Id: I27f314ca060239545769dec07148897da3426436
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
k_delayed_work_init shall only be called once per work and not every
time before as that can trash the workqueue list if the work is pending.
Change-Id: Ib6398a6a843dd4d820529487ad76a9dc9d9e152e
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This fixes warnings when using %u to print the result of sizeof.
Change-Id: I5391456c855ec2785af22467d9d0f355bbb1e577
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
The return code from net_icmpv{4|6}_send_error() was not correct
if the error message could be sent. Now 0 is returned if sending
succeed, and <0 otherwise.
Change-Id: Iff67f097a9d9519c9f11d4cbc9cf428a7c74ec1b
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Update statistics for every sent, received and dropped
ICMPv{4|6} packet.
Change-Id: Ibe6f02e8222adb3db1f1dbd0cde1ed251710eb43
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If we are replying ICMPv{4|6} message, then do not wait forever
for a free buffer. In a busy system, this might lead to non-progress
in RX path if we receive lot of packet from the network and never get
a free buffer.
Change-Id: Iaef92541b8745f872a07bc6e2052d0393d4d1e8b
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
commit 2e3e93dccb ("net: 6lo: Fix compress bit calculation") adds
a bit shift to the compress bit calculation, however it's typo'd as
a greater than comparison causing get_6co_compress() to return a
boolean value rather than the shifted version of the calculation.
Change-Id: Idacac2c032a03f1f75a78c94bed4c70428b8c77a
Signed-off-by: Michael Scott <michael.scott@linaro.org>
The IPv6 prefix address length was incorrectly set in net_if
after RA was received from the network. The incorrect "len"
variable was used instead of correct "prefix_len" in the prefix
info struct.
Change-Id: Ifeaf150b9960414d2ad200053a3bd5290dc8d365
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If the earlier prefix timeout is not cancelled before setting
it again, the system will hang.
Change-Id: I6e271294c8e5d43e3ceae4780b5d1c26bab2b296
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The caller semaphore was released too early, this can cause the caller
to re-use the data and possibly corrupt the memory, if caller yields
and is run before this management thread. Solution is to first remove
the node from the list and then unlock the semaphore.
Change-Id: I02cef53559d776f32a5959380e6b7122cd5198c5
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Add CONFIG_NET_IPV6_NBR_CACHE option that is the base for both
neighbor discovery (ND) and duplicate address detection (DAD).
Both ND and DAD can be disabled if needed. If NBR cache is
disabled, then ND and DAD are disabled too.
Note that it makes not much sense to disable DAD or NBR cache
as IPv6 will not work properly without them. It is possible
to disable ND but then the neighbor information needs to come
via other sources like RPL.
Change-Id: I57c8668ad828b3a153dfc58eea78bf5f7ac3938a
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Although very unlikely, I saw crashes at startup that could
be because of the buf or iface were null.
Change-Id: I8649eeb4f24fcd7d9f2acaeefaba4e6593388e91
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The fragment pointer is good to print here.
Change-Id: If09e684bbe0f9f5d3f961c4af8f86fb3ff364671
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If for some reason the neighbor solicitation cannot be sent,
then we need to unref the pending packet as that would never
be freed otherwise.
Change-Id: Ied12a9b3a027a2aad3fafd0b5b36c56b5f042c28
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If we are trying to send a IPv6 network packet and there
is no data, then print error.
Change-Id: Ia0e7bebae513f1bcf984e189566ae7e10a90bbfc
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
When going through fragments in update_ll_reserve(), use
net_nbuf_unref() in order to get better memory allocation
debug prints.
Change-Id: Ia7ee15b32800acdebeb28125465515132c55e179
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
No need to receive anything if network interface is down.
Change-Id: I22d62aeaf4fbef54608818bf6c8073ec2e9a7c09
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Make sure that both the TX and RX threads are running before
we turn the network interface up.
Change-Id: Ie7e5938403e90e1ae76047c221cf9fd2f5a1167b
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
In case of callback based event listener, it is easy for the callback to
filter on the given interface. But in case of the synchronous call it's
not: it would need, after a failed comparison on the interface pointer
to loop by itself on the net_mgmt_event_wait() which is a little bit
heavy (reinstalling the event listener, with the semaphore and all) and
a bit of a burden for the caller itself.
Instead, net_mgmt provides a dedicated call
net_mgmt_event_wait_on_iface() which does it the right way, so the
callback and the related semaphore are destroyed if only the iface
matches the one given as parameter (besides the timeout obviously).
Change-Id: Iab05c3249586f4f4d0447eea42fdac72b8428f2e
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Instead of creating a handler and a related callback structure on an
event_mask: net_mgmt_event_wait() can be used to wait synchronously on
such event_mask. The core mgmt part will seamlessly reuse the struct
net_mgmt_event_callback so the whole internal notification mechanism is
using the same code.
Change-Id: I426d782c770e75e5222aa3c5b703172b1f1f2e5e
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
It's not enough to know just network address and port number to
disambiguate an endpoint, protocol (TCP vs UDP, etc.) should be
known too. Without this patch, there is a confusing output from
e.g. echo_server if both TCP and UDP is enabled.
Jira: ZEP-1086
Change-Id: I247a2dfc87df634ceac3b8733d7349b1d6aca80c
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
This function is useful for logging in other parts of network stack,
so allow to reuse it. (Will be used for net_context logging in a
follow-up patch).
Change-Id: I8238874584f8f039c94e5d827265944d97d13f6b
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
NET_IF_UP may change during the lifetime of k_pool which means we would
have to reconfigure everytime the flag changes but NET_IF_UP is already
checked during net_if_send_data thus it should never reach the queue in
the first place making this check unnecessary.
Jira: ZEP-1888
Change-Id: Iaa8471bee886a6f7e701a1dd243fb199def26589
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Current finalize api's takes buf as input parameter and returns
the finalized buf. But if there are any issue while finalizing,
it failed to throw an error.
Change-Id: I6db54b7453eec41a8051fab50d5c0dc937debd54
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
When IPv6 header contains extra header (e.g. HBH), extra header length
was not part of app data length calculation. Result applications get
invalid total length. Also simplified set_appdata_values().
Change-Id: I07438d62dfd0f9abc1452484deb8b5eacdc37cf1
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Add support for adding IPv6 extra header (HBH) with RPL options
in ICMPv6 echo reply.
Change-Id: Ibd0b96362a7d5a5f668a18d6a33e6917d37dc51c
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
As per RFC 6775 4.2, context length holds number of leading bits
in the Context Prefix field that are valid. Rest are not valid
for compression.
Change-Id: Id21cc2d7a5d42980cf9295f85e75c4869ff6cb99
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
When a nodes receive a packet with RPL option in IPv6 HBH, it's need
to be reverted with node flags, instance id and sender rank.
Change-Id: Ic49c8e84c7846dc02728c120078506f6d7411e52
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
RPL extension header verify function takes input parameter as
metadata 'buf' and start reading from it. Instead it should start
reading from fragment (buf->frags). Also API should return
fragment and offset where caller can continue reading it.
Change-Id: I80612144aed55aa2dcf9eaab1f4408e10efdda31
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Make sure the neighbor cache is printed nicely in table
format with columns aligned.
Change-Id: I5323fdc644317ea08fd4694215f8cd44f8d7ff74
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The net_byte_to_hex() prototype first parameter was uint8_t *,
but it should have been char *.
Jira: ZEP-1885
Change-Id: I6132a67bb9e8199de88451fb4e446081f401e8f6
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
We did not handle NUD (Neighbor Unreachability Detection)
properly and did not go to DELAY state when neighbor
reachability was checked.
Change-Id: I127d25124aa806c44ff37c1355cc3db7fb25b2d2
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Print timer information when creating and expiring the
reachability timer.
Change-Id: I5c8fee91de85fe7c9ea7c467f45dbb105250d5b1
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The send_ns timer was used instead of reachable timer when
the reachability timer was expired. This meant that the
reachability timer was never restarted after it expired once.
Change-Id: Iccbd6d019d1106adca60f7319bc4c547cdb1d924
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Print the neighbor pointer address and remaining time when
viewing the neighbor cache in "net nbr" command.
Change-Id: I13840ccc16c31c99a803ec1b7afe69879bd639f2
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Use the proper API to get the remaining time in prefix timer
and return the value in seconds as expected.
Change-Id: I055ce0ba6092c23ad60d6775ce75a0a67ad91d26
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
In order to verify that the neighbor is reachable, send
neighbor solicitation message to neighbor which should then
send neighbor advertisement to us so that we can then mark
it reachable.
Change-Id: I2c45ee4a6982c698ef6c8fa1acccb995aadf8ee6
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
In order to be able to debug IPv6 neighbor state changes,
pretty print the state names when setting the new state.
Change-Id: I64e0b4173eaa63c9715c17420a008602759aa4fa
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
To be used by net-shell and other files for debugging neighbor
state.
Change-Id: Ie9b09a54a05dcb066906a3697dfe38aeffc886e6
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
No need to print error if we have already joined a pre-defined
multicast group.
Change-Id: I1237d5fbf0b63267ccb00432522513358c48d31d
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Wrong type modifier %zu in debug print, should be %d.
Change-Id: I82feca91d9e083a03263477569c552acc7c9767f
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Patch 235118245864491a592245f57e5244bf61711943 did not set the ll
addresses in the right buffer which causes 6lo to unref buffers
causing a double unref latter.
Jira: ZEP-1890
Change-Id: Id7591ef3c20c7ab62dcb04576406d70602baa129
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
IPv6 fills in lladdr_dst properly according to nexthop. Thus it's
useless to lookup again for nbr when creating data frame etc... Let's
use this directly. It both optimizes the code path as well as implements
proper nexthop frame sending.
Jira: ZEP-1863
Change-Id: Ic17a1b14a0db0692d31419ea2f45a5f288a09fb5
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Now that k_poll landed in the kernel, it's worth using it to save
memory and reduce the number of threads at runtime.
Such switch has been first done in bluetooth (see hci_core.c and conn.c
in subsys/bluetooth/host). Since network interfaces kind of follows the
same design for sending data, it was then easy to copy the same change as
in bluetooth.
Change-Id: I7f9734b88ac818284bbabaedc946b4765b905ebb
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Due to recent TCP fixes for 6lo, we are making a copy of buffers
sent to net_tcp_send_buf() so that TCP retransmit can send the original
(unmodified) buffer. This original buffer is freed via the TCP
sent_list when the related ACK packet is received.
However, there are users of the net_tcp_send_buf() function which
will never get a corresponding ACK (and do not add the buffer to the
TCP sent_list). An example is send_ack() in net_context.c. In this
case, we leak the original buffer.
To fix this leak in the 6lo specific block of net_tcp_send_buf(),
let's check to see if the original buffer was added to the TCP sent_list
and if not, then avoid the buffer copy process entirely.
Change-Id: If99e0e5bf266d33dd3466dc5d74443eaa39d10a8
Signed-off-by: Michael Scott <michael.scott@linaro.org>
Instead of magic constant (0) use the K_NO_WAIT when spawning
a thread.
Change-Id: Ib3a181fdfa246843d9c708592ccc754e54bc6005
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
As the networking cannot work without RX or TX threads, mark
them as essential.
Change-Id: Icb52c77fcdcef35d77c36e5ec855fed438a38407
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If we cannot join pre-defined allnodes or solicit node multicast
groups, then print error. Typically this will happen if the number
of multicast IPv6 address records is too small in net_if struct.
Change-Id: I12211cff90ef4edc856f1432cab0c37aae9a1bd5
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This is only needed when doing unit tests.
Change-Id: Ifd4e5e8ea98e3ab2344ed0c19d92f2be7d8008f8
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Collect number of received, sent or dropped multicast listener
reports and queries.
Change-Id: Ia5c08203155475763f96df23f44eceffa7569873
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If we receive MLDv2 (Multicast Listener Discover) query,
we send out information about the multicast groups that
we have joined.
Change-Id: If4ea9fa685319b2ad900e1949a5cbe12e7696b43
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
As dictated by RFC 3810 ch 5, we need to add Hop-by-Hop option
with Router Alert sub-option to the sent multicast listener
message.
Change-Id: I8e3ed58fff4736e9708276a3185f94e7f2b453a3
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If we are taking network interface down, then flush the TX for any
pending bufs that would be needed to be sent.
Change-Id: I229ecce8e07ec5847d4c6c6a1994de04bd9171e2
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If the multicast address already exists, then do not give
error but try to join it.
Change-Id: I32ffa6b3bf0798011d684a1a21e87e389f1f0380
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
When network interface is taken down, leave only those
IPv6 multicast groups that were joined.
Change-Id: I414556c093ba67be7c13e6c86e0451465c2203f3
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Send management event if we joined or leaved IPv6 multicast
group.
Change-Id: Ieeb407ef88fb3bf4cd92d4fb4b69f03b260474e7
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
When we setup the network interface, add predefined IPv6 multicast
groups into the network interface. When interface is taken down,
then leave all the multicast groups that joined.
See RFC 4291 ch 2.8 for details.
Change-Id: If17d3e8c75157a02aa93c92e2fb499619c1484cf
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This and subsequent commits adds API to join or leave
an IPv6 multicast group.
Jira: ZEP-1673
Change-Id: I26dcfe16a4527dbf7886a30827a5d4ebfdeaac01
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The tcphdr->offset was not set when tcp options were added.
Change-Id: I19fe97983ce81948a9a84893183e5c9000f12767
Signed-off-by: june li <junelizh@foxmail.com>
There are no users of net_tcp_set_state() left outside of
subsys/net/ip/tcp.c.
And the naming of this function is confusing -- it could easily
be mistaken for net_tcp_change_state() which contains additional
logic for certain tcp states.
Let's remove it entirely and fix the remaining uses to set
tcp->state directly.
Change-Id: I92855ad180e8682780fcff11e50af06adcbc177c
Signed-off-by: Michael Scott <michael.scott@linaro.org>
In net_tcp_release() when a TCP connection is being closed, we
should call net_tcp_change_state instead of net_tcp_set_state.
net_tcp_change_state() will call into net_tcp_set_state() but
also contains logic specific to NET_TCP_CLOSED which unregisters
the context's conn_handler and sends an accept callback (if
present) with -ENETRESET error for user code to handle.
This fixes an EISCONN error returned by net_context_bind() when
a TCP-based net_context was reused. Due to the conn_handler
not being cleaned up in the TCP code.
Change-Id: I8439a028a1c7ae5fd2a50d11caa9947a0ac6c7d4
Signed-off-by: Michael Scott <michael.scott@linaro.org>
The parsing of IPv6 extension headers was skipping bytes
in certain cases.
Change-Id: I80612144aed55aa2dcf9eaab1f4408e10ef9ca31
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Compress bit calculation was wrong. It should be moved
to 4 bits left to cache it properly.
Change-Id: Ib011874881a69032795c2ecfd9a615b6cf559c69
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Max 6lowpan contexts are 16 as per RFC 6775 4.2 6LoWPAN Context Option.
Range is 0 - F. So context id '0' is valid.
Change-Id: I8468a805e0145b64921139a587cdaeeb9d6871b8
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
If hoplimit bit is unset then values are inlined as
per RFC 6282 3.1.1 HLIM: Hop Limit.
Change-Id: I5821fdf1a4a65b252362277cc604ae913203f80e
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Hop limit compression should be after next header compression as
per RFC 6282 3.1.1.
Change-Id: I0eaf3428bf835fe73831a7fe6fb708b73c8f5d12
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
net_nbuf_ll_src(buf)->addr and net_nbuf_ll_dst(buf)->addr should be
pointing to ctxt area not actual net_nbuf_ll region since the payload
over Bluetooth does not carry any ll addresses.
Change-Id: I87828d74abf2402fdf2a5e34aa8db93aa7c50d08
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
If the packet contains IPv6 header + Extra header + ICMPv6 headers,
last header does not contain 'next header and length' fields. So
while parsing header we should first check next header and continue
parsing. Otherwise we parse 2 bytes extra and set invalid ext hdr len
and handover to other layers. So everything goes wrong after that.
Also simplified next header parsing to minimal.
Change-Id: I5d8235c5a57c8b77adf6a07eb8eb74350a3e4dc6
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
If the buffer contains IPv6 header, set header length only once.
Need not to set it in different scenarios.
Change-Id: I54ab9a4259851c9230db240f6091e3190d25b6cb
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
If RPL is not enabled do not handle RPL options in IPv6 extra header.
Issues will arise if we skip reading those bytes and continue further.
E.g. Upper layer protocol like ICMPv6 echo request does not prepare
proper echo reply if we skip like this. It doesn't know what options
need to be updated in reply header.
Change-Id: I250672a54d4c7f60727313f6e7f8fe902685d0c5
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Verdict not assgined to its proper value and return NULL in case
of read error. Also simplified error handling.
Change-Id: Idf4c5e242066dfd03e1519271dc1ba38ec43e6ce
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Verdict NET_DROP returned even though it handled properly.
Change-Id: I61e04b12f971b39585e983aa9a1007c63acd8b4e
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Debugging code snippet inside handle_echo_reply() does not look nice,
just provided inline functions and simplified it.
Change-Id: Idc3a9284153aaa04d0431a9dd705c4f1c51b817d
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Earlier net_nbuf_copy_all() mangled the original buffer. So cacheing
src and dst address and other values was necessary. Now original
buffer does not get affected by net_nbuf_copy_all() call. Cacheing
is not required.
Change-Id: I8a8534f7ec299853b9b296d85e8aacecd3768c8e
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Variable len is not used in net_icmpv6_input() and if required
it can be obtained from 'buf'.
Change-Id: I4b0710e1cf16cff9837173ad9d6908ec54ebafae
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
If a UDP context had net_context_recv() called before
net_context_bind(), then it will have a stale connection handle
associated with initial (random) port number, while will be "bound"
to a new port as specified in net_context_bind(). So, it silently
won't behave as a user expects. net_context_bind() should really
update (or destroy/recreate) conn_handle in this case, but until
it's implemented, apply stopgap measure of at lease reporting error
back to user in this case.
Jira: ZEP-1644
Change-Id: I22ad55f94eaac487a4d5091ccbb24f973ec71553
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
Print information who freed the net_buf last time if this
can be figured out. This info is not fully accurate if there
is lot of allocations going on but could give some indicatation
who was using the net_buf previously.
Change-Id: I3d4463c54a9b944847a532d951fb6d2303fc06cf
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If we could not allocate a buffer while unfragmenting, make sure
that all the created temporary net_buf artifacts are freed and
we do not have a memory leak.
Change-Id: Ib98ae32eb4a0f9b5f92c51e9713fd8e6d78b10da
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
It is possible that the cached buf is NULL so avoid nasty
error print by not trying to free NULL pointer.
Change-Id: Iec53164f6ffab4b830aba63a1f351ca2349a43ff
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If net_nbuf_read() or net_nbuf_write() offset adjustment fails,
print the offset value in order to make debugging easier.
Change-Id: I899998bdcbc91a25ed7d71a599a5052a6fa4ee36
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Show only what would be freed when debugging the allocations.
Let the net_buf_unref() to delete the individual fragments.
Change-Id: I1a39a553f12d73b78c4ba08be0e8e8252b666c8e
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The "net stacks" command will also print main and interrupt
handler stack sizes.
Change-Id: I1b867be81ac8b4f6d9446f484ebb8b1d852b98b0
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Create net_nbuf_frag_del() so that we can track net_buf frees.
If CONFIG_NET_DEBUG_NET_BUF is not defined, then this new function
will call net_buf_frag_del() directly, and if not, then it will
track memory usage.
Change-Id: I5f382436cebc71fdaf12baf7bf964fb63bee7aca
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit adds "net allocs" command that can be used to
track net_buf allocations that are done by net_nbuf_get*()
and net_nbuf_unref().
Change-Id: If3dc2ecf5552f8008138ee9733458a19f9764c13
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
User can track memory allocations and deallocations.
This is enabled by CONFIG_NET_DEBUG_NET_BUF option.
Change-Id: I9d83b9b63fb2b141c9a283887f1770bb4232f61c
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
No need to set the buf to NULL as it will get its value
from net_buf_alloc() call anyway.
Change-Id: Ib3a32b6e4cb4b446761b6a97a88c20fc52d3d683
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Add description what happens if NET_DROP is returned from
L2 send function.
Change-Id: I371de725b710041bb26a141f9860c0062fb1ef5d
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Instead of always calling net_nbuf_get_reserve_tx() with zero
ll_reserve (first parameter) and then setting the link layer
reserve separately, pass the reserve to that function which can
then set the ll_reserve in buf itself.
Change-Id: I21c14cb7e2e6c36d170c09998bca0207ecf65c75
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The ll_reserve parameter is useless in net_ipv{4|6}_create_raw()
function as the reserve information is already stored in buf.
Change-Id: I7815a78c001e3da532478c04b3dac9b37bbc723c
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The code used net_nbuf_get_reserve_{rx|tx}_data() function to
allocate a fragment. Instead of that low level function, use
net_nbuf_get_frag() instead. There are few places this is not
possible or is too big change like in few test programs.
Change-Id: Ied7e2b7db352de998b200ffa6ff82471bfa5ebe3
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The net_buf pool address is not very useful so print the
user friendly name of the pool instead.
Change-Id: I1c64621c816832d2459819490ec5609f5c39f9f1
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The columns were not aligned properly.
Change-Id: I551d04182c2877a29bb02a9da5400d74a080a1c9
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If we receive lot of packets, it might happen that we exhaust
all the DATA buffers in the system. This would prevent from
us sending anything to the network.
Change this by splitting the DATA buffer pool into RX and TX
parts. This way RX flooding cannot consume all DATA buffers
that needs to be sent.
Change-Id: I8e8934c6d5fdd47b579ffa6268721b5eb3d64b6d
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Do not shortcut the sending side for TCP as we need to use
net_tcp_send_data() to send TCP data in order not to have
double unref in Bluetooth or IEEE 802.15.4 technologies which
has a special TCP packet sending logic.
Change-Id: I077db336c6335ccdbbafa4600f98388ecf33955f
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
When sending TCP data using 802.15.4 or Bluetooth technologies,
the 6lo code modified the original IPv6 header. This caused
issue when acknowledgment was waited to the sent packet as
the code could never match the sequence and ack numbers in
TCP header.
This commit changes this and the packet is cloned when sending
it so the 6lo code will modify a copy of the data and will not
touch the original packet.
JIRA: ZEP-1719
Change-Id: Iae51f35d5b5ada0d2543b58a29abbf10f146777e
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Enhance the connection debugging and print the UDP and TCP
checksum when the packet is received.
Change-Id: I1ccf58a299178277fab0667b01d54ad7bac38663
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If there is lot of network traffic, it is possible that all the
network packets are allocated by network driver. The device driver
places the received packets into RX queue. Then that queue is read
by 6lo code. During the uncompression, the 6lo code tries allocate
net_buf in order to place proper IPv6 header into it.
If all the data fragments are in use at this point, then 6lo cannot
continue and it blocks while waiting available net_buf. This leads
to deadlock in the stack.
The solution is to change the 6lo to allocate the net_buf using a
timeout which will cause the received packet to be dropped if it
cannot be uncompressed because of out-of-buf situation.
Change-Id: I137f02b05193e16c45da8804974d357c920c861d
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
When doing 6lo compression or 802.15.4 fragmentation,
use the API that uses dedicated net_buf pool if that
support is enabled by the user.
Change-Id: Ic6651c393832c759eebb66a41db31c9067ebb4a9
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
It makes no sense to modify the original net_buf so change the
copy function not to touch the original buffer.
Change-Id: I5d22445ce50cee62994c36567f0e995a500cb89d
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The first parameter of net_nbuf_copy() must be the head
of the buffer chain i.e., it must contain the user_data
part. If a fragment is given, then we do not know enough
information to allocate the data fragments.
Change-Id: I052b183d8c63d7326b320254f36f00b2fc48b0a0
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Print information about various network buffer pools in the
system. This is useful in debugging the buffer allocations.
Change-Id: I31123c6f1f6647f77503f32e268c174330762128
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
User can configure its own pools for data that needs to
be transmitted out (TX). This helps to avoid deadlocking
the system if user space application uses all the buffers
in the system, and the core IP stack tries to get buffer
that needs to be sent out.
By default the net_buf pool support in net_context is turned
off as application developer needs to create the pools and
tie them to desired contexts.
Change-Id: Ida4a1771d34d6c250974e56fba4f0e0b2592cb29
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
As the pool contains now more accounting information, there is
no need to keep track of this data in nbuf.c.
Change-Id: I7fd44f9feda8fd9816356556d1e788ad56e6eedd
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Rewrite the dhcpv4_t1_timeout() handler to explicitly handle all
states.
Change-Id: I6f9d6c8cfacd945e24eb66c6440bf305d528c521
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
The iface handle checks in the both timeout handlers are unnecessary.
Drop them.
Change-Id: Ie7c884b2ea648f700fbefa8382341036a4db063f
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Correct the logic that determines when CIADDR is set and when it is
left as all zeros. RFC2131 requires that CIADDR is only set when the
client is in specific states.
Change-Id: I93a45e355fbef8d11dba5ac194570b87c594656e
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
RFC2131 places explict requirements on a client w.r.t which messages
are broadcast and which are unicast directly to a server. Notable
rules as they apply to the current dhcpv4 implementation are that
DISCOVER and a REQUEST in response to an OFFER are broadcast. A
REQUEST in state RENEWAL is unicast. There are further rules relevant
to the REBINDING state which is not yet implementated.
Adjust the current implementation that always uses broadcast to use
unicast as required by RFC2131
Change-Id: I6edef4241bcd74623a804a73415888cd679888d0
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
RFC2131 requries that a client MUST NOT include server identifier in
DHCPREQUEST from state RENEWING.
Change-Id: I0fba703f3a3b218af1ac03f4f1f0daa290bd428f
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
The DHCPv4 client obtains resources from the server on a lease. Once
a lease expires those resources must be relinquished.
Update the DHCPv4 client to explicitly remove leased resources from
the network stack once a lease has expired.
Change-Id: I5d3b7a02e463041cfdee1d104f5962498bdd6a30
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
The existing dhcpv4 initialization code places all initialization in
the per iface dhcpv4_start() code. The net_udp_register() setup needs
to happen once for the dhcpv4 instance rather than once per iface.
Subsequent patches in this series also need a place to perform one
time initialization, independent of iface.
Factor the one time setup code out of the existing net_dhcpv4_start()
into a dhcpv4_init() function. Rather than use SYS_INIT() to run
dhcpv_init() we hook directly into net_init().
The prototype of dhcpv4_init() is shared within the net subsystem with
a new private header file deliberately to avoid exposing the function
via the public API in include/net/dhcpv4.h
Change-Id: I3502a53cc3bfe4db4e4cd22c02ae133c266fdf10
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Factor out common code associated with entering the REQUESTING state.
Change-Id: I0fc038a49309625c24b874dfda0355794cd41da9
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Factor out common code associated with entering the SELECTING state.
Change-Id: If34929e5f13dff7650388a2b491a01cbbf5dc100
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Refactor send_discover() to provide a clean separation between state
machine and action.
Change-Id: I96510cc6a7ab16216821fe65ea4289a78f6443aa
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Refactor send_request() to provide a clean separation between state
machine and action.
Change-Id: If4c61c5789c919ab3ce6c1f914afc243176760d8
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Split handle_reply into distinct state machine and actions.
Change-Id: Ib177c7a4007662f941f156acfa5791e1d27e3d73
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
The dhcpv4 state machine implementation names differ from the names
used by the relevant rfc. There is no good reason for them to be
different, so rename them.
Change-Id: I837f1bc4788c0ed4d2949b12eb6f5bfeef9a0be8
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
There are two implementations of dhcpv4 state name numbers to human
readable strings, unify the two.
Change-Id: I1d654918bb919108a0d8c5514b309b193c9c3f96
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
The dhcpv4 state machine has a dedicated context within each net_if
structure. For reasons unknown the timers used by the dhcpv4 state
machine have been placed in net_if outside of the dhcpv4 context area.
Relocate them into the dhcpv4 context.
Change-Id: I0531f493610dffda9ca9208993597a5665bde997
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Change the message type representation from integer to enum, this will
help prevent re-occurrence of recent issues where states and events
are interchanged by making it more likely the compiler will see a type
mismatch.
Change-Id: Ia235afda428a9e5dfbd933e02beeae468b4c84a2
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Refactor and simplify packet construction. This resulting code is
simplier, easier to read and compiles a lot smaller.
Change-Id: I43c67d79fbb77f85af54355eca41f516054cbba3
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
This function is used only within net_context.c, make the symbol static
then.
Change-Id: Ib2c00a21c25e8c6a1404d6345d4b8ae05b779525
Signed-off-by: Jesus Sanchez-Palencia <jesus.sanchez-palencia@intel.com>
Since we try to match with POSIX behavior as much as possible, let's
not bother the user unless they need to be bothered. The recv(2) POSIX
syscall won't return 0 on stream sockets unless the connection has been
closed by the peer; however, that was happening with the callback set
by net_context_recv().
Change it so that the callback is never called if operating on a stream
socket and appdatalen is set to 0.
This is similar to a previous patch sent by Michael Scott in [1], but
not relying on the actual TCP flags: only on the appdatalen and the
socket type.
[1] https://gerrit.zephyrproject.org/r/#/c/9949/
Jira: ZEP-1632
Change-Id: Ib0c214fc9269d305a03e8d85eb606f106c45b038
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
If the DAD timeouts, then the pending pointer will be null
when we remove the neighbor. Fortunately this only prints
this error message and does not cause any issues in the code.
[net/nbuf] [DBG] net_nbuf_unref_debug: (0x00118350): *** ERROR *** \
buf 0x00000000 (nbr_clear_ns_pending():175)
Change-Id: I3e11d4aa1d90f205df591b5d5cdcf2ee7bde6c01
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
When we do DAD (Duplicate Address Detection), the local IPv6
address gets added to the neighbor cache. This is useless so
remove it after DAD has finished.
Change-Id: I9625d367e96d8108a7d3d1d8b2e95f3c4ea11c45
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Add net_ipv6_nbr_rm() utility function that can be used to
remove an IPv6 neighbor from the cache.
Change-Id: I9794856a4f65c5e943656970648e5c5762b0338c
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Add utility function to go through all the stored neighbors
in the IPv6 neighbor cache.
Change-Id: I42fe0ec48c000215403aef63629d0763189ebdbb
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The sequence and identifier fields are 16-bit instead of 32-bit
long. This did not cause any issue in Echo-Reply but those two
fields should be set properly.
Change-Id: I5e4878f53d6bb37660d46d173159d27bbe0e94dc
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
TCP header was not sent back to originator when ICMPv6
error message was prepared to be sent.
Change-Id: I171bd724c4260b83d7d1c37e0894f9ed8cddd2c9
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
TCP maintains 'sent_list' for retransmission if it doesn't get ACK for it.
Same list is not freed on net_tcp_release() call. This causes memory leak.
Change-Id: I2b2def1ea19487cc48ea4fbb6343ef0c773f288f
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Due to commit fece856959 ("net: tcp: Clean up FIN handling") the
tcp_established() callback now handles TCP connections which are
in various ending/closing states other than TCP_ESTABLISHED.
Currently, these states are generating the following error and not
being processed:
Context 0x123456778 in wrong state 6.
(Shown when TCP is in LAST_ACK state).
This commit also fixes a memory leak issue discribed in
Jira: ZEP-1658
Analysis of the memory leak issue is here:
When TCP connection is established, tcp context is in
NET_TCP_ESTABLISHED state. Once it receives FIN message from client
it goes to NET_TCP_CLOSE_WAIT and then it turns to NET_TCP_LAST_ACK
after connection closing request from server. Now server gets final
ack from client, but tcp_established() will reject it because current
state is not in NET_TCP_ESTABLISHED. Even if server receives proper
ack, it is not handled by server. Hence 'sent_list' is not freed.
Change-Id: I41c8af2e6851809f87a02c271a4290cf3d823ebb
Signed-off-by: Michael Scott <michael.scott@linaro.org>
NET_ASSERT(net_nbuf_iface(buf)) should be called before setting
it on context [net_context_set_iface(context, net_nbuf_iface(buf))].
Change-Id: I9a1da1214857e96e03784bc98a9aae5cf59ef0fc
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Using char or uint8_t relevantly.
Jira: ZEP-1723
Change-Id: I512cb6ff4800cd23f6539e7a47c7f3c72dc94183
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
The interface L2 address type is set at the same time as the
L2 address is set to the network interface. This is most
convinient place to set the address type.
Change-Id: I712d7357d075959eb79df3463141cfbc6d163a74
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The dhcpv4 client code builds ip and udp packets from scratch rather
than using the network stack to do the heavy lifting (why ?).
When it computes the udp checksum of each packet it builds it neglects
to clear any preexisting detritus from the checksum field. The result
of this is that some packets will be built with correct checksums and
some will be built with incorrect checksums.
This is the underlying reason that the dhcp client often taken many
retransmissions and elapsed time before in order to acquire an IP
address.
Change-Id: Iebd1ed34e06f7f2e53d45f6d1555e22f48490287
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Fix long standing issue where a dhcpv4 message type is compared
against a dhcpv4 state machine state name rather than a message type.
The issue probably arizes due to the similarity in names between
messages and states. By accident, the relevant message types and
states happen to share the same numbers, hence the implementation
works, but is ill defined.
Change-Id: I5c028de4336ff42f6696e28b3492c932c58b5a05
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Change the handling of iface parameter in net_if_ipv6_maddr_lookup()
function:
* If the *iface is set to NULL, then return the found
interface to the caller.
* If the *iface is not NULL, then use that interface
when doing the lookup.
Change-Id: Ia1f0365170ea9f3e615d189231160614a80d241a
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Because of the change in next commit "net: if: Change
the iface param in net_if_ipv6_maddr_lookup",
we must initialize the network interface to NULL.
Without this the multicast address lookup will fail.
Change-Id: I113b44ce23c5f2ecbbf1698972078f102995e891
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Make the IP address parameter const because we are not
modifying the IP address in net_if_ipv6_maddr_add() or
net_if_ipv6_maddr_rm()
Change-Id: I98c19de132e58c386f661e8a76a349d562a82c71
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
As the function does not change the original data, make
the corresponding parameter const.
Change-Id: I1125a2f9205dc73de2f0aac0c30110591baace1e
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Implement RFC2131 4.1.1 requirement that at dhcp implementation wait
for a random delay of 1 to 10s before sending the initial DISCOVER.
Implement RF2131 4.1 requirement that at dhcp implementation set the
initial retransmit timeout at 4 seconds and exponentially backoff on
each retransmit.
Change-Id: Id7029f3ed16a5f886dbd555fed87320aeffe31aa
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Rather than reuse XID's on retransmissions, always use a unique XID.
Either behaviour is permitted by rfc2131. Debugging the dhcp client
in the presence of multiple dhcp servers with significant packet loss
in the network is much easier if we don't unnecessarily reuse request
identifiers.
Change-Id: I5c82cbdbf3dfc0ef88cae036aa863946844c144f
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
finalize_segment() will call net_ipv4_finalize() or
net_ipv6_finalize(). Both the functions perform net_nbuf_compact().
But after finalize_segment(), net_nbuf_compact() called again, which
is unnecessary.
Change-Id: I9fab63bcc44eec87061a4b55edd5053cf6556a75
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Protocol family is checked in prepare_segment() and in same function
it's again verified by finalize_segment(). So remove the double checking
in finalize_segment().
Change-Id: I17123ab8741d017d7e3ff1ef3fb07371b0d4aa66
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Using net_buf_ref() technically works but debugging the network buffer
allocations is more difficult if done like that.
Change-Id: Iac81bd3ab95547741d49f32763baaa54e97b4877
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
If a net context is not connected or listening, we can go ahead and
call net_context_unref() to free it up instead of waiting for
FIN_ACK which will never happen.
Change-Id: Ice06f572df64f2edb5918c10c92087ce0b7b254a
Signed-off-by: Michael Scott <michael.scott@linaro.org>
Several error messages are currently being logged as NET_DBG which
requires the user to have CONFIG_SYS_LOG_NET_LEVEL=4.
Let's show these as errors so they are more visible.
Change-Id: I28c9a1aedb78787ef098a9bf565472a437373933
Signed-off-by: Michael Scott <michael.scott@linaro.org>
Current API description of net_nbuf_compact() is not very clear.
The first parameter needs to be the first net_buf in the chain.
The changes to this API are needed in order to clarify following
use cases:
1) User provides fragment that is not first of the chain and compact is
successfully done. In this case there is no free space in fragment list
after the input fragment. But there might be empty space in previous
fragments. So fragment chain is not completely compacted.
2) What if input fragment has been deleted and api returns the same
buf?
So this commit simplifies the API behavior. Now net_nbuf_compact()
expects the first parameter to be either TX or RX net_buf and then it
compacts it. It fails only if the input fragment is a data fragment.
Change-Id: I9e02dfcb6f3f2e2998826522a25ec207850a8056
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
The net_nbuf_push() API is not used by anyone. Semantics are not
clear and following patch requires changes to push api, so removing
this API for now. If needed this can be re-introduced later.
Change-Id: I1d669c861590aa9bc80cc1ccb08144bd6020dac5
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
The ethernet header location was incorrectly calculated
and the result pointer had some random value.
Change-Id: I6b2deee787a78444f3ee3be805d4b82ebb6c3664
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Currently fragmentation introduces empty fragment in the
beginning of the list, and adds fragmentation header, and moves frags
data to previous fragments. This is done based on condition that max
data should be multiples of 8 bytes and offset is based on before
compression.
It will fail at scenario when current fragment has not enough space
to move from next fragment and next fragment has more than allowable
max bytes. This will cause memory overflow which is typically seen
as double-free error to the user.
This is solved more simple way by this commit. First detach frags list,
prepare new fragment and attach that to buffer. Then move data from
detached frag list and free the fragments in the old one.
Change-Id: I5e3693d47828ff3b92db4ba5f6c00c0b751daadc
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
If we are in the end of the fragment chain, then we can just
bail out as there is nothing more to do. There will be a
double free if we continue as the last entry is already
removed at this point.
Change-Id: I0f9782b408244d283dc7e3e087359dd00bada7a9
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit changes the net_buf getter functions in nbuf.h
by adding a timeout parameter. These function prototypes
are changed to accept a timeout parameter.
net_nbuf_get_rx()
net_nbuf_get_tx()
net_nbuf_get_data()
net_nbuf_get_reserve_rx()
net_nbuf_get_reserve_tx()
net_nbuf_get_reserve_data()
net_nbuf_copy()
net_nbuf_copy_all()
net_nbuf_push()
net_nbuf_append()
net_nbuf_write()
net_nbuf_insert()
Following convinience functions have not been changed
net_nbuf_append_u8
net_nbuf_append_be16
net_nbuf_append_be32
net_nbuf_insert_u8
net_nbuf_insert_be16
net_nbuf_insert_be32
net_nbuf_write_u8
net_nbuf_write_be16
net_nbuf_write_be32
so they call the base function using K_FOREVER. Use the
base function if you want to have a timeout when net_buf
is allocated.
Change-Id: I20bb602ffb73069e5a02668fce60575141586c0f
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Prior to commit df201a0e4b ("net: context: Assign a random port
number when context is created"), TCP clients were assigned a random
port number when the incoming sockaddr parameter's port value was 0.
After the above commit, this is now broken as it will bind to port 0.
If left this way, every TCP client would need to add a line of code
copying the context->local sockaddr_ptr's port value into the
src_sockaddr port prior to calling net_context_bin().
Instead, we can reinstate this behavior in net_context_bind(), by
making sure we only overwrite the randomly assigned port in the
context->local sockaddr if the incoming sockaddr parameter has a
port which is != 0.
Change-Id: I0f27f031f743d50c351ecf9ab55b5282a20ff292
Signed-off-by: Michael Scott <michael.scott@linaro.org>
If we receive a neighbor advertisement, we need to free its
net_buf because we are returning NET_OK to the caller. This
return code means that we consumed the net_buf but we did
not call net_nbuf_unref() in this case.
Change-Id: Ia6d8f1b440be87eff5d2b14a23336a37be6d6a04
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The pending buf needs to be freed after it has been sent
to the network. We took the ref when pending buf was saved,
now we need to unref it when it is about to be sent.
Change-Id: I1e429969895700000a8aa124bd645db2d52d036c
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Doing it only in net_context, prevented to do it once NS succesfully
finished. This generated an error in 15.4, where pending data had wrong
ll reserve size.
Change-Id: I0f917fb76171457e5dff2c29e44edb8f00662150
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
We must use the nexthop instead of destination address
when sending the packet. The current code mixed destination
and nexthop addresses and ignored the nexthop when sending
neighbor solicitation message.
Change-Id: I53887c16ef6fcf8365f1f47ab5792cb208dd273e
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Keep track of amount of bytes that are sent or received from
all network interfaces.
Change-Id: I706481aab1a7e0cf2bc78d032f2ef4ebbabe3184
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Current behaviour has an issue when UDP context is created with local
port number 0, net_conn_input() happens to treat zero port as
a wildcard ("receive packets for all ports"). net_context_bind()
for a UDP context doesn't affect its existing connection in any way.
Proposed solution is, context should be created with a random free
port assigned and bind() updates connection information from context.
Jira: ZEP-1644
Change-Id: Idb3592b58c831d986763312077b0dcdd95850bc9
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
The port numbers in the range from 0 to 1023 are the well-known ports
or system ports. Do not allocate them for users.
Change-Id: I4d7b4e1314759e4d8b260669946b9880282642c0
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Commit-ID 83ed3a29be changed the way
fragments are managed after being sent, and this brought a bug in the
active scan logic. Up to active scan to keep the buffer referenced
relevantly now, which is simpler than it used to be.
Reported-by: Johann Fischer <j.fischer@phytec.de>
Change-Id: I23db4bab878328b1ca3cb313e737de819177c281
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This adds a NET_L2_BLUETOOTH_ZEP1656 which sets NET_IF_POINTOPOINT to
avoid using nbr cache with Linux peers as they send wrong link
addresses.
Jira: ZEP-1656
Change-Id: I842f4cbb99ae9d9c004494739c07189c191929fe
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This flag can be used by driver to indicate pointopoint links which should
not require destination link address to be resolved.
Jira: ZEP-1656
Change-Id: I58dd3bf48485d6203e75373497e00668317b9825
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
The net_nbuf_get*() functions were calling net_buf_alloc()
with K_FOREVER. This can cause issue if called from isr
context. The fix is to check if we are in isr and then try
to alloc net_buf with K_NO_WAIT.
Change-Id: I809170f2cd059480d436763e19a35386d9bdf048
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Channel, PAN-ID, short and extended address
Change-Id: Icdf94dff6f59cd155a072a609290197b37bd084c
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Channel, pan-id, short and extended addresses.
Change-Id: Ib63dadac37d649df3efc8fdd67f5312d3a7c8e20
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Fix setting short address through net mgmt API. It's not about
coordinator's short address, but local one.
Change-Id: I320143e40d336a1085bf12b17a88a2c35da83504
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
ORFD or RFD does not matter: the extended address should be set
according to device's MAC address.
Change-Id: I39d09c3a953283eeaa30b908ea159638604bd72b
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This makes sure ll addresses are properly set before sending reducing the
duplicated code on L2 drivers.
Change-Id: I5330c1d00a344e77555c6f31033ae42af20214bf
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fix comparisons in net_if_get_by_index and net_if_get_by_iface:
__net_if_end is not a pointer to a net_if structure.
Change-Id: Ie8e3a457c3f0fa97c080b38b5b7d2b420c50252b
Signed-off-by: Julien Chevrier <julien.chevrier@intel.com>
There is dead code that is never executed so removing it.
Coverity-CID: 157585
Change-Id: I6926289b5735b78fcb99ad493d1b05198b9e36cc
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Previous commit: 6e6281af96
"net: tcp: Only return -ETIMEDOUT if timeout>0 in connect"
missed that K_FOREVER needs a semaphore taken, but has a
value of -1.
Change the logic here to timeout!=0 to handle this case.
Change-Id: Iae6a784443810130a7de267226483426fbd4f0d4
Signed-off-by: Michael Scott <michael.scott@linaro.org>
The RFC requires we honor the 2MSL TIME_WAIT timeout, support for
which was just removed with the FIN cleanup. Add it back, but make it
optional (proper sequence number and ephemeral port randomization
makes true collisions a birthday problem in a ~80 bit space!).
Change-Id: I176c6250f43bba0c914da1ee7f0136dcb1008046
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
The context may live for a while after the user closes it (c.f. TCP),
and of course the documentation specifies that the user must not use
it after calling net_context_put(). Don't confuse them by invoking
their callbacks on the "closed" connection; it's likely that the user
has destroyed her own tracking data and the user_data pointers would
be garbage.
Change-Id: Iba9cc7025c6ea4a94cc4796903966f8d1b831996
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
The connection close paths were a little tangle. The use of separate
callbacks for "active" and "passive" close obscured the fundamentally
symmetric operation of those modes and made it hard to check sequence
numbers for validation (they didn't). Similarly the use of the
official TCP states missed some details we need, like the distinction
between having "queued" a FIN packet for transmission and the state
reached when it's actually transmitted.
Remove the state-specific callbacks (which actually had very little to
do) and just rely on the existing packet queuing and generic sequence
number handling in tcp_established(). A few new state bits in the
net_tcp struct help us track current state in a way that doesn't fall
over the asymmetry of the TCP state diagram. We can also junk the
FIN-specific timer and just use the same retransmit timer we do for
data packets (though long term we should investigate choosing
different timeouts by state).
Change-Id: I09951b848c63fefefce33962ee6cff6a09b4ca50
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
A FIN packet generated by a net_context_put() must go into the normal
transmit queue and not be sent synchronously. Previously sent data is
expected to be delivered and acknowledged before the connection is
terminated.
An advantage we get with this change is unified timeout and retry
handling for FIN packets.
Note that there remains a misfeature here where the queing of the FIN
results in a synchronous switching of the connection callback to
tcp_active_close(), which will prevent any further data received from
being provided to the user.
Change-Id: I2d41316549da9fee383b4f32af5e8b3adf4cb122
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
The death of a network context was sort of a mess. There was one
function, net_context_put(), which was used both by the user as a way
to "close" the connection and by the internals to delete it and to
"clean up" a TCP connection at the end of its life.
This has led to repeated gotchas where contexts die before you are
ready for them (one example: when a user callback decides the
transation is complete and calls net_context_put() underneath the
receive callback for the EOF, which then returns and tries to inspect
the now-freed memory inside the TCP internals). I've now stepped into
this mess four times now, and it's time to fix the architecture:
Swap the solitary put() call for a more conventional reference
counting implementation. The put() call now is a pure user API (and
maybe should be renamed "close" or "shutdown"). For compatibility,
it still calls unref() where appropriate (i.e. when the context can be
synchronously deleted) and the FIN processing will still do an unref()
when the FIN packets have been both transmitted and acked. The
context will start with a refcount of 1, and all TCP callbacks made on
it will increment the refcount around the callback to prevent
premature deletion.
Note that this gives the user a "destroy" mechanism for an in-progress
connection that doesn't require a network round trip. That might be
useful in some circumstances.
Change-Id: I44cb355e42941605913b2f84eb14d4eb3c134570
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
The old default 2 is too low especially if TCP is enabled.
So in order not to confuse the application developer,
increase the default number of network contexts to 6.
Change-Id: I263bb4b6f31354a11d921d94aa97214abd85ae24
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
net_addr_ntop() will convert IPv4|6 address to string form.
Renamed existing net_sprint_ip_addr_buf() to net_addr_ntop()
and adjusted parameters as per API.
Jira: ZEP-1638
Change-Id: Ia497be6bf876ca63b120529acbadcfd9162a96e3
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
This make sure the link-local address of the destination is added to the
nbr cache as that is accessed when calling net_ipv6_prepare_for_send,
this is needed when following RFC 7668 since link-local addresses are
never registered using nbr discovery.
Change-Id: I2bc578d33d1061726d0cbf46e4464df74d79e992
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
in net_print_statistics for RPL we had:
GET_STAT(rpl.dio..sent)
This wouldn't work or compile, so drop a dot.
Change-Id: Idd6b4dfd5fcae3b90bc977fe3ed301cd813ca87c
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Currently, the function accepts a struct sockaddr * but the code
immediately type casts this to either in_addr or in6_addr. This is
incorrect behavior as the first field in a sockaddr is sa_family_t
and not address data.
So without special knowledge, a developer will use a sockaddr structure
as the parameter and then wonder why the address information isn't being
set correctly.
Let's change this parameter to void * which makes this function similar
to inet_pton().
Jira: ZEP-1616
Change-Id: I1fc9368da999d90feb07c03fac55dcc749d4eba6
Signed-off-by: Michael Scott <michael.scott@linaro.org>
If the user supplied connect callback uses too much time, then
it is possible that the connect_wait semaphore will timeout
even if the TCP connection was established correctly. This issue
can be avoided if connect_cb is called after we have released
the connect_wait semaphore.
Change-Id: I175e80f2ad48de657d0d99a44340c5ee1a17364c
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Make NET_MAX_6LO_CONTEXTS depends on NET_6LO_CONTEXT, otherwise at the
moment even deselecting 6lowpan leaves NET_MAX_6LO_CONTEXTS set.
Change-Id: Iaa34d324005817be05190e203f6899ab89f89e5d
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Making NET_IPV6_DAD depends on NET_IPV6_ND instead of default fixes
issue when deselecting NET_IPV6_ND, NET_IPV6_DAD is still selected in
this case.
Change-Id: I633b1a71fb5fdcd7ecc75be80a737d8bda142b2e
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
NET_IPV6_ND is always selected by NET_ROUTE which is always selected
for NET_IPV6.
Change-Id: I316838033cccd205b24add6626521bbab5a68715
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
This permits to catch issues without the need to enable debug level.
Change-Id: Ic3c66a84be587e955d532cc321161a3ae7b5d69d
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
The cause for this change is TCP. Until now, the radio strategy driver
(ALOHA or CSMA) was providing the actual nbuf, and not the buffer
fragment, counting on the fact that the loop was using
net_buf_frag_del() which made so, iteration after iteration, buffer
framgent to be always buf->frags. The problem with this logic is loosing
the fragments that might be still referenced by TCP, in case the whole
buffer did not make it so TCP can retry later and so on.
Instead, TX now takes the nbuf and the actual frag to send. It could
have been working with just a pointer on the data, and the whole length
of the frame. But it has been avoided due to possible future devices,
that will be smarter and run CSMA directly in the hw, thus it will
require to access the whole buffer list through the nbuf.
Change-Id: I8d77b1e13b648c0ec3645cb2d55d1910d00381ea
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
The option is no longer used so it can be removed.
Use CONFIG_NET_IPV6_ND option instead.
Change-Id: Ibaa3d3deb52b8b176e85f8b9e1d8c80c1026aea1
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
ll addresses need to be set properly before sending as the stack is not
checking if they are NULL.
Change-Id: Ia4e96240f18b53b0e32e21649a8b571c94260731
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
If src and dst link layer addresses are not then 6lo fails
to compress the packet.
Change-Id: Ie2692def49f8a101194e3669dbaec00b557e14ce
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
No need to set the status to -ETIMEDOUT in connect callback
if user did not want to have a timeout when doing a TCP connect.
Change-Id: I6d6e565a8d12bcefbcd9de751e789b5e43aad244
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
A connection refused needs to be exposed to the user, otherwise the
connection will be stuck as a zombie forever.
This patch also adds a ENOTCONN check in net_context_recv() to match
the one that was already there in net_context_send().
Change-Id: I4f9ae46dd849f68ed97976add7da5daf1932cf55
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
The net_context_connect() callback was being invoked synchronously
with the transmission of the SYN packet. That's not very useful, as
it doesn't tell the user anything they can't already figure out from
the return code. Move it to the receipt of the SYNACK instead, so the
app can know that it's time to start transmitting. This matches the
Unix semantics more closely, where connect(2) is a blocking call that
wakes up only when the connection is live.
Change-Id: I11e3cca8572d51bee215274e82667e0917587a0f
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
With CONFIG_NET_DEBUG_L2_BLUETOOTH is disabled the code generate the
following warning:
subsys/net/ip/l2/bluetooth.c: In function 'eir_found':
subsys/net/ip/l2/bluetooth.c:301:16: warning: unused variable 'addr' [-Wunused-variable]
bt_addr_le_t *addr = user_data;
^
Change-Id: I1a1ca20c4f2e4fa8aa2a551d2fffa1f86874760e
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
When checking if the L2CAP channel is connected it is not enough to check
if the conn member is set since the connection may still be pending.
Change-Id: I93a2328943b0ca0e42cdb5c525b30c7cdddd1c18
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Use printk(), snprintk() instead of printf() and snprintf().
CONFIG_STDOUT_CONSOLE is anyway disabled by default so printf()
will not output anything without it.
Change-Id: I9ad778e318fe999e79ec34182f2de8574e45b7d4
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Older default value of 2 is too small for even simple uses, for
example enabling just CONFIG_NETWORKING, CONFIG_NET_IPV4,
CONFIG_NET_SLIP_TAP makes a Zephyr application hang on start up
(apparently, waiting to allocate more buffers). While value of 3
is enough to cover the above options, set new default to 4 to
accommodate configurations with IPv4/IPv6/UDP/TCP enabled.
While the new default slightly increases RAM footprint, it's
apparently better for users who are short of it to optimize it
explicitly, rather than potentially make every Zephyr beginner
wonder why enabling networking breaks applications in non-obvious
way.
Change-Id: I76e83517f0d914ce616a930c3c48ee5c52567b88
Jira: ZEP-1619
Signed-off-by: Paul Sokolovsky <paul.sokolovsky@linaro.org>
TCP states are swaped between "server" context and the new connection
context. But in any case the "server" context should loose the
information that makes it able to accept other new connections.
The swap was badly made, as the "server" context was loosing the
accept_cb (!) and the user data pointer. Instead the new connection
context was unrelevantly inheriting those.
Change-Id: Icc877449e1d4c4e59553dcbfd41718c5006edca0
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
It is useful that the user API can know whether the connection
was established properly or not. So this commit adds status
parameter to connect callback in net_context API.
The call to connect callback needs to be set properly in TCP
code. This commit does not fix the connect callback call which
is not properly done right now in net_context.c.
Change-Id: I284a60ddd658ceef9e65022e96591f467a936a09
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Wrong pool pointer was used when printing pool information during
the unref in nbuf.c. During nbuf init, wrong pool pointer was used
when printing memory pool sizes.
Change-Id: I9ed08cf7afa3c841c97ea981b97fff37aa40a984
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If the parameter "timeout" is set in net_context_connect(), the
assumption by the user is that the function would wait for SYNACK
to be received before returning to the caller.
Currently this is not the case. The timeout parameter is handed
off to net_l2_offload_ip_connect() if CONFIG_NET_L2_OFFLOAD_IP is
defined but never handled in a normal call.
To implement the timeout, let's use a semaphore to wait for
tcp_synack_received() to get a SYNACK before returning from
net_context_connect().
Change-Id: I7565550ed5545e6410b2d99c429367c1fb539970
Signed-off-by: Michael Scott <michael.scott@linaro.org>
net_context is used for more than just TCP contexts. However,
the accept_cb field is only used for TCP. Let's move it from
the generic net_context structure to the TCP specific net_tcp
structure.
Change-Id: If923c7aba1355cf5f91c07a7e7e469d385c7c365
Signed-off-by: Michael Scott <michael.scott@linaro.org>
When SYNACK is received we dont hand off the netbuf to anything
which will call net_nbuf_unref, so let's not mark it NET_OK.
Instead let the code path fall through to mark it NET_DROP.
Change-Id: I1f883e1a13c53c930bf50c07ff701e3db6f02d8a
Signed-off-by: Michael Scott <michael.scott@linaro.org>
Now that the TCP_FIN block is after a potential packet_received()
tcp->send_ack should be appropriately set to the last sequence
processed.
In the case of a TCP_FIN buffer, we should advance it by 1 or else
the destination will continue to retry to send the last block.
Change-Id: I9c97d35a87ad6cc1a50f928b237780bff4cd2877
Signed-off-by: Michael Scott <michael.scott@linaro.org>
Since we default to a return value of NET_DROP, we
can remove the automatic NET_DROP in the TCP_FIN block.
The return value will be set to NET_OK by packet_received()
if appropriate data is found which needs to be sent to
the callback.
Change-Id: Ib2634ba34440ca7053a4e98bf80f12cf6fbbd361
Signed-off-by: Michael Scott <michael.scott@linaro.org>
Buffers marked TCP_FIN may still have data attached to them
which needs to be processed and handed back to the callback.
Let's move the TCP_FIN handling to after the data processing
section now that we have a copy of the TCP flags to do this.
Change-Id: I90f53b10e393024ebffebe1837b8866764b8a7ac
Signed-off-by: Michael Scott <michael.scott@linaro.org>
buffer TCP flags can be cleared during packet_received so let's
save a copy of them for later.
Change-Id: I401e99c1ed2723dac4e86da58635b548a5645c13
Signed-off-by: Michael Scott <michael.scott@linaro.org>
Allow building the IP stack with newlib by enabling linux extensions.
Jira: ZEP-1592
Change-Id: I6714b73c7666a6f56c5203e2754ce1d7d94af0f1
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
CONFIG_STDOUT_CONSOLE is anyway disabled by default so printf() will not
output anything without it.
Change-Id: I8013e4efa5cb760215316e9413734281fb576f4d
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
When parser encouter DHCPV4_OPTIONS_END, it immediately returns NET_OK.
No need to maintain end variable here.
Coverity-CID: 157584
Change-Id: I4c8b91f37ae882845c280dab1a8204966aaac00a
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
Pointer udp will be NULL when (!(CIPHC[0] & NET_6LO_IPHC_NH_1))
condition is true.
Coverity-CID: 157588
Change-Id: I8aa1eb2e4d4aee8039631d76ad0ecc345247d6b5
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
When contex information provided and DAC bit is not set and vice versa
are invalid cases.
Coverity-CID: 157569
Change-Id: I1b798703cbbb6155a7bdf734d0fcde9ce48c409c
Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
In net_nbuf_get(), check that context pointer value is not
null before accessing data via it.
Coverity-CID: 157600
Change-Id: I7e7ea19a85f6fbef129e9ce699ea740d3be84cb8
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
If neighbor is not found, then ignore the timeout.
Coverity-CID: 157583
Change-Id: Ia2199970bd862e43901f5717025271c11c74af5e
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
We need to allocate separate fragment to store the IP
protocol headers.
Coverity-CID: 157582
Change-Id: Ib0dd5d28cd6876a0cf2de3b063c030ef64da998c
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Callback cannot be null so no need to check its value.
Coverity-CID: 157572
Change-Id: I26e4b24c41d30aa9007b78895975035e6bf8807f
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The context parameter might be NULL so we need to check
its value before accessing its content.
Coverity-CID: 157571
Change-Id: I7f75323d9d261a77421688f37a40bb44ff3ca2bd
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
The link layer dereferences a buffer right after it is transmitted.
If this extra reference is not held, the second time a buffer is
retransmitted, the reference that TCP holds when keeping the buffer in
the `sent_list` will be taken, and retransmission won't happen reliably
anymore.
As soon as the TCP fragment is acknowledged by the peer, the
`sent_list` reference is taken, and the buffer is freed.
Change-Id: Ie50f9acf02c1dff74248a5dfbec3785a91ff90f7
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
No more than 4 bits are necessary to store the state of a TCP connection,
so better pack it using bitfields so that it uses only 4 bits instead of
32, by sharing space with `retry_timeout_shift` and `flags` fields.
There are 12 (or 14, if you count the 2 unused bits in the `flags`
field) bits remaining in the same dword, but I don't know what to to
stuff there yet.
This also changes all direct field access for the `state` field to
function calls. These functions are provided as `static inline`
functions and they perform only casts, so there's no function call
overhead.
Change-Id: I0197462caa0b71b287c0773ec5cd2dd4101a4766
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
This frees up some more memory as well, by computing the maximum segment
size whenever needed. A flag is set in the TCP context to signal if
the value has been already computed.
Change-Id: Idb228d4682540f92b269e3878fcee45cbc28038a
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
This value is never set (always zero), so it's safe to remove it from
the net_tcp struct.
Change-Id: Ie4c1d90204a9834f2223b09828af42ee101bd045
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
Rename the variable to `retry_timeout_shift`, and shift-right the value
each time there's a timeout. This saves some memory in that structure
by using the holes left due to alignment.
Change-Id: I18f45d00ecc434a588758a8d331921db902f4419
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
Cancel all delayed work timers: FIN, ACK, and retry timers. Also, do
that unconditionally regardless of which state the machine is in, as
that's a no-op if the timer has not been started yet.
Change-Id: Ia36b97c6823943976447fbd6389ae04862c19ff9
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
The net_tcp struct was being cleaned up and destroyed when the
outbound FIN packet is sent on a connection that already received an
inbound FIN. That's not right, per spec we need to wait for the ACK
(though this would be benign cheating). And worse: there were code
paths which were themselves spec-compliant where the net_tcp struct
(now a NULL pointer) would be used after this spot leading to
occasional crazy behavior on socket close.
Don't do it this way. Clean up the TCP struct at the same time we
destroy the net_context. Much saner that way.
Change-Id: I4bc6b97eb0b71a7fa8faea02c1eb4c4d3bd3ae6d
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
The TCP stack inherited msot of the user_data management from UDP, but
it doesn't quite work. It's not possible to have a single pointer in
the general case, as e.g. a net_context_send() call may happen
synchronously underneath a recv callback and clobber the pointer, even
though there will be much more data coming later on the active stream.
Put a recv_user_data field into the TCP struct and use that. Long
term, it would be good to revisit this and come up with a unified
solution that works for both. There is yet another "user_data"
pointer in net_connection that seem likely to overlap too.
Change-Id: Id3a8eca64fc680e0e80b74944c4d621d7810a8fe
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
Let's drop the lladdr variable and get the link address and
length from the net_linkaddr_storage variable instead.
Change-Id: I75a5d08527cda7df102db897ade9015d39f10caf
Signed-off-by: Michael Scott <michael.scott@linaro.org>
lladdr.addr doesn't point to any storage value when it's
handed off to the net_nbuf_read function. This results
in a write to an undefined area of memory.
Fix this by pointing lladdr.addr to a net_linkaddr_storage
structure's byte storage array which can handle the maximum
specified length.
Change-Id: I05e0a0420b262ba1e5ac95cebe1f0d91f54878ce
Signed-off-by: Michael Scott <michael.scott@linaro.org>
The net_linkaddr_storage structure contains an array of bytes used
to store the link address. This array can be different sizes
depending on the CONFIG options used when building. To facilitate
consistency and error checking let's introduce a new helper function
to copy the addr and len values to this structure.
Also move all uses of memcpy related to net_link_storage structures to
the new helper function.
Change-Id: Ic547d86b07e62e5ac3bc330d4eaeb4508a143200
Signed-off-by: Michael Scott <michael.scott@linaro.org>
- Introduce NET_LINK_ADDR_MAX_LENGTH which is either 6 or 8
depending on whether CONFIG_NET_L2_IEEE802154 is used
- Instead of being a placeholder single index array of uint8_t,
let's use NET_LINK_ADDR_MAX_LENGTH to assign the size of the
"addr" array field in the net_linkaddr_storage structure.
- Now that the "addr" field of net_linkaddr_storage contains the
true size of the link address, we can remove "storage" field
which was hard coded to 8 bytes (2 uint32_t's).
- Fix 2 references to the "storage" field of the net_linkaddr_storage
structure.
Change-Id: I2ea12058280b289f65085964eb7d503d4fd260c2
Signed-off-by: Michael Scott <michael.scott@linaro.org>
Replace the existing Apache 2.0 boilerplate header with an SPDX tag
throughout the zephyr code tree. This patch was generated via a
script run over the master branch.
Also updated doc/porting/application.rst that had a dependency on
line numbers in a literal include.
Manually updated subsys/logging/sys_log.c that had a malformed
header in the original file. Also cleanup several cases that already
had a SPDX tag and we either got a duplicate or missed updating.
Jira: ZEP-1457
Change-Id: I6131a1d4ee0e58f5b938300c2d2fc77d2e69572c
Signed-off-by: David B. Kinder <david.b.kinder@intel.com>
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
Be nice and inform user about unsupported and dropped frames.
Change-Id: Iaf0e7ed660a926c45dac9fc36b788c4c786eac11
Signed-off-by: Johann Fischer <j.fischer@phytec.de>
This adds NET_REQUEST_BT_DISCONNECT which can be used to disconnect
IPSP in case it is connected.
Change-Id: I8da00b02ee08611bef5f4c0708936b2d31fd2a93
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds NET_REQUEST_BT_SCAN which can be used to scan peripherals
advertising IPSS UUID.
Change-Id: I2463079d182b4da080e6ef94d883c7c1e24a454c
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds a shell module called "net_bt" that exposes Bluetooth L2
management commands.
Change-Id: Ia6da1d38cfd51502119758a8f6abbb6d1cd31743
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Connect command can be used to initiate a connection, which in IPSP
terminology refer to a router role.
Change-Id: I12b9428924c88a9c68d3adbfe9016a0dd690aade
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Including logging/sys_log.h before net_core.h prevents SYS_LOG_LEVEL,
etc, to be set properly.
Change-Id: Iaa7aa98110aa455162836be1d9560fbfc03569df
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This decodes the event layer, code and type when debugging is enabled.
Change-Id: I23c6fb200f3287a138e46df9f472c9982898675d
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net_context_put() forgot to release the conn_handler field causing
subsequent failures in net_conn_register() when they ran out.
Change-Id: I0d306b5035199422fa8788338ac9da8d1900d5f9
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
TCP didn't actually have a way to signal synchronous receipt of a FIN
packet. Extend the recv_cb API to allow a NULL buf argument with
status==0 (by analogy to Unix's zero-length read) to signal EOF.
Update docs too, and also echo_server which wasn't prepared to handle
this situation.
Change-Id: I7dc08f9e262a81dcad9c670c6471898889f0b05d
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
In icmpv4, after calling setup_ipv4_header() function,
only calculate ICMP chksum, not calculate ipv4 header chksum,
ipv4 header chksum still 0, the other side will drop this pack.
Change-Id: I1550a4c8c7ab63132d70ba6ce19a7caf78ad84e6
Signed-off-by: li zj <279939902@qq.com>
When router receive dhcpv4 request with ciaddr not 0.0.0.0,
some router reply NAK, dhcpv4 never successful.
Change-Id: I4b66b18f7d30ad5a1b638fdca0bb204ed078d551
Signed-off-by: li zj <279939902@qq.com>
The tcp_synack_received() function ends with a call to send_ack().
However, if we don't update the sequence and ACK values, we'll send back
headers with 0 values and the destination will try resending over and
over.
Fix this by saving the seq and ack values when a TCP_SYN is flagged
in the header (which should be the case almost any time this function
is used as a callback).
Change-Id: I57f07ce719f2b6e2fb34c96c867d2e1c37f342ba
Signed-off-by: Michael Scott <michael.scott@linaro.org>
Once SYNACK has been received for a TCP connection, we need to set the
net context state to NET_CONTEXT_CONNECTED or else calls to sendto()
will fail with -ENOTCONN.
Change-Id: Idd78e1dcdd5ac0bca5d3fba40b59ab8fde6b8729
Signed-off-by: Michael Scott <michael.scott@linaro.org>
When calling net_context_connect, the local address family
is never set prior to calling net_tcp_register. This generates
an error:
"Local address family not set." (-EINVAL)
Let's set the local address family prior to this call.
Change-Id: Ic5f2edf684d14f9bb77019c49c95e5524a406417
Signed-off-by: Michael Scott <michael.scott@linaro.org>
When TCP SYNACK is received we register the connection via the
net_tcp_register function. During this call several errors are
generated concerning local and remote address information not
being set.
Let's copy the local and remote address data prior to this call.
Change-Id: I17cd83f7b4b7e65e45fec1810fb38f745653bdc7
Signed-off-by: Michael Scott <michael.scott@linaro.org>
In other portions of the code we use the sys_put_be* function
to shift the values from the current system endian to big
endian array of bytes. Let's be consistent and do that in
the prepare_segment function as well.
Change-Id: I5a1a4c30ddf313c9e978be98fd969899f5de6190
Signed-off-by: Michael Scott <michael.scott@linaro.org>
The NET_SLIP Kconfig choice option doesn't really do anything for us,
plus we get warnings related to setting CONFIG_NET_SLIP=y in prj.conf
files.
Warnings like:
warning: override: reassigning to symbol NET_SLIP
warning: override: NET_SLIP_TAP changes choice state
So remove NET_SLIP choice and remove CONFIG_NET_SLIP=y in the prj.conf
files.
Change-Id: Ibccf9cf167f4c8a4df480ca0396bf83fcf60df1e
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
In commit bf4fb51f44, "net: if: Add NET_IF_UP flag"
a reference to ctxt->iface was added in the ipsp_disconnected function.
Let's add the ctxt variable definition to fix the build break.
Change-Id: Ib06047e333504f3db4fe175fb3ef1dce347e1916
Signed-off-by: Michael Scott <michael.scott@linaro.org>
If the length of all fragments is used instead, the TCP header is also
considered; sequence numbers do not consider the header.
Change-Id: I19e77ac0fe62ca619b0903dd0265f8ea4878cdf7
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
The net_buf_frags_len() function returns a size_t, which is an unsigned
integer. Store on an appropriate size_t variable instead.
Change-Id: I98aa4c0ddd7c464737436aa9ce13bdc86c11da2b
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
TCP packets need the computed packet length early so they can fill in
a correct sequence number in their generated ACKs. Waiting for
packet_received() is too late. Precompute it before needed, and skip
the evaluation later.
Change-Id: I25547009f88277e0042c74f2005a141819797886
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
On accepting a new connection, the stack does an odd "swap" trick
where it updates the struct net_tcp record on the *listening* context
with the values from the new connection, and then swaps it with the
empty one that got allocated for the *new* context.
Unfortunately this swap forgot to swap the net_tcp "context" field
backpointers, so the net_context retrieved at runtime was for the
wrong connection. Surprisingly, this actually almost worked for a
long time, except that the destination address would be wrong in the
newer setup.
Change-Id: I0c1812ddb9f9ff3e7deb60d1fd67cafd9ba96997
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
The source address for a TCP SYNACK must (obviously) be the same as
the destination address of the SYN that produced it. But the existing
IP packet creation routines would simply fill in a default address
from the net_context struct, which is correct for *established*
connections, but for the listening socket is generally INADDR_ANY
(i.e. all zeroes) and will result in an arbitrary choice for source
address (e.g. a link-local address on the same interface) which can
easily be wrong.
So we need to pass the correct address all the way down from the SYN
packet handler code through the net_ipv*_create() packet creation
functions. This requires lots of API plumbing, but relatively little
logic change.
Change-Id: Ic368f8cef6689f8a27cbafd5933a4964d5cc457e
Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
This one exposes IEEE 802.15.4 net mgmt requests through the shell. User
has then the ability to directly make relevant requests like raising a
scan, associating, etc...
For now, it assumes the 15.4 interface is the only one on the system and
thus will rely on net_if_get_default().
Change-Id: I8eb20565b8231e6cfcba6c1479179cc85ff1d8e5
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
It is then possible to set the channel, pan_id and short address through
this API. Such features are mainly useful for testing purposes.
Change-Id: I41aeb397afdb231458a3b13638f3e13d3ac28a6c
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This commit adds one routine previously found at the DNS resolver
library. The net_nbuf_linear_copy routine allows to "linearize"
an IP stack network buffer. This routine is required by functions
that must jump between big chunks of data that in this case may
lie between many fragments. Tracking fragments may be a tedious
task, so getting a linear copy of the buffer will reduce code
complexity altough it increases memory consumption.
The DNS client library is updated to reflect these changes.
Change-Id: Iae321f99fa9b05fae7e722b6d41baac427d82d7e
Signed-off-by: Flavio Santes <flavio.santes@intel.com>
PAN coordinator can decide to eject a client device from the PAN by
disassocating it.
Change-Id: Ia868554d40a7aceb4c75a0b426db45f56003fbb7
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
If associated, this will request to disassociate from the PAN. That's
only client side, PAN coordinator can also disassociate a client, which
case is not handled here.
Change-Id: If308f51b62c5006b4a2db53d0c891e8192f3c198
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Active scan differs from passive scan by sending a Beacon request (thus
the "active" part) and wait for beacons in reply to it.
Taking the opportunity to add debugging output to scanning logic.
Change-Id: I85001b1ea17f4ec4cd315dc39524c4d8f053cee2
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Now we can handle incoming MAC command frames.
Association result ONLY for now.
Change-Id: Ib54b1757185ed079fe6914fa7939347020e006d9
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Such management request will enable association the 15.4 device to an
existing PAN.
Change-Id: I61ffd5e4d8192716e067c5225b3327f08944063b
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This is used only for scanning at this point. But will be needed to get
slots information and else in the future.
Change-Id: Ib917469134c6ba5a54485847c612d3755f62ed35
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Currently, as only CC2520 device is supported: it will loop over the 16
channels present in 2.4Ghz spectrum. However, this will need refinement
as soon as other spectrums will be in use: L2 layer could request
capabilites from the device in order to know which range to use.
Scan result is done one at a time for now. It's unlikely going to fit
all production use case, so it's going to change in the future.
Change-Id: I2fafec49eb5cbfca1a4f04107ba3b6511d7d956d
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
It can be thus used to track the status of network interfaces in order
to act accordingly (no need to try sending things on network if the
interface is down for instance).
Change-Id: Ie160ef0dfdad6679d531d05a7abada96ad1de7db
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This adds enable callback which can be used to notify the L2 driver about
changes of interface state, the L2 driver can then check if the new state
is allowed and reject otherwise.
Change-Id: I4bb6b1e32be2633f24694c0246585f803f8c645d
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds NET_IF_UP flag support indicating the interface is up,
currently this shall only be used internally by the driver, later on it
shall be possible to make it public by using dedicated functions.
Change-Id: I38090da4030395b2341733b846004789416d61c1
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
And it's not really a debugging option either, one might want to use it
for the features it brings. Thus moving it out of Kconfig.debug.
Change-Id: Ie1e2d2bcba94ad4b8354d3cc56087227184039b6
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Let's make net stack having its own level of debugging through sys_log.
It replaces NET_DEBUG by NET_LOG_ENABLED, which is then semantically
better: someone wanting to log the errors might want that not only for
debugging.
Along with it, CONFIG_NET_LOG_GLOBAL option is added, in order to enable
all available logging in network stack. It is disabled by default but
might be found useful when warning/errors need to be logged, so it is
then unnecessary to selectively enable by hand all CONFIG_NET_DEBUG_*
options.
It is possible, locally, to override CONFIG_SYS_LOG_NET_LEVEL by setting
the level one want to NET_SYS_LOG_LEVEL. This can be useful on samples
or tests.
Change-Id: I56a8f052340bc3a932229963cc69b39912093b88
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
It's possible to know from which pool the nbuf comes from so
let's reduce nbuf size by removing its internal type attribute which
becomes then useless.
When a data buffer is not coming from nbuf data buffer pool, let's call
it "EXTERNAL", just to make debugging handling a little simple in the
code.
Change-Id: I6931394c8c4f594137f6380be0a0ba5cea371040
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Use the interface function rather than writing directly to the iface
structure. Check for errors in nbuf read.
Change-Id: I75311755c2060b640325962ada28adea597cb914
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Detect non local IPv4 destination addresses earlier and route them via
the gw address. Ensure that the ARP table is populated with the GW
address rather than the final destination address.
Jira: ZEP-1473
Change-Id: I3b628584148b760340ef0fea4da4e8893702c832
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
s/energy_est/estimation when using net_rpl_node_energy_object.
Change-Id: I4b326a0dbbca11d48de0c595dfe843495fe10e04
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
It's much different than IPv4 where it's possible to find the whole
packet length. Here it has to count also the ipv6 header size by itself.
Jira: ZEP-1422
Change-Id: I84b1602ac75ef81b9ceda7898ca9dedf2e54d633
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
User application can request the information it wants via the generic
net_mgmt() call, following the NET_REQUEST_STATS_* codes.
Change-Id: Ia9e7d318cf11b7bf8bfaf1ad63c8c985be846cc1
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This will help to track only what's wanted (ipv6, tpc, udp, else...) if
needed to.
Change-Id: I5c2e5e582db629b5d0e1cd98004f693c50f532a4
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Let's change from macros to inlined function to make things nicer.
Change-Id: Ie98e0667613961b03c84ca60bc551d0f473765f6
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This file will own more statistics handling in a near future.
Change-Id: Ifaf86852f5c7166e6878b5dc8f4cd4c166dbee90
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
printk is anyway the routine being selected for sys_log.
Change-Id: Id6b516aa6ab8d4d420b9afe22b5e6b832dd3e216
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This moves the shell component into its own subsys and groups all
related files and options into a single place.
Additionally, one Kconfig option will now be required to enable the
shell:
CONFIG_CONSOLE_SHELL=y
The header files was also moved to include/shell/shell.h and can be now
referenced with
#include <shell/shell.h>
instead of
#include <misc/shell.h>
Updated documentation as well.
Change-Id: Iffbba4acfa05408055e9fd28dffa213451351f94
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Use size_t instead of int to avoid compiler warnings.
Change-Id: I86f804010a7bd0387299648f8c2c0f880f19f580
Signed-off-by: Flavio Santes <flavio.santes@intel.com>
This patch adds the ARG_UNUSED macros to some function arguments
to avoid compiler warnings.
Change-Id: Iae2cd3018c9442ffa9268fdfd33eb9a21f55087c
Signed-off-by: Flavio Santes <flavio.santes@intel.com>
Also remove mentions of unified kernel in various places in the kernel,
samples and documentation.
Change-Id: Ice43bc73badbe7e14bae40fd6f2a302f6528a77d
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Move logging out of misc/ to its own subsystem. Anything related to
logging and any new logging features or backends could be added here
instead of the generic location in misc/ which is overcrowded with
options that are not related to eachother.
Jira: ZEP-1467
Change-Id: If6a3ea625c3a3562a7a61a0ba5fd7e6ca75518ba
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
After commit 71c7c01819 about buf pool, we
started to get spurious behaviors on various places of the code on
different boards (a101, frdm...) BUT on qemu. Basically, outgoing ip/udp
packets were full of garbage. Or sometimes it was the abilitty to parse
incoming packet that was happening.
The difference between qemu and actualy boards is - afaik, at least, let
me know if I am wrong - that qemu provide initialized memory (full of
0s). Following this asssumption, this patch just reset the nbuf right
after it got allocated. And all started to work again as thought.
It's in fact a good thing to reset nbuf memory. Even before the above
commit: after being used more than once, a buffer would have ended up
with old content, and this could have been generating a bug. So let's be
on the safe side and always intialize nbuf content.
Change-Id: I50647d9e9b82a4ed340a5ceb0d69409b0194dddd
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Minimal frame size is 60 bytes, but IP frame might be smaller than this
size minus the ethernet header. In that case, Ethernet frames are padded
so it does reach this minimal size. In this case, ethernet L2 should
update the buffer list so it remove the padding length from the whole.
Change-Id: Id370cad09ad82bb54febeb60b05f7e430cc8f963
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
net_buf_put already awakes the RX thread so k_wakeup is not necessary.
Change-Id: I18b5aef5d6e85a9461bc01c17f56c3d4d9a13824
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Validate the return code of net_context_put and add debug information
in case any error is detected.
This patch fixes the error reported by Coverity:
Error handling issues (CHECKED_RETURN)
Calling "net_context_put" without checking return value
(as is done elsewhere 4 out of 5 times).
Coverity-CID: 157833
Change-Id: Ia4a87cc08094bee465c8828411d7c1311481695a
Signed-off-by: Flavio Santes <flavio.santes@intel.com>
Moved all libc Kconfigs to where the code is and remove the default
Kconfig for selecting the minimal libc. Minimal libc is now the default
if nothing else is configured in.
Removed the options for extended libc, this obviously was restricting
features in the minimal libc without a good reason, most of the
functions are available directly when using newlib, so there is no
reason why we need to restrict those in minimal libc.
Jira: ZEP-1440
Change-Id: If0a3adf4314e2ebdf0e139dee3eb4f47ce07aa89
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
Following commit fc21a76db6
Some more fixes are needed.
Change-Id: I19c2c979d44be5edfd76041d3cf4507860795c78
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Since the user data size is now stored in the pool there's very little
value in storing it as well per-buffer.
Change-Id: I17a99123b232423c52a2179b4eccd813728d51b1
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
In order to keep the initialization process light-weight, remove
net_buf_pool_init() and instead perform the initialization of the pool
and buffers in a "lazy" manner. This means storing more information
in the pool, and removing any 'const' members from net_buf. Since
there are no more const members in net_buf the buffer array can be
declared with __noinit, which further reduces initialization overhead.
Change-Id: Ia126af101c2727c130651b697dcba99d159a1c76
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This is only for use with custom destroy callbacks, so that the
application gets isolated away from the details of how exactly the
buffers are managed. This opens up the possibility of switching away
from k_fifo to potentially better solutions, such as k_lifo.
Change-Id: I0d8322fdec3500d8ae060ae471b9448aeaa4572a
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
That bug never got caught because the buffer in unit test is always
clean and fully initialized to 0, and that part of the code being
tested is never used in real as the ACK reply is directly made by the
chip.
Change-Id: I88c4dd3767b4addf2250165b94f49fae29d322ea
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Until now it has been necessary to separately define a k_fifo and
an array of buffers when creating net_buf pools. This has been a bit
of an inconvenience as well as blurred the line of what exactly
constitutes the "pool".
This patch removes the NET_BUF_POOL() macro and replaces it with a
NET_BUF_POOL_DEFINE() macro that internally expands into the buffer
array and new net_buf_pool struct with a given name:
NET_BUF_POOL_DEFINE(pool_name, ...);
Having a dedicated context struct for the pool has the added benefit
that we can start moving there net_buf members that have the same
value for all buffers from the same pool. The first such member that
gets moved is the destroy callback, thus shrinking net_buf by four
bytes. Another potential candidate is the user_data_size, however
right not that's left out since it would just leave 2 bytes of padding
in net_buf (i.e. not influence its size). Another common value is
buf->size, however that one is also used by net_buf_simple and can
therefore not be moved.
This patch also splits getting buffers from a FIFO and allocating a
new buffer from a pool into two separate APIs: net_buf_get and
net_buf_alloc, thus simplifying the APIs and their usage. There is no
separate 'reserve_head' parameter anymore when allocating, rather the
user is expected to call net_buf_reserve() afterwards if something
else than 0 headroom is desired.
Change-Id: Id91b1e5c2be2deb1274dde47f5edebfe29af383a
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Fix compilation issues that show up if SYS_LOG is mapped to printk
instead of printf. Unlike printf, printk is annotated so that the
compiler catches incorrect format specifiers passed to it.
Change-Id: Iab7cc6da110e9c98720211a6f773dcf055a3a411
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Structures attribute need to be ordered according to endianness.
Change-Id: Ib3053728cbc49e54631057c779aba0f16aace283
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
* Moved networking code into subsys/net.
* Renamed net/yaip to net/ip at the same time.
* Fixed the tests/net to compile
* Fixed the Makefiles and Kconfig files in subsys/net
to use the new location of the IP stack
Change-Id: Ie45d9e8cb45a93fefdf969b20a81e3b1d3c16355
Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>