X-Git-Url: https://git.distorted.org.uk/~mdw/zone/blobdiff_plain/a2267e14628e71bdac3a67f1aca1686ee03eccc4..db43369d61d700b1d0100998a2d9ecefe28ff8d4:/addr-family-ipv6.lisp diff --git a/addr-family-ipv6.lisp b/addr-family-ipv6.lisp index 3c37907..ae886c2 100644 --- a/addr-family-ipv6.lisp +++ b/addr-family-ipv6.lisp @@ -157,7 +157,8 @@ ;; Third step: output the two parts of the address either side of the ;; longest zero run. If there are no zero words in the address, just - ;; write the whole thing. + ;; write the whole thing. There's a special case here for the + ;; IPv6-mapped IPv4 address space ::ffff:0.0.0.0/96. (with-output-to-string (out) (flet ((chunk (start end) (when (< start end) @@ -167,12 +168,23 @@ (incf i) (when (>= i end) (return)) (write-char #\: out)))))) - (cond (best-start + (cond ((< best-length 2) + (chunk 0 8)) + ((and (= best-start 0) + (or (and (= best-length 5) + (= (aref words 5) #xffff)) + (= best-length 6))) + (let ((v4addr (make-instance 'ip4addr + :addr (ldb (byte 32 0) addr)))) + (write-string "::" out) + (when (= best-length 5) + (chunk 5 6) + (write-char #\: out)) + (write-string (ipaddr-string v4addr) out))) + (t (chunk 0 best-start) (write-string "::" out) - (chunk (+ best-start best-length) 8)) - (t - (chunk 0 8))))))) + (chunk (+ best-start best-length) 8))))))) ;;;-------------------------------------------------------------------------- ;;; IPv6 networks. @@ -194,6 +206,7 @@ (defmethod reverse-domain-component-width ((ipaddr ip6addr)) 4) (defmethod reverse-domain-radix ((ipaddr ip6addr)) 16) -(defmethod reverse-domain-suffix ((ipaddr ip6addr)) "ip6.arpa") +(defmethod reverse-domain-suffix ((ipaddr ip6addr)) + (make-domain-name :labels (list "arpa" "ip6") :absolutep t)) ;;;----- That's all, folks --------------------------------------------------