summaryrefslogtreecommitdiff
path: root/samples
diff options
context:
space:
mode:
authorMichael Scott <michael.scott@linaro.org>2017-01-24 23:20:59 -0800
committerJukka Rissanen <jukka.rissanen@linux.intel.com>2017-02-03 15:59:17 +0200
commit2f10b314312db04450bc6e45247d0b2f6dab35d7 (patch)
treef5232c899116da5ea14b8c0e1fe338fd7bd2f20c /samples
parent8a7e30609a605881be5a4fdbf040948da2eb0535 (diff)
samples: net: irc_bot: add IPv4 support
NOTE: You must set CONFIG_NET_IPV6=n in the project .conf file for the CONFIG_NET_IPV4 setting to take effect. Only 1 IP connection is active at a time. And when both are active CONFIG_NET_IPV6 takes precedence. Change-Id: I34a75f8d44db986810648d82a65d2ed29fc9a940 Signed-off-by: Michael Scott <michael.scott@linaro.org>
Diffstat (limited to 'samples')
-rw-r--r--samples/net/irc_bot/prj_frdm_k64f.conf6
-rw-r--r--samples/net/irc_bot/prj_qemu_x86.conf6
-rw-r--r--samples/net/irc_bot/src/irc-bot.c86
3 files changed, 78 insertions, 20 deletions
diff --git a/samples/net/irc_bot/prj_frdm_k64f.conf b/samples/net/irc_bot/prj_frdm_k64f.conf
index d1db2e1ca..a707c514e 100644
--- a/samples/net/irc_bot/prj_frdm_k64f.conf
+++ b/samples/net/irc_bot/prj_frdm_k64f.conf
@@ -3,8 +3,10 @@ CONFIG_INIT_STACKS=y
CONFIG_NET_LOG=y
CONFIG_NET_LOG_ENABLED=y
CONFIG_SYS_LOG_NET_LEVEL=2
-CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT=3
+CONFIG_NET_IPV4=y
+CONFIG_NET_IF_UNICAST_IPV4_ADDR_COUNT=3
CONFIG_NET_IPV6=y
+CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT=3
CONFIG_NET_MAX_CONTEXTS=10
CONFIG_NET_NBUF_DATA_COUNT=30
CONFIG_NET_NBUF_RX_COUNT=14
@@ -20,6 +22,8 @@ CONFIG_SYS_LOG_SHOW_COLOR=y
CONFIG_NET_SAMPLES_IP_ADDRESSES=y
CONFIG_NET_SAMPLES_MY_IPV6_ADDR="2001:db8::1"
CONFIG_NET_SAMPLES_PEER_IPV6_ADDR="2001:db8::2"
+CONFIG_NET_SAMPLES_MY_IPV4_ADDR="192.168.0.1"
+CONFIG_NET_SAMPLES_PEER_IPV4_ADDR="192.168.0.2"
CONFIG_NET_L2_ETHERNET=y
diff --git a/samples/net/irc_bot/prj_qemu_x86.conf b/samples/net/irc_bot/prj_qemu_x86.conf
index c6713b0bc..f78d34f1e 100644
--- a/samples/net/irc_bot/prj_qemu_x86.conf
+++ b/samples/net/irc_bot/prj_qemu_x86.conf
@@ -2,8 +2,10 @@ CONFIG_INIT_STACKS=y
CONFIG_NET_LOG_ENABLED=y
CONFIG_SYS_LOG_NET_LEVEL=2
-CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT=3
+CONFIG_NET_IPV4=y
+CONFIG_NET_IF_UNICAST_IPV4_ADDR_COUNT=3
CONFIG_NET_IPV6=y
+CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT=3
CONFIG_NET_LOG=y
CONFIG_NET_MAX_CONTEXTS=10
CONFIG_NET_NBUF_DATA_COUNT=30
@@ -21,5 +23,7 @@ CONFIG_SYS_LOG_SHOW_COLOR=y
CONFIG_NET_SAMPLES_IP_ADDRESSES=y
CONFIG_NET_SAMPLES_MY_IPV6_ADDR="2001:db8::1"
CONFIG_NET_SAMPLES_PEER_IPV6_ADDR="2001:db8::2"
+CONFIG_NET_SAMPLES_MY_IPV4_ADDR="192.168.0.1"
+CONFIG_NET_SAMPLES_PEER_IPV4_ADDR="192.168.0.2"
CONFIG_TEST_RANDOM_GENERATOR=y
diff --git a/samples/net/irc_bot/src/irc-bot.c b/samples/net/irc_bot/src/irc-bot.c
index dbdc36c75..09b043023 100644
--- a/samples/net/irc_bot/src/irc-bot.c
+++ b/samples/net/irc_bot/src/irc-bot.c
@@ -31,6 +31,10 @@
#include <stdio.h>
#include <zephyr.h>
+#if !defined(CONFIG_NET_IPV6) && !defined(CONFIG_NET_IPV4)
+#error "CONFIG_NET_IPV6 or CONFIG_NET_IPV4 must be enabled for irc_bot"
+#endif
+
#define STACK_SIZE 2048
uint8_t stack[STACK_SIZE];
@@ -49,15 +53,44 @@ static uint8_t cmd_buf[CMD_BUFFER_SIZE];
static struct device *led0;
static bool fake_led;
-/* Network */
-#if !defined(CONFIG_NET_SAMPLES_MY_IPV6_ADDR)
-#define CONFIG_NET_SAMPLES_MY_IPV6_ADDR "2001:db8::1"
+/* Network Config */
+
+#if defined(CONFIG_NET_IPV6)
+
+#define ZIRC_AF_INET AF_INET6
+#define ZIRC_SOCKADDR_IN sockaddr_in6
+
+#if defined(CONFIG_NET_SAMPLES_MY_IPV6_ADDR)
+#define ZIRC_LOCAL_IP_ADDR CONFIG_NET_SAMPLES_MY_IPV6_ADDR
+#else
+#define ZIRC_LOCAL_IP_ADDR "2001:db8::1"
#endif /* CONFIG_NET_SAMPLES_MY_IPV6_ADDR */
-#if !defined(CONFIG_NET_SAMPLES_PEER_IPV6_ADDR)
-#define CONFIG_NET_SAMPLES_PEER_IPV6_ADDR "2001:db8::2"
+#if defined(CONFIG_NET_SAMPLES_PEER_IPV6_ADDR)
+#define ZIRC_PEER_IP_ADDR CONFIG_NET_SAMPLES_PEER_IPV6_ADDR
+#else
+#define ZIRC_PEER_IP_ADDR "2001:db8::2"
#endif /* CONFIG_NET_SAMPLES_PEER_IPV6_ADDR */
+#else /* CONFIG_NET_IPV4 */
+
+#define ZIRC_AF_INET AF_INET
+#define ZIRC_SOCKADDR_IN sockaddr_in
+
+#if defined(CONFIG_NET_SAMPLES_MY_IPV4_ADDR)
+#define ZIRC_LOCAL_IP_ADDR CONFIG_NET_SAMPLES_MY_IPV4_ADDR
+#else
+#define ZIRC_LOCAL_IP_ADDR "192.168.0.1"
+#endif /* CONFIG_NET_SAMPLES_MY_IPV4_ADDR */
+
+#if defined(CONFIG_NET_SAMPLES_PEER_IPV4_ADDR)
+#define ZIRC_PEER_IP_ADDR CONFIG_NET_SAMPLES_PEER_IPV4_ADDR
+#else
+#define ZIRC_PEER_IP_ADDR "192.168.0.2"
+#endif /* CONFIG_NET_SAMPLES_PEER_IPV4_ADDR */
+
+#endif
+
/* IRC API */
#define DEFAULT_SERVER "irc.freenode.net"
#define DEFAULT_PORT 6667
@@ -434,6 +467,7 @@ static int
zirc_connect(struct zirc *irc, const char *host, int port, void *data)
{
/* TODO: DNS lookup for host */
+ struct net_if *iface;
struct sockaddr dst_addr, src_addr;
struct zirc_chan *chan;
int ret;
@@ -441,27 +475,33 @@ zirc_connect(struct zirc *irc, const char *host, int port, void *data)
NET_INFO("Connecting to %s:%d...", host, port);
- ret = net_context_get(AF_INET6, SOCK_STREAM, IPPROTO_TCP,
+ ret = net_context_get(ZIRC_AF_INET, SOCK_STREAM, IPPROTO_TCP,
&irc->conn);
if (ret < 0) {
NET_DBG("Could not get new context: %d", -ret);
return ret;
}
- ret = in_addr_set(AF_INET6, CONFIG_NET_SAMPLES_PEER_IPV6_ADDR,
- port, &dst_addr);
+ iface = net_if_get_default();
+ if (!iface) {
+ NET_DBG("Could not get new context: %d", -ret);
+ return -EIO;
+ }
+
+ ret = in_addr_set(ZIRC_AF_INET, ZIRC_LOCAL_IP_ADDR,
+ 0, &src_addr);
if (ret < 0) {
goto connect_exit;
}
- ret = in_addr_set(AF_INET6, CONFIG_NET_SAMPLES_MY_IPV6_ADDR,
- 0, &src_addr);
+ ret = in_addr_set(ZIRC_AF_INET, ZIRC_PEER_IP_ADDR,
+ port, &dst_addr);
if (ret < 0) {
goto connect_exit;
}
ret = net_context_bind(irc->conn, &src_addr,
- sizeof(struct sockaddr_in6));
+ sizeof(struct ZIRC_SOCKADDR_IN));
if (ret < 0) {
NET_DBG("Could not bind to local address: %d", -ret);
goto connect_exit;
@@ -470,7 +510,7 @@ zirc_connect(struct zirc *irc, const char *host, int port, void *data)
irc->data = data;
ret = net_context_connect(irc->conn, &dst_addr,
- sizeof(struct sockaddr_in6),
+ sizeof(struct ZIRC_SOCKADDR_IN),
NULL, K_FOREVER, irc);
if (ret < 0) {
NET_DBG("Could not connect, errno %d", -ret);
@@ -735,6 +775,7 @@ on_msg_rcvd(void *data, struct zirc_chan *chan, char *umask, char *msg)
static void
initialize_network(void)
{
+ struct net_if *iface;
struct sockaddr addr;
/* TODO: use DHCP here, watch NET_EVENT_IF_UP, zirc_connect() when
@@ -743,17 +784,26 @@ initialize_network(void)
NET_INFO("Initializing network");
-#if defined(CONFIG_NET_SAMPLES_MY_IPV6_ADDR)
- if (in_addr_set(AF_INET6, CONFIG_NET_SAMPLES_MY_IPV6_ADDR, 0,
+ iface = net_if_get_default();
+ if (!iface) {
+ panic("No default network interface");
+ }
+
+ if (in_addr_set(ZIRC_AF_INET, ZIRC_LOCAL_IP_ADDR, 0,
&addr) < 0) {
- NET_ERR("Invalid IPv6 address: %s",
- CONFIG_NET_SAMPLES_MY_IPV6_ADDR);
+ NET_ERR("Invalid IP address: %s",
+ ZIRC_LOCAL_IP_ADDR);
}
-#endif /* CONFIG_NET_SAMPLES_MY_IPV6_ADDR */
- net_if_ipv6_addr_add(net_if_get_default(),
+#if defined(CONFIG_NET_IPV6)
+ net_if_ipv6_addr_add(iface,
&net_sin6(&addr)->sin6_addr,
NET_ADDR_MANUAL, 0);
+#else
+ net_if_ipv4_addr_add(iface,
+ &net_sin(&addr)->sin_addr,
+ NET_ADDR_MANUAL, 0);
+#endif
}
static void