ipv6.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package netutils
  15. import (
  16. "encoding/binary"
  17. "fmt"
  18. "math/big"
  19. "math/rand"
  20. "net"
  21. "sort"
  22. "strconv"
  23. "strings"
  24. "yunion.io/x/pkg/errors"
  25. "yunion.io/x/pkg/util/sortutils"
  26. )
  27. type IPV6Addr [8]uint16
  28. func hex2Number(hexStr string) (uint16, error) {
  29. val, err := strconv.ParseInt(hexStr, 16, 64)
  30. if err != nil {
  31. return 0, errors.Wrap(err, "strconv.ParseInt")
  32. }
  33. return uint16(val), nil
  34. }
  35. func normalizeIpv6Addr(addrStr string) ([8]uint16, error) {
  36. var addr [8]uint16
  37. parts := strings.Split(addrStr, ":")
  38. expectPartCnt := 8
  39. if len(parts) > 0 && strings.Contains(parts[len(parts)-1], ".") {
  40. // 2001:db8:3333:4444:5555:6666:1.2.3.4
  41. v4part, err := IP2Number(parts[len(parts)-1])
  42. if err != nil {
  43. return addr, errors.Wrapf(err, "IP2Number %s", parts[len(parts)-1])
  44. }
  45. addr[6] = uint16((v4part >> 16) & 0xffff)
  46. addr[7] = uint16(v4part & 0xFFFF)
  47. expectPartCnt = 6
  48. parts = parts[:len(parts)-1]
  49. }
  50. if len(parts) < expectPartCnt {
  51. for i := range parts {
  52. parts[i] = strings.TrimSpace(parts[i])
  53. }
  54. switch len(parts) {
  55. case 0, 1:
  56. return addr, errors.Wrap(errors.ErrInvalidFormat, addrStr)
  57. case 2:
  58. if len(parts[0]) == 0 && expectPartCnt == 6 {
  59. // ::192.168.0.1
  60. return addr, nil
  61. } else if len(parts[0]) > 0 && expectPartCnt == 6 {
  62. // 3ffe::192.168.0.1
  63. var err error
  64. addr[0], err = hex2Number(parts[0])
  65. if err != nil {
  66. return addr, errors.Wrapf(err, "hex2Number %s", addrStr)
  67. }
  68. return addr, nil
  69. } else {
  70. return addr, errors.Wrap(errors.ErrInvalidFormat, addrStr)
  71. }
  72. /*case 3:
  73. if len(parts[0]) == 0 && len(parts[1]) == 0 && len(parts[2]) == 0 {
  74. // ::
  75. return addr, nil
  76. } else if len(parts[0]) == 0 && len(parts[2]) > 0 {
  77. // ::1, ::1:192.168.0.1
  78. for i := 0; i <= 1; i++ {
  79. if len(parts[2-i]) == 0 {
  80. continue
  81. }
  82. var err error
  83. addr[expectPartCnt-1-i], err = hex2Number(parts[2-i])
  84. if err != nil {
  85. return addr, errors.Wrapf(err, "hex2Number %s", addrStr)
  86. }
  87. }
  88. return addr, nil
  89. } else if len(parts[0]) > 0 && len(parts[2]) == 0 {
  90. // 3ffe::
  91. for i := 0; i <= 1; i++ {
  92. if len(parts[i]) == 0 {
  93. continue
  94. }
  95. var err error
  96. addr[i], err = hex2Number(parts[i])
  97. if err != nil {
  98. return addr, errors.Wrapf(err, "hex2Number %s", addrStr)
  99. }
  100. }
  101. return addr, nil
  102. } else {
  103. return addr, errors.Wrap(errors.ErrInvalidFormat, addrStr)
  104. }*/
  105. default:
  106. if len(parts) == 3 && len(parts[0]) == 0 && len(parts[1]) == 0 && len(parts[2]) == 0 {
  107. return addr, nil
  108. } else if len(parts[0]) == 0 {
  109. if len(parts[1]) == 0 {
  110. // ::1, ::3ffe:3200:1234:1234, ::1234:123.123.123.123
  111. for i := 0; i < len(parts)-2; i++ {
  112. partIdx := len(parts) - 1 - i
  113. addrIdx := expectPartCnt - 1 - i
  114. var err error
  115. addr[addrIdx], err = hex2Number(parts[partIdx])
  116. if err != nil {
  117. return addr, errors.Wrapf(err, "hex2Number %s", addrStr)
  118. }
  119. }
  120. } else {
  121. return addr, errors.Wrap(errors.ErrInvalidFormat, addrStr)
  122. }
  123. } else if len(parts[len(parts)-1]) == 0 {
  124. // 3ffe::, 3ffe:3200::, 3ffe:3200::123.123.123.123
  125. for i := 0; i < len(parts)-1; i++ {
  126. if len(parts[i]) == 0 {
  127. continue
  128. }
  129. var err error
  130. addr[i], err = hex2Number(parts[i])
  131. if err != nil {
  132. return addr, errors.Wrapf(err, "hex2Number %s", addrStr)
  133. }
  134. }
  135. } else {
  136. addrIdx := 0
  137. for i := 0; i < len(parts); i++ {
  138. if len(parts[i]) == 0 {
  139. addrIdx = expectPartCnt + 1 - len(parts) + i
  140. continue
  141. }
  142. var err error
  143. addr[addrIdx], err = hex2Number(parts[i])
  144. if err != nil {
  145. return addr, errors.Wrapf(err, "hex2Number %s", addrStr)
  146. }
  147. addrIdx++
  148. }
  149. }
  150. }
  151. } else {
  152. for i := 0; i < len(parts); i++ {
  153. partStr := strings.TrimSpace(parts[i])
  154. if len(partStr) == 0 {
  155. continue
  156. }
  157. var err error
  158. addr[i], err = hex2Number(partStr)
  159. if err != nil {
  160. return addr, errors.Wrapf(err, "hex2Number %s", addrStr)
  161. }
  162. }
  163. }
  164. return addr, nil
  165. }
  166. func NewIPV6Addr(ipstr string) (IPV6Addr, error) {
  167. var addr IPV6Addr
  168. if len(ipstr) > 0 {
  169. addr8, err := normalizeIpv6Addr(ipstr)
  170. if err != nil {
  171. return addr, errors.Wrapf(errors.ErrInvalidFormat, "%s %s", ipstr, err.Error())
  172. }
  173. addr = addr8
  174. }
  175. return addr, nil
  176. }
  177. const MaxUint16 = uint16(0xffff)
  178. func (addr IPV6Addr) StepDown() IPV6Addr {
  179. naddr := IPV6Addr{}
  180. borrow := true
  181. for i := 7; i >= 0; i-- {
  182. if borrow {
  183. if addr[i] > 0 {
  184. naddr[i] = addr[i] - 1
  185. borrow = false
  186. } else {
  187. naddr[i] = MaxUint16
  188. borrow = true
  189. }
  190. } else {
  191. naddr[i] = addr[i]
  192. }
  193. }
  194. return naddr
  195. }
  196. func (addr IPV6Addr) StepUp() IPV6Addr {
  197. naddr := IPV6Addr{}
  198. upshift := true
  199. for i := 7; i >= 0; i-- {
  200. if upshift {
  201. if addr[i] == MaxUint16 {
  202. naddr[i] = 0
  203. upshift = true
  204. } else {
  205. naddr[i] = addr[i] + 1
  206. upshift = false
  207. }
  208. } else {
  209. naddr[i] = addr[i]
  210. }
  211. }
  212. return naddr
  213. }
  214. func masklen2Uint16(maskLen uint8) uint16 {
  215. return ^(uint16(1<<(16-maskLen)) - 1)
  216. }
  217. func (addr IPV6Addr) NetAddr(maskLen uint8) IPV6Addr {
  218. var naddr IPV6Addr
  219. for i := 0; i < 8; i++ {
  220. if maskLen >= 16 {
  221. naddr[i] = addr[i]
  222. maskLen -= 16
  223. } else if maskLen > 0 && maskLen < 16 {
  224. naddr[i] = addr[i] & masklen2Uint16(maskLen)
  225. maskLen = 0
  226. } else {
  227. naddr[i] = 0
  228. }
  229. }
  230. return naddr
  231. }
  232. func (addr IPV6Addr) BroadcastAddr(maskLen uint8) IPV6Addr {
  233. var naddr IPV6Addr
  234. for i := 0; i < 8; i++ {
  235. if maskLen >= 16 {
  236. naddr[i] = addr[i]
  237. maskLen -= 16
  238. } else if maskLen > 0 && maskLen < 16 {
  239. mask := masklen2Uint16(maskLen)
  240. naddr[i] = addr[i] | (MaxUint16 - mask)
  241. maskLen = 0
  242. } else {
  243. naddr[i] = MaxUint16
  244. }
  245. }
  246. return naddr
  247. }
  248. func (addr IPV6Addr) HostAddr(hostAddr IPV6Addr, maskLen uint8) IPV6Addr {
  249. var naddr IPV6Addr
  250. for i := 0; i < 8; i++ {
  251. if maskLen >= 16 {
  252. naddr[i] = addr[i]
  253. maskLen -= 16
  254. } else if maskLen > 0 && maskLen < 16 {
  255. mask := masklen2Uint16(maskLen)
  256. naddr[i] = (addr[i] & mask) | (hostAddr[i] & (MaxUint16 - mask))
  257. maskLen = 0
  258. } else {
  259. naddr[i] = hostAddr[i]
  260. }
  261. }
  262. return naddr
  263. }
  264. func (addr IPV6Addr) String() string {
  265. hexStrs := make([]string, 8)
  266. for i := 0; i < 8; i++ {
  267. hexStrs[i] = fmt.Sprintf("%x", addr[i])
  268. }
  269. maxZeroLen := 0
  270. maxZeroStart := -1
  271. maxZeroEnd := -1
  272. zeroStart := -1
  273. zeroEnd := -1
  274. for i := 0; i < len(addr); i++ {
  275. if addr[i] == 0 {
  276. if zeroStart >= 0 {
  277. zeroEnd = i
  278. } else {
  279. zeroStart = i
  280. zeroEnd = i
  281. }
  282. } else {
  283. if zeroStart >= 0 {
  284. // record the max
  285. if zeroEnd-zeroStart+1 > maxZeroLen {
  286. maxZeroStart = zeroStart
  287. maxZeroEnd = zeroEnd
  288. maxZeroLen = maxZeroEnd - maxZeroStart + 1
  289. }
  290. zeroStart = -1
  291. zeroEnd = -1
  292. } else {
  293. // do nothing
  294. }
  295. }
  296. }
  297. if zeroStart >= 0 {
  298. if zeroEnd-zeroStart+1 > maxZeroLen {
  299. maxZeroStart = zeroStart
  300. maxZeroEnd = zeroEnd
  301. maxZeroLen = maxZeroEnd - maxZeroStart + 1
  302. }
  303. }
  304. if maxZeroLen > 1 {
  305. return strings.Join(hexStrs[:maxZeroStart], ":") + "::" + strings.Join(hexStrs[maxZeroEnd+1:], ":")
  306. } else {
  307. return strings.Join(hexStrs, ":")
  308. }
  309. }
  310. func (addr IPV6Addr) Lt(addr2 IPV6Addr) bool {
  311. for i := 0; i < 8; i++ {
  312. if addr[i] < addr2[i] {
  313. return true
  314. } else if addr[i] > addr2[i] {
  315. return false
  316. }
  317. }
  318. return false
  319. }
  320. func (addr IPV6Addr) Le(addr2 IPV6Addr) bool {
  321. for i := 0; i < 8; i++ {
  322. if addr[i] < addr2[i] {
  323. return true
  324. } else if addr[i] > addr2[i] {
  325. return false
  326. }
  327. }
  328. return true
  329. }
  330. func (addr IPV6Addr) Equals(addr2 IPV6Addr) bool {
  331. for i := 0; i < 8; i++ {
  332. if addr[i] != addr2[i] {
  333. return false
  334. }
  335. }
  336. return true
  337. }
  338. func (addr IPV6Addr) Gt(addr2 IPV6Addr) bool {
  339. return !addr.Le(addr2)
  340. }
  341. func (addr IPV6Addr) Ge(addr2 IPV6Addr) bool {
  342. return !addr.Lt(addr2)
  343. }
  344. func (addr IPV6Addr) IsZero() bool {
  345. for _, v := range addr {
  346. if v != 0 {
  347. return false
  348. }
  349. }
  350. return true
  351. }
  352. type IPV6AddrRange struct {
  353. start IPV6Addr
  354. end IPV6Addr
  355. }
  356. func NewIPV6AddrRange(ip1 IPV6Addr, ip2 IPV6Addr) IPV6AddrRange {
  357. ar := IPV6AddrRange{}
  358. ar.Set(ip1, ip2)
  359. return ar
  360. }
  361. func (ar *IPV6AddrRange) Set(ip1 IPV6Addr, ip2 IPV6Addr) {
  362. if ip1.Lt(ip2) {
  363. ar.start = ip1
  364. ar.end = ip2
  365. } else {
  366. ar.start = ip2
  367. ar.end = ip1
  368. }
  369. }
  370. // n.IP and n.Mask must be ipv4 type. n.Mask must be canonical
  371. func NewIPV6AddrRangeFromIPNet(n *net.IPNet) IPV6AddrRange {
  372. pref, err := NewIPV6Prefix(n.String())
  373. if err != nil {
  374. panic("unexpected IPNet: " + n.String())
  375. }
  376. return pref.ToIPRange()
  377. }
  378. func (ar IPV6AddrRange) Contains(ip IPV6Addr) bool {
  379. return ip.Ge(ar.start) && ip.Le(ar.end)
  380. }
  381. func (ar IPV6AddrRange) ContainsRange(ar2 IPV6AddrRange) bool {
  382. return ar.start.Le(ar2.start) && ar.end.Ge(ar2.end)
  383. }
  384. func Uint16ArrayToBigInt(ip [8]uint16) *big.Int {
  385. result := new(big.Int)
  386. for i := 0; i < 8; i++ {
  387. result.Lsh(result, 16)
  388. result.Add(result, big.NewInt(int64(ip[i])))
  389. }
  390. return result
  391. }
  392. func (ar IPV6AddrRange) AddressCount() *big.Int {
  393. start := Uint16ArrayToBigInt(ar.start)
  394. end := Uint16ArrayToBigInt(ar.end)
  395. diff := new(big.Int).Sub(end, start)
  396. diff.Add(diff, big.NewInt(1))
  397. return diff
  398. }
  399. const (
  400. borderEqual = 0
  401. borderLower = 1
  402. borderUpper = 2
  403. notBorder = 3
  404. )
  405. func randomUint16(min, max uint16) uint16 {
  406. return min + uint16(rand.Intn(int(max)+1-int(min)))
  407. }
  408. func randomNext(min, max uint16, border int) (uint16, int) {
  409. var newVal uint16
  410. if min == max {
  411. newVal = min
  412. } else {
  413. newVal = randomUint16(min, max)
  414. if newVal == min {
  415. if border == borderUpper {
  416. border = notBorder
  417. } else if border == borderEqual {
  418. border = borderLower
  419. }
  420. } else if newVal == max {
  421. if border == borderLower {
  422. border = notBorder
  423. } else if border == borderEqual {
  424. border = borderUpper
  425. }
  426. } else {
  427. border = notBorder
  428. }
  429. }
  430. return newVal, border
  431. }
  432. func (ar IPV6AddrRange) Random() IPV6Addr {
  433. var naddr IPV6Addr
  434. border := borderEqual
  435. for i := 0; i < 8; i++ {
  436. switch border {
  437. case borderEqual:
  438. naddr[i], border = randomNext(ar.start[i], ar.end[i], border)
  439. case borderLower:
  440. naddr[i], border = randomNext(ar.start[i], MaxUint16, border)
  441. case borderUpper:
  442. naddr[i], border = randomNext(0, ar.end[i], border)
  443. default:
  444. // any random
  445. naddr[i] = randomUint16(0, MaxUint16)
  446. }
  447. }
  448. return naddr
  449. }
  450. func (ar IPV6AddrRange) String() string {
  451. return fmt.Sprintf("%s-%s", ar.start, ar.end)
  452. }
  453. func (ar IPV6AddrRange) StartIp() IPV6Addr {
  454. return ar.start
  455. }
  456. func (ar IPV6AddrRange) EndIp() IPV6Addr {
  457. return ar.end
  458. }
  459. func (ar IPV6AddrRange) Merge(ar2 IPV6AddrRange) (IPV6AddrRange, bool) {
  460. if ar.IsOverlap(ar2) || ar.end.StepUp().Equals(ar2.start) || ar2.end.StepUp().Equals(ar.start) {
  461. if ar2.start.Lt(ar.start) {
  462. ar.start = ar2.start
  463. }
  464. if ar2.end.Gt(ar.end) {
  465. ar.end = ar2.end
  466. }
  467. return ar, true
  468. }
  469. return ar, false
  470. }
  471. func (ar IPV6AddrRange) IsOverlap(ar2 IPV6AddrRange) bool {
  472. if ar.start.Gt(ar2.end) || ar.end.Lt(ar2.start) {
  473. return false
  474. } else {
  475. return true
  476. }
  477. }
  478. func (ar IPV6AddrRange) equals(ar2 IPV6AddrRange) bool {
  479. return ar.start.Equals(ar2.start) && ar.end.Equals(ar2.end)
  480. }
  481. type IPV6Prefix struct {
  482. Address IPV6Addr
  483. MaskLen uint8
  484. ipRange IPV6AddrRange
  485. }
  486. func (pref *IPV6Prefix) String() string {
  487. if pref.MaskLen == 128 {
  488. return pref.Address.String()
  489. } else {
  490. return fmt.Sprintf("%s/%d", pref.Address.NetAddr(pref.MaskLen).String(), pref.MaskLen)
  491. }
  492. }
  493. func (pref *IPV6Prefix) Equals(pref1 *IPV6Prefix) bool {
  494. if pref1 == nil {
  495. return false
  496. }
  497. return pref.ipRange.equals(pref1.ipRange)
  498. }
  499. func ParsePrefix6(prefix string) (IPV6Addr, uint8, error) {
  500. slash := strings.IndexByte(prefix, '/')
  501. if slash > 0 {
  502. addr, err := NewIPV6Addr(prefix[:slash])
  503. if err != nil {
  504. return addr, 0, errors.Wrap(err, "NewIPV6Addr")
  505. }
  506. maskLen, err := strconv.Atoi(prefix[slash+1:])
  507. if err != nil {
  508. return addr, 0, ErrInvalidMask // fmt.Errorf("invalid masklen %s", err)
  509. }
  510. if maskLen < 0 || maskLen > 128 {
  511. return addr, 0, ErrOutOfRangeMask // fmt.Errorf("out of range masklen")
  512. }
  513. return addr.NetAddr(uint8(maskLen)), uint8(maskLen), nil
  514. } else {
  515. addr, err := NewIPV6Addr(prefix)
  516. if err != nil {
  517. return addr, 0, errors.Wrap(err, "NewIPV4Addr")
  518. }
  519. return addr, 128, nil
  520. }
  521. }
  522. func NewIPV6Prefix(prefix string) (IPV6Prefix, error) {
  523. addr, maskLen, err := ParsePrefix6(prefix)
  524. if err != nil {
  525. return IPV6Prefix{}, errors.Wrap(err, "ParsePrefix6")
  526. }
  527. pref := IPV6Prefix{
  528. Address: addr,
  529. MaskLen: maskLen,
  530. }
  531. pref.ipRange = pref.ToIPRange()
  532. return pref, nil
  533. }
  534. func NewIPV6PrefixFromAddr(addr IPV6Addr, masklen uint8) IPV6Prefix {
  535. pref := IPV6Prefix{
  536. Address: addr.NetAddr(masklen),
  537. MaskLen: masklen,
  538. }
  539. pref.ipRange = pref.ToIPRange()
  540. return pref
  541. }
  542. func (prefix IPV6Prefix) ToIPRange() IPV6AddrRange {
  543. start := prefix.Address.NetAddr(prefix.MaskLen)
  544. end := prefix.Address.BroadcastAddr(prefix.MaskLen)
  545. return IPV6AddrRange{start: start, end: end}
  546. }
  547. func (prefix IPV6Prefix) Contains(ip IPV6Addr) bool {
  548. return prefix.ipRange.Contains(ip)
  549. }
  550. func DeriveIPv6AddrFromIPv4AddrMac(ipAddr string, macAddr string, startIp6, endIp6 string, maskLen6 uint8) string {
  551. v4, _ := NewIPV4Addr(ipAddr)
  552. v4Bytes := v4.ToBytes()
  553. mac, _ := ParseMac(macAddr)
  554. hostAddr := IPV6Addr{
  555. 0, 0, 0, 0,
  556. binary.BigEndian.Uint16([]byte{v4Bytes[0], v4Bytes[1]}),
  557. binary.BigEndian.Uint16([]byte{v4Bytes[2], v4Bytes[3]}),
  558. binary.BigEndian.Uint16([]byte{mac[2], mac[3]}),
  559. binary.BigEndian.Uint16([]byte{mac[4], mac[5]}),
  560. }
  561. sAddr6, _ := NewIPV6Addr(startIp6)
  562. eAddr6, _ := NewIPV6Addr(endIp6)
  563. netAddr6 := sAddr6.NetAddr(maskLen6)
  564. i := uint8(64)
  565. if maskLen6 > i {
  566. i = maskLen6
  567. }
  568. for i < 128 {
  569. addr6 := netAddr6.HostAddr(hostAddr, i)
  570. if addr6.Ge(sAddr6) && addr6.Le(eAddr6) {
  571. return addr6.String()
  572. }
  573. i++
  574. }
  575. return ""
  576. }
  577. func (ar IPV6AddrRange) Substract(ar2 IPV6AddrRange) ([]IPV6AddrRange, *IPV6AddrRange) {
  578. lefts, overlap, sub := ar.Substract2(ar2)
  579. var subp *IPV6AddrRange
  580. if overlap {
  581. subp = &sub
  582. }
  583. return lefts, subp
  584. }
  585. func (ar IPV6AddrRange) Substract2(ar2 IPV6AddrRange) ([]IPV6AddrRange, bool, IPV6AddrRange) {
  586. lefts := []IPV6AddrRange{}
  587. // no intersection, no substract
  588. if ar.end.Lt(ar2.start) || ar.start.Gt(ar2.end) {
  589. lefts = append(lefts, ar)
  590. return lefts, false, IPV6AddrRange{}
  591. }
  592. // ar contains ar2
  593. if ar.ContainsRange(ar2) {
  594. if ar.start.Equals(ar2.start) && ar.end.Equals(ar2.end) {
  595. // lefts empty
  596. } else if ar.start.Lt(ar2.start) && ar.end.Equals(ar2.end) {
  597. lefts = append(lefts,
  598. NewIPV6AddrRange(ar.start, ar2.start.StepDown()),
  599. )
  600. } else if ar.start.Equals(ar2.start) && ar.end.Gt(ar2.end) {
  601. lefts = append(lefts,
  602. NewIPV6AddrRange(ar2.end.StepUp(), ar.end),
  603. )
  604. } else {
  605. lefts = append(lefts,
  606. NewIPV6AddrRange(ar.start, ar2.start.StepDown()),
  607. NewIPV6AddrRange(ar2.end.StepUp(), ar.end),
  608. )
  609. }
  610. return lefts, true, ar2
  611. }
  612. // ar contained by ar2
  613. if ar2.ContainsRange(ar) {
  614. return lefts, true, ar
  615. }
  616. // intersect, ar on the left
  617. if ar.start.Lt(ar2.start) && ar.end.Ge(ar2.start) {
  618. lefts = append(lefts, NewIPV6AddrRange(ar.start, ar2.start.StepDown()))
  619. sub_ := NewIPV6AddrRange(ar2.start, ar.end)
  620. return lefts, true, sub_
  621. }
  622. // intersect, ar on the right
  623. if ar.start.Le(ar2.end) && ar.end.Gt(ar2.end) {
  624. lefts = append(lefts, NewIPV6AddrRange(ar2.end.StepUp(), ar.end))
  625. sub_ := NewIPV6AddrRange(ar.start, ar2.end)
  626. return lefts, true, sub_
  627. }
  628. // no intersection
  629. return lefts, false, IPV6AddrRange{}
  630. }
  631. func (addr IPV6Addr) ToBytes() []byte {
  632. ret := make([]byte, 16)
  633. for i := 0; i < len(addr); i++ {
  634. binary.BigEndian.PutUint16(ret[2*i:], addr[i])
  635. }
  636. return ret
  637. }
  638. func (addr IPV6Addr) ToIP() net.IP {
  639. return net.IP(addr.ToBytes())
  640. }
  641. func (pref IPV6Prefix) ToIPNet() *net.IPNet {
  642. return &net.IPNet{
  643. IP: pref.Address.ToIP(),
  644. Mask: net.CIDRMask(int(pref.MaskLen), 128),
  645. }
  646. }
  647. func (ar IPV6AddrRange) ToIPNets() []*net.IPNet {
  648. r := []*net.IPNet{}
  649. mms := ar.ToPrefixes()
  650. for _, mm := range mms {
  651. r = append(r, mm.ToIPNet())
  652. }
  653. return r
  654. }
  655. func (ar IPV6AddrRange) ToPrefixes() []IPV6Prefix {
  656. prefixes := make([]IPV6Prefix, 0)
  657. sp := ar.StartIp()
  658. ep := ar.EndIp()
  659. for sp.Le(ep) {
  660. masklen := uint8(128)
  661. for sp.NetAddr(masklen-1).Equals(sp) && sp.BroadcastAddr(masklen-1).Le(ep) && masklen > 0 {
  662. masklen--
  663. }
  664. if masklen == 0 {
  665. prefixes = append(prefixes, NewIPV6PrefixFromAddr(sp, 0))
  666. break
  667. }
  668. prefixes = append(prefixes, NewIPV6PrefixFromAddr(sp, masklen))
  669. sp = sp.BroadcastAddr(masklen).StepUp()
  670. }
  671. return prefixes
  672. }
  673. type IPV6AddrRangeList []IPV6AddrRange
  674. func (rl IPV6AddrRangeList) Len() int {
  675. return len(rl)
  676. }
  677. func (rl IPV6AddrRangeList) Swap(i, j int) {
  678. rl[i], rl[j] = rl[j], rl[i]
  679. }
  680. func (rl IPV6AddrRangeList) Less(i, j int) bool {
  681. return rl[i].Compare(rl[j]) == sortutils.Less
  682. }
  683. func (v6range IPV6AddrRange) Compare(r2 IPV6AddrRange) sortutils.CompareResult {
  684. if v6range.start.Lt(r2.start) {
  685. return sortutils.Less
  686. } else if v6range.start.Gt(r2.start) {
  687. return sortutils.More
  688. } else {
  689. // start equals, compare ends
  690. if v6range.end.Gt(r2.end) {
  691. return sortutils.Less
  692. } else if v6range.end.Lt(r2.end) {
  693. return sortutils.More
  694. } else {
  695. return sortutils.Equal
  696. }
  697. }
  698. }
  699. func (rl IPV6AddrRangeList) Merge() []IPV6AddrRange {
  700. sort.Sort(rl)
  701. ret := make([]IPV6AddrRange, 0, len(rl))
  702. for i := range rl {
  703. if i == 0 {
  704. ret = append(ret, rl[i])
  705. } else {
  706. result, isMerged := ret[len(ret)-1].Merge(rl[i])
  707. if isMerged {
  708. ret[len(ret)-1] = result
  709. } else {
  710. ret = append(ret, rl[i])
  711. }
  712. }
  713. }
  714. return ret
  715. }
  716. func (rl IPV6AddrRangeList) String() string {
  717. ret := make([]string, len(rl))
  718. for i := range rl {
  719. ret[i] = rl[i].String()
  720. }
  721. return strings.Join(ret, ",")
  722. }
  723. var IPV6Zero = IPV6Addr([8]uint16{0, 0, 0, 0, 0, 0, 0, 0})
  724. var IPV6Ones = IPV6Addr([8]uint16{0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff})
  725. var AllIPV6AddrRange = IPV6AddrRange{
  726. start: IPV6Zero,
  727. end: IPV6Ones,
  728. }
  729. func (r IPV6AddrRange) IsAll() bool {
  730. return r.start.Equals(IPV6Zero) && r.end.Equals(IPV6Ones)
  731. }
  732. func (rl IPV6AddrRangeList) Substract(addrRange IPV6AddrRange) []IPV6AddrRange {
  733. ret := make([]IPV6AddrRange, 0)
  734. for i := range rl {
  735. lefts, _ := rl[i].Substract(addrRange)
  736. ret = append(ret, lefts...)
  737. }
  738. return ret
  739. }
  740. func Mac2LinkLocal(mac string) (IPV6Addr, error) {
  741. macBytes, err := ParseMac(mac)
  742. if err != nil {
  743. return IPV6Addr{}, errors.Wrap(err, "ParseMac")
  744. }
  745. return IPV6Addr{
  746. 0xfe80, 0, 0, 0,
  747. binary.BigEndian.Uint16([]byte{macBytes[0] ^ 0x02, macBytes[1]}),
  748. binary.BigEndian.Uint16([]byte{macBytes[2], 0xff}),
  749. binary.BigEndian.Uint16([]byte{0xfe, macBytes[3]}),
  750. binary.BigEndian.Uint16([]byte{macBytes[4], macBytes[5]}),
  751. }, nil
  752. }