;; 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)
(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.
(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 --------------------------------------------------