mirror of
https://github.com/tinygo-org/net.git
synced 2026-08-12 15:33:40 +00:00
Add network device driver model, netdev
This PR adds a network device driver model called netdev. There will be a companion PR for TinyGo drivers to update the netdev drivers and network examples. This PR covers the core "net" package. An RFC for the work is here: #tinygo-org/drivers#487. Some things have changed from the RFC, but nothing major. The "net" package is a partial port of Go's "net" package, version 1.19.3. The src/net/README file has details on what is modified from Go's "net" package. Most "net" features are working as they would in normal Go. TCP/UDP/TLS protocol support is there. As well as HTTP client and server support. Standard Go network packages such as golang.org/x/net/websockets and Paho MQTT client work as-is. Other packages are likely to work as-is. Testing results are here (https://docs.google.com/spreadsheets/d/e/2PACX-1vT0cCjBvwXf9HJf6aJV2Sw198F2ief02gmbMV0sQocKT4y4RpfKv3dh6Jyew8lQW64FouZ8GwA2yjxI/pubhtml?gid=1013173032&single=true).
This commit is contained in:
committed by
deadprogram
parent
b46e2ec2ac
commit
693edae782
@@ -1,4 +1,4 @@
|
||||
// The following is copied from Go 1.16 official implementation.
|
||||
// TINYGO: The following is copied from Go 1.19.3 official implementation.
|
||||
|
||||
// Copyright 2009 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
@@ -130,6 +130,25 @@ func (ip IP) IsLoopback() bool {
|
||||
return ip.Equal(IPv6loopback)
|
||||
}
|
||||
|
||||
// IsPrivate reports whether ip is a private address, according to
|
||||
// RFC 1918 (IPv4 addresses) and RFC 4193 (IPv6 addresses).
|
||||
func (ip IP) IsPrivate() bool {
|
||||
if ip4 := ip.To4(); ip4 != nil {
|
||||
// Following RFC 1918, Section 3. Private Address Space which says:
|
||||
// The Internet Assigned Numbers Authority (IANA) has reserved the
|
||||
// following three blocks of the IP address space for private internets:
|
||||
// 10.0.0.0 - 10.255.255.255 (10/8 prefix)
|
||||
// 172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
|
||||
// 192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
|
||||
return ip4[0] == 10 ||
|
||||
(ip4[0] == 172 && ip4[1]&0xf0 == 16) ||
|
||||
(ip4[0] == 192 && ip4[1] == 168)
|
||||
}
|
||||
// Following RFC 4193, Section 8. IANA Considerations which says:
|
||||
// The IANA has assigned the FC00::/7 prefix to "Unique Local Unicast".
|
||||
return len(ip) == IPv6len && ip[0]&0xfe == 0xfc
|
||||
}
|
||||
|
||||
// IsMulticast reports whether ip is a multicast address.
|
||||
func (ip IP) IsMulticast() bool {
|
||||
if ip4 := ip.To4(); ip4 != nil {
|
||||
@@ -291,7 +310,7 @@ func ubtoa(dst []byte, start int, v byte) int {
|
||||
// It returns one of 4 forms:
|
||||
// - "<nil>", if ip has length 0
|
||||
// - dotted decimal ("192.0.2.1"), if ip is an IPv4 or IP4-mapped IPv6 address
|
||||
// - IPv6 ("2001:db8::1"), if ip is a valid IPv6 address
|
||||
// - IPv6 conforming to RFC 5952 ("2001:db8::1"), if ip is a valid IPv6 address
|
||||
// - the hexadecimal form of ip, without punctuation, if no other cases apply
|
||||
func (ip IP) String() string {
|
||||
p := ip
|
||||
@@ -528,6 +547,9 @@ func (n *IPNet) Network() string { return "ip+net" }
|
||||
// character and a mask expressed as hexadecimal form with no
|
||||
// punctuation like "198.51.100.0/c000ff00".
|
||||
func (n *IPNet) String() string {
|
||||
if n == nil {
|
||||
return "<nil>"
|
||||
}
|
||||
nn, m := networkNumberAndMask(n)
|
||||
if nn == nil || m == nil {
|
||||
return "<nil>"
|
||||
@@ -557,6 +579,10 @@ func parseIPv4(s string) IP {
|
||||
if !ok || n > 0xFF {
|
||||
return nil
|
||||
}
|
||||
if c > 1 && s[0] == '0' {
|
||||
// Reject non-zero components with leading zeroes.
|
||||
return nil
|
||||
}
|
||||
s = s[c:]
|
||||
p[i] = byte(n)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user