diff options
author | Eiichiro Watanabe <a16tochjp@gmail.com> | 2015-12-09 00:55:46 +0900 |
---|---|---|
committer | Eiichiro Watanabe <a16tochjp@gmail.com> | 2015-12-09 12:30:49 +0900 |
commit | 35668904fb0a1716c874ea843b2520663a742e98 (patch) | |
tree | a31d453c39853ce7d9df63ff98005f3e3f5d2fa3 /packet/rtr.go | |
parent | ea9a6b8c24523f15dac9f275fc91b6d2de57f8af (diff) |
packet: add constructors for RTR PDUs
* Except Error Report PDU
Diffstat (limited to 'packet/rtr.go')
-rw-r--r-- | packet/rtr.go | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/packet/rtr.go b/packet/rtr.go index 42fe32a4..1b0282fa 100644 --- a/packet/rtr.go +++ b/packet/rtr.go @@ -51,6 +51,11 @@ const ( RTR_MIN_LEN = 8 ) +const ( + WITHDRAWAL uint8 = iota + ANNOUNCEMENT +) + type RTRMessage interface { DecodeFromBytes([]byte) error Serialize() ([]byte, error) @@ -87,10 +92,32 @@ type RTRSerialNotify struct { RTRCommon } +func NewRTRSerialNotify(id uint16, sn uint32) *RTRSerialNotify { + return &RTRSerialNotify{ + RTRCommon{ + Type: RTR_SERIAL_NOTIFY, + SessionID: id, + Len: RTR_SERIAL_NOTIFY_LEN, + SerialNumber: sn, + }, + } +} + type RTRSerialQuery struct { RTRCommon } +func NewRTRSerialQuery(id uint16, sn uint32) *RTRSerialQuery { + return &RTRSerialQuery{ + RTRCommon{ + Type: RTR_SERIAL_QUERY, + SessionID: id, + Len: RTR_SERIAL_QUERY_LEN, + SerialNumber: sn, + }, + } +} + type RTRReset struct { Version uint8 Type uint8 @@ -157,6 +184,14 @@ func (m *RTRCacheResponse) Serialize() ([]byte, error) { return data, nil } +func NewRTRCacheResponse(id uint16) *RTRCacheResponse { + return &RTRCacheResponse{ + Type: RTR_CACHE_RESPONSE, + SessionID: id, + Len: RTR_CACHE_RESPONSE_LEN, + } +} + type RTRIPPrefix struct { Version uint8 Type uint8 @@ -203,14 +238,56 @@ func (m *RTRIPPrefix) Serialize() ([]byte, error) { return data, nil } +func NewRTRIPPrefix(prefix net.IP, prefixLen, maxLen uint8, as uint32, flags uint8) *RTRIPPrefix { + var pduType uint8 + var pduLen uint32 + if prefix.To4() != nil && prefixLen <= 32 { + pduType = RTR_IPV4_PREFIX + pduLen = RTR_IPV4_PREFIX_LEN + } else { + pduType = RTR_IPV6_PREFIX + pduLen = RTR_IPV6_PREFIX_LEN + } + + return &RTRIPPrefix{ + Type: pduType, + Len: pduLen, + Flags: flags, + PrefixLen: prefixLen, + MaxLen: maxLen, + Prefix: prefix, + AS: as, + } +} + type RTREndOfData struct { RTRCommon } +func NewRTREndOfData(id uint16, sn uint32) *RTREndOfData { + return &RTREndOfData{ + RTRCommon{ + Type: RTR_END_OF_DATA, + SessionID: id, + Len: RTR_END_OF_DATA_LEN, + SerialNumber: sn, + }, + } +} + type RTRCacheReset struct { RTRReset } +func NewRTRCacheReset() *RTRCacheReset { + return &RTRCacheReset{ + RTRReset{ + Type: RTR_CACHE_RESET, + Len: RTR_CACHE_RESET_LEN, + }, + } +} + type RTRErrorReport struct { Version uint8 Type uint8 |