Page MenuHomeFreeBSD

D23788.id68729.vs68662.diff
No OneTemporary

D23788.id68729.vs68662.diff

Index: sys/netgraph/ng_ksocket.c
===================================================================
--- sys/netgraph/ng_ksocket.c
+++ sys/netgraph/ng_ksocket.c
@@ -149,6 +149,19 @@
{ "encap", IPPROTO_ENCAP, PF_INET },
{ "divert", IPPROTO_DIVERT, PF_INET },
{ "pim", IPPROTO_PIM, PF_INET },
+ { "ip6", IPPROTO_IPV6, PF_INET6 },
+ { "raw6", IPPROTO_RAW, PF_INET6 },
+ { "icmp6", IPPROTO_ICMPV6, PF_INET6 },
+ { "igmp6", IPPROTO_IGMP, PF_INET6 },
+ { "tcp6", IPPROTO_TCP, PF_INET6 },
+ { "udp6", IPPROTO_UDP, PF_INET6 },
+ { "gre6", IPPROTO_GRE, PF_INET6 },
+ { "esp6", IPPROTO_ESP, PF_INET6 },
+ { "ah6", IPPROTO_AH, PF_INET6 },
+ { "swipe6", IPPROTO_SWIPE, PF_INET6 },
+ { "encap6", IPPROTO_ENCAP, PF_INET6 },
+ { "divert6", IPPROTO_DIVERT, PF_INET6 },
+ { "pim6", IPPROTO_PIM, PF_INET6 },
{ NULL, -1 },
};
@@ -294,10 +307,42 @@
break;
}
-#if 0
- case PF_INET6: /* XXX implement this someday */
-#endif
+ case PF_INET6:
+ {
+ struct sockaddr_in6 *const sin6 = (struct sockaddr_in6 *)sa;
+ char *eptr;
+ char addr[INET6_ADDRSTRLEN];
+ char intid[16];
+ u_long port;
+ bool hasintid = true;
+ if (s[*off] == '[')
+ (*off)++;
+ if ((eptr = strstr(&s[*off], "%")) == NULL) {
+ hasintid = false;
+ eptr = strstr(&s[*off], "]");
+ }
+ snprintf(addr, eptr - (s + *off), "%s", &s[*off]);
+ *off += (eptr - (s + *off));
+ if (!inet_pton(AF_INET6, addr, &sin6->sin6_addr))
+ return (EINVAL);
+
+ if (hasintid) {
+ eptr = strstr(NULL, "]");
+ snprintf(intid, eptr - (s + *off), "%s", &s[*off]);
+ *off += (eptr - (s + *off));
+ }
+
+ if (s[*off] == '[') {
+ (*off)++;
+ port = strtoul(s + *off, &eptr, 10);
+ if (port > 0xffff || eptr == s + *off)
+ return (EINVAL);
+ sin6->sin6_port = htons(port);
+ }
+ break;
+ }
+
default:
return (EINVAL);
}
@@ -356,9 +401,20 @@
return(0);
}
-#if 0
- case PF_INET6: /* XXX implement this someday */
-#endif
+ case PF_INET6:
+ {
+ const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sa;
+ char addr[INET6_ADDRSTRLEN];
+
+ inet_ntop(AF_INET6, &sin6->sin6_addr, addr, INET6_ADDRSTRLEN);
+ slen += snprintf(cbuf, cbuflen, "inet6/[%s]", addr);
+
+ if (sin6->sin6_port != 0) {
+ slen += snprintf(cbuf + strlen(cbuf),
+ cbuflen - strlen(cbuf), ":%d",
+ (u_int)ntohs(sin6->sin6_port));
+ }
+ }
default:
return (*ng_ksocket_generic_sockaddr_type.supertype->unparse)

File Metadata

Mime Type
text/plain
Expires
Wed, Apr 22, 2:13 AM (15 h, 44 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31946558
Default Alt Text
D23788.id68729.vs68662.diff (2 KB)

Event Timeline