From ee9c4679df32106b130207642dfa29cc18464dfb Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Thu, 25 Aug 2016 15:47:44 +0200 Subject: [PATCH] net/ipv4: address prefix and print support --- repos/os/include/net/ipv4.h | 79 +++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/repos/os/include/net/ipv4.h b/repos/os/include/net/ipv4.h index cc4a10cb71..1b0ff39fab 100644 --- a/repos/os/include/net/ipv4.h +++ b/repos/os/include/net/ipv4.h @@ -17,6 +17,7 @@ /* Genode */ #include #include +#include #include #include @@ -26,6 +27,8 @@ namespace Net enum { IPV4_ADDR_LEN = 4 }; typedef Network_address Ipv4_address; + class Ipv4_address_prefix; + class Ipv4_packet; } @@ -194,4 +197,80 @@ class Net::Ipv4_packet } __attribute__((packed)); + +struct Net::Ipv4_address_prefix +{ + Ipv4_address address; + Genode::uint8_t prefix = 0; +}; + + +namespace Genode { + + inline size_t ascii_to(char const *s, Net::Ipv4_address &result); + + inline size_t ascii_to(char const *s, Net::Ipv4_address_prefix &result); +} + + +Genode::size_t Genode::ascii_to(char const *s, Net::Ipv4_address &result) +{ + using namespace Net; + + struct Scanner_policy_number + { + static bool identifier_char(char c, unsigned i ) { + return Genode::is_digit(c) && c !='.'; } + }; + + typedef ::Genode::Token Token; + + Ipv4_address ip_addr; + Token t(s); + char tmpstr[4]; + int cnt = 0; + unsigned char ipb[4] = {0}; + size_t size = 0; + + while(t) { + if (t.type() == Token::WHITESPACE || t[0] == '.') { + t = t.next(); + size++; + continue; + } + t.string(tmpstr, sizeof(tmpstr)); + + unsigned long tmpc = 0; + size += Genode::ascii_to(tmpstr, tmpc); + ipb[cnt] = tmpc & 0xFF; + t = t.next(); + + if (cnt == 4) + break; + cnt++; + } + + if (cnt == 4) { + result.addr[0] = ipb[0]; + result.addr[1] = ipb[1]; + result.addr[2] = ipb[2]; + result.addr[3] = ipb[3]; + return size; + } + + return 0; +} + + +Genode::size_t Genode::ascii_to(char const *s, Net::Ipv4_address_prefix &result) +{ + size_t size = ascii_to(s, result.address); + if (!size || s[size] != '/') { return 0; } + char const * prefix = &s[size + 1]; + size_t const prefix_size = ascii_to_unsigned(prefix, result.prefix, 10); + if (!prefix_size) { return 0; } + size += prefix_size + 1; + return size; +} + #endif /* _IPV4_H_ */