|
|
@@ -39,12 +39,16 @@ var registries = []struct {
|
|
|
"https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml",
|
|
|
parseProtocolNumbers,
|
|
|
},
|
|
|
+ {
|
|
|
+ "http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xml",
|
|
|
+ parseAddrFamilyNumbers,
|
|
|
+ },
|
|
|
}
|
|
|
|
|
|
func main() {
|
|
|
var bb bytes.Buffer
|
|
|
fmt.Fprintf(&bb, "// go generate gen.go\n")
|
|
|
- fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n")
|
|
|
+ fmt.Fprintf(&bb, "// Code generated by the command above; DO NOT EDIT.\n\n")
|
|
|
fmt.Fprintf(&bb, "// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA).\n")
|
|
|
fmt.Fprintf(&bb, `package iana // import "golang.org/x/net/internal/iana"`+"\n\n")
|
|
|
for _, r := range registries {
|
|
|
@@ -291,3 +295,93 @@ func (pn *protocolNumbers) escape() []canonProtocolRecord {
|
|
|
}
|
|
|
return prs
|
|
|
}
|
|
|
+
|
|
|
+func parseAddrFamilyNumbers(w io.Writer, r io.Reader) error {
|
|
|
+ dec := xml.NewDecoder(r)
|
|
|
+ var afn addrFamilylNumbers
|
|
|
+ if err := dec.Decode(&afn); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ afrs := afn.escape()
|
|
|
+ fmt.Fprintf(w, "// %s, Updated: %s\n", afn.Title, afn.Updated)
|
|
|
+ fmt.Fprintf(w, "const (\n")
|
|
|
+ for _, afr := range afrs {
|
|
|
+ if afr.Name == "" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ fmt.Fprintf(w, "AddrFamily%s = %d", afr.Name, afr.Value)
|
|
|
+ fmt.Fprintf(w, "// %s\n", afr.Descr)
|
|
|
+ }
|
|
|
+ fmt.Fprintf(w, ")\n")
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+type addrFamilylNumbers struct {
|
|
|
+ XMLName xml.Name `xml:"registry"`
|
|
|
+ Title string `xml:"title"`
|
|
|
+ Updated string `xml:"updated"`
|
|
|
+ RegTitle string `xml:"registry>title"`
|
|
|
+ Note string `xml:"registry>note"`
|
|
|
+ Records []struct {
|
|
|
+ Value string `xml:"value"`
|
|
|
+ Descr string `xml:"description"`
|
|
|
+ } `xml:"registry>record"`
|
|
|
+}
|
|
|
+
|
|
|
+type canonAddrFamilyRecord struct {
|
|
|
+ Name string
|
|
|
+ Descr string
|
|
|
+ Value int
|
|
|
+}
|
|
|
+
|
|
|
+func (afn *addrFamilylNumbers) escape() []canonAddrFamilyRecord {
|
|
|
+ afrs := make([]canonAddrFamilyRecord, len(afn.Records))
|
|
|
+ sr := strings.NewReplacer(
|
|
|
+ "IP version 4", "IPv4",
|
|
|
+ "IP version 6", "IPv6",
|
|
|
+ "Identifier", "ID",
|
|
|
+ "-", "",
|
|
|
+ "-", "",
|
|
|
+ "/", "",
|
|
|
+ ".", "",
|
|
|
+ " ", "",
|
|
|
+ )
|
|
|
+ for i, afr := range afn.Records {
|
|
|
+ if strings.Contains(afr.Descr, "Unassigned") ||
|
|
|
+ strings.Contains(afr.Descr, "Reserved") {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ afrs[i].Descr = afr.Descr
|
|
|
+ s := strings.TrimSpace(afr.Descr)
|
|
|
+ switch s {
|
|
|
+ case "IP (IP version 4)":
|
|
|
+ afrs[i].Name = "IPv4"
|
|
|
+ case "IP6 (IP version 6)":
|
|
|
+ afrs[i].Name = "IPv6"
|
|
|
+ case "AFI for L2VPN information":
|
|
|
+ afrs[i].Name = "L2VPN"
|
|
|
+ case "E.164 with NSAP format subaddress":
|
|
|
+ afrs[i].Name = "E164withSubaddress"
|
|
|
+ case "MT IP: Multi-Topology IP version 4":
|
|
|
+ afrs[i].Name = "MTIPv4"
|
|
|
+ case "MAC/24":
|
|
|
+ afrs[i].Name = "MACFinal24bits"
|
|
|
+ case "MAC/40":
|
|
|
+ afrs[i].Name = "MACFinal40bits"
|
|
|
+ case "IPv6/64":
|
|
|
+ afrs[i].Name = "IPv6Initial64bits"
|
|
|
+ default:
|
|
|
+ n := strings.Index(s, "(")
|
|
|
+ if n > 0 {
|
|
|
+ s = s[:n]
|
|
|
+ }
|
|
|
+ n = strings.Index(s, ":")
|
|
|
+ if n > 0 {
|
|
|
+ s = s[:n]
|
|
|
+ }
|
|
|
+ afrs[i].Name = sr.Replace(s)
|
|
|
+ }
|
|
|
+ afrs[i].Value, _ = strconv.Atoi(afr.Value)
|
|
|
+ }
|
|
|
+ return afrs
|
|
|
+}
|