diff options
author | Michael Scott <michael.scott@linaro.org> | 2017-01-24 23:20:59 -0800 |
---|---|---|
committer | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2017-02-03 15:59:17 +0200 |
commit | 2f10b314312db04450bc6e45247d0b2f6dab35d7 (patch) | |
tree | f5232c899116da5ea14b8c0e1fe338fd7bd2f20c /samples | |
parent | 8a7e30609a605881be5a4fdbf040948da2eb0535 (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.conf | 6 | ||||
-rw-r--r-- | samples/net/irc_bot/prj_qemu_x86.conf | 6 | ||||
-rw-r--r-- | samples/net/irc_bot/src/irc-bot.c | 86 |
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 |