;; 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)
(write-char #\: out))))))
(cond ((null best-start)
(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)