X-Git-Url: https://git.distorted.org.uk/~mdw/zone/blobdiff_plain/15db92449a34a2fede25d8ee3db38ab5cc206193..74962377fb06e415d2abe35833aa89c04090bde9:/addr-family-ipv6.lisp diff --git a/addr-family-ipv6.lisp b/addr-family-ipv6.lisp index 4bec06c..5ed014e 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,8 +168,19 @@ (incf i) (when (>= i end) (return)) (write-char #\: out)))))) - (cond ((null 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)