net: Process received ICMPv4 messages
Call ICMPv4 handler when receiving ICMP v4 packet. Currently only echo-request msg is handled. Change-Id: Ib59c65b38f13c484f1842485118dad32fb6a6f36 Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit is contained in:
parent
0cd6742f00
commit
b6a7648569
7 changed files with 155 additions and 7 deletions
|
@ -44,6 +44,7 @@ extern "C" {
|
|||
|
||||
/** Protocol numbers from IANA */
|
||||
enum ip_protocol {
|
||||
IPPROTO_ICMP = 1,
|
||||
IPPROTO_TCP = 6,
|
||||
IPPROTO_UDP = 17,
|
||||
IPPROTO_ICMPV6 = 58,
|
||||
|
|
|
@ -141,13 +141,6 @@ config NETWORK_IP_STACK_DEBUG_ICMPV6
|
|||
help
|
||||
Enables ICMPv6 code part to output debug messages
|
||||
|
||||
config NETWORK_IP_STACK_DEBUG_ICMPV6
|
||||
bool "Debug ICMPv6"
|
||||
depends on NET_IPV6
|
||||
default n
|
||||
help
|
||||
Enables ICMPv6 code part to output debug messages
|
||||
|
||||
config NETWORK_IP_STACK_DEBUG_ICMPV4
|
||||
bool "Debug ICMPv4"
|
||||
depends on NET_IPV4
|
||||
|
|
|
@ -6,3 +6,4 @@ obj-y = net_core.o \
|
|||
utils.o
|
||||
|
||||
obj-$(CONFIG_NET_IPV6) += icmpv6.o
|
||||
obj-$(CONFIG_NET_IPV4) += icmpv4.o
|
||||
|
|
87
net/yaip/icmpv4.c
Normal file
87
net/yaip/icmpv4.c
Normal file
|
@ -0,0 +1,87 @@
|
|||
/** @file
|
||||
* @brief ICMPv4 related functions
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_NETWORK_IP_STACK_DEBUG_ICMPV4
|
||||
#define SYS_LOG_DOMAIN "net/icmpv4"
|
||||
#define NET_DEBUG 1
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <misc/slist.h>
|
||||
#include <net/net_core.h>
|
||||
#include <net/nbuf.h>
|
||||
#include <net/net_if.h>
|
||||
#include <net/net_stats.h>
|
||||
#include "net_private.h"
|
||||
#include "icmpv4.h"
|
||||
|
||||
static inline enum net_verdict handle_echo_request(struct net_buf *buf)
|
||||
{
|
||||
/* Note that we send the same data buffers back and just swap
|
||||
* the addresses etc.
|
||||
*/
|
||||
struct in_addr addr;
|
||||
|
||||
#if NET_DEBUG > 0
|
||||
char out[sizeof("xxx.xxx.xxx.xxx")];
|
||||
|
||||
snprintf(out, sizeof(out),
|
||||
net_sprint_ipv4_addr(&NET_IPV4_BUF(buf)->dst));
|
||||
NET_DBG("Received Echo Request from %s to %s",
|
||||
net_sprint_ipv4_addr(&NET_IPV4_BUF(buf)->src), out);
|
||||
#endif /* NET_DEBUG > 0 */
|
||||
|
||||
net_ipaddr_copy(&addr, &NET_IPV4_BUF(buf)->src);
|
||||
net_ipaddr_copy(&NET_IPV4_BUF(buf)->src,
|
||||
&NET_IPV4_BUF(buf)->dst);
|
||||
net_ipaddr_copy(&NET_IPV4_BUF(buf)->dst, &addr);
|
||||
|
||||
NET_ICMP_BUF(buf)->type = NET_ICMPV4_ECHO_REPLY;
|
||||
NET_ICMP_BUF(buf)->code = 0;
|
||||
NET_ICMP_BUF(buf)->chksum = 0;
|
||||
NET_ICMP_BUF(buf)->chksum = ~net_calc_chksum_icmpv4(buf);
|
||||
|
||||
#if NET_DEBUG > 0
|
||||
snprintf(out, sizeof(out),
|
||||
net_sprint_ipv4_addr(&NET_IPV4_BUF(buf)->dst));
|
||||
NET_DBG("Sending Echo Reply from %s to %s",
|
||||
net_sprint_ipv4_addr(&NET_IPV4_BUF(buf)->src), out);
|
||||
#endif /* NET_DEBUG > 0 */
|
||||
|
||||
if (net_send_data(buf) < 0) {
|
||||
NET_STATS(++net_stats.icmp.drop);
|
||||
return NET_DROP;
|
||||
}
|
||||
|
||||
NET_STATS(++net_stats.icmp.sent);
|
||||
|
||||
return NET_OK;
|
||||
}
|
||||
|
||||
enum net_verdict net_icmpv4_input(struct net_buf *buf, uint16_t len,
|
||||
uint8_t type, uint8_t code)
|
||||
{
|
||||
switch (type) {
|
||||
case NET_ICMPV4_ECHO_REQUEST:
|
||||
return handle_echo_request(buf);
|
||||
}
|
||||
|
||||
return NET_DROP;
|
||||
}
|
37
net/yaip/icmpv4.h
Normal file
37
net/yaip/icmpv4.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
/** @file
|
||||
@brief ICMPv4 handler
|
||||
|
||||
This is not to be included by the application.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Intel Corporation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef __ICMPV4_H
|
||||
#define __ICMPV4_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <net/net_ip.h>
|
||||
#include <net/nbuf.h>
|
||||
|
||||
#define NET_ICMPV4_ECHO_REQUEST 8
|
||||
#define NET_ICMPV4_ECHO_REPLY 0
|
||||
|
||||
enum net_verdict net_icmpv4_input(struct net_buf *buf, uint16_t len,
|
||||
uint8_t type, uint8_t code);
|
||||
|
||||
#endif /* __ICMPV4_H */
|
|
@ -45,6 +45,10 @@
|
|||
#include "icmpv6.h"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_NET_IPV4)
|
||||
#include "icmpv4.h"
|
||||
#endif
|
||||
|
||||
/* Stack for the rx fiber.
|
||||
*/
|
||||
#if !defined(CONFIG_NET_RX_STACK_SIZE)
|
||||
|
@ -205,6 +209,20 @@ drop:
|
|||
}
|
||||
#endif /* CONFIG_NET_IPV6 */
|
||||
|
||||
#if defined(CONFIG_NET_IPV4)
|
||||
static inline enum net_verdict process_icmpv4_pkt(struct net_buf *buf,
|
||||
struct net_ipv4_hdr *ipv4)
|
||||
{
|
||||
struct net_icmp_hdr *hdr = NET_ICMP_BUF(buf);
|
||||
uint16_t len = (ipv4->len[0] << 8) + ipv4->len[1];
|
||||
|
||||
NET_DBG("ICMPv4 packet received length %d type %d code %d",
|
||||
len, hdr->type, hdr->code);
|
||||
|
||||
return net_icmpv4_input(buf, len, hdr->type, hdr->code);
|
||||
}
|
||||
#endif /* CONFIG_NET_IPV4 */
|
||||
|
||||
#if defined(CONFIG_NET_IPV4)
|
||||
static inline enum net_verdict process_ipv4_pkt(struct net_buf *buf)
|
||||
{
|
||||
|
@ -238,6 +256,12 @@ static inline enum net_verdict process_ipv4_pkt(struct net_buf *buf)
|
|||
goto drop;
|
||||
}
|
||||
|
||||
switch (hdr->proto) {
|
||||
case IPPROTO_ICMP:
|
||||
net_nbuf_ip_hdr_len(buf) = sizeof(struct net_ipv4_hdr);
|
||||
return process_icmpv4_pkt(buf, hdr);
|
||||
}
|
||||
|
||||
drop:
|
||||
return NET_DROP;
|
||||
}
|
||||
|
|
|
@ -38,6 +38,11 @@ static inline uint16_t net_calc_chksum_icmpv6(struct net_buf *buf)
|
|||
return net_calc_chksum(buf, IPPROTO_ICMPV6);
|
||||
}
|
||||
|
||||
static inline uint16_t net_calc_chksum_icmpv4(struct net_buf *buf)
|
||||
{
|
||||
return net_calc_chksum(buf, IPPROTO_ICMP);
|
||||
}
|
||||
|
||||
#if NET_DEBUG > 0
|
||||
static inline char *net_sprint_ll_addr(uint8_t *ll, uint8_t ll_len)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue