10e6bb951fec63cbee5c0e84d85f0fd3db170455
[onosfw.git] /
1 /*
2  * Copyright 2015 Open Networking Laboratory
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.onosproject.bgpio.protocol.ver4;
17
18 import org.jboss.netty.buffer.ChannelBuffer;
19 import org.onosproject.bgpio.exceptions.BGPParseException;
20 import org.onosproject.bgpio.protocol.BGPKeepaliveMsg;
21 import org.onosproject.bgpio.protocol.BGPMessageReader;
22 import org.onosproject.bgpio.protocol.BGPMessageWriter;
23 import org.onosproject.bgpio.types.BGPHeader;
24 import org.onosproject.bgpio.protocol.BGPType;
25 import org.onosproject.bgpio.protocol.BGPVersion;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29 import com.google.common.base.MoreObjects;
30
31 /**
32  * Provides BGP keep alive message.
33  */
34 class BGPKeepaliveMsgVer4 implements BGPKeepaliveMsg {
35
36     /*
37     <Keepalive Message>::= <Common Header>
38     A KEEPALIVE message consists of only the message header and has a
39     length of 19 octets.
40
41     0                   1                   2                   3
42     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
43     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44     |                                                               |
45     +                                                               +
46     |                                                               |
47     +                                                               +
48     |                           Marker                              |
49     +                                                               +
50     |                                                               |
51     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52     |          Length               |      Type     |
53     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54
55     REFERENCE : RFC 4271
56     */
57
58     protected static final Logger log = LoggerFactory
59             .getLogger(BGPKeepaliveMsgVer4.class);
60
61     private BGPHeader bgpMsgHeader;
62     public static final byte PACKET_VERSION = 4;
63     public static final int PACKET_MINIMUM_LENGTH = 19;
64     public static final int MARKER_LENGTH = 16;
65     public static final BGPType MSG_TYPE = BGPType.KEEP_ALIVE;
66     public static byte[] marker = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
67                                               (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
68                                               (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
69                                               (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
70
71     public static final BGPKeepaliveMsgVer4.Reader READER = new Reader();
72
73     /**
74      * Reader class for reading BGP keepalive message from channel buffer.
75      */
76     static class Reader implements BGPMessageReader<BGPKeepaliveMsg> {
77
78         @Override
79         public BGPKeepaliveMsg readFrom(ChannelBuffer cb, BGPHeader bgpHeader)
80                 throws BGPParseException {
81
82             /* bgpHeader is not required in case of keepalive message and
83             Header is already read and no other fields except header in keepalive message.*/
84             return new BGPKeepaliveMsgVer4();
85         }
86     }
87
88     /**
89      * Default constructor.
90      */
91     BGPKeepaliveMsgVer4() {
92     }
93
94     /**
95      * Builder class for BGP keepalive message.
96      */
97     static class Builder implements BGPKeepaliveMsg.Builder {
98         BGPHeader bgpMsgHeader;
99
100         @Override
101         public Builder setHeader(BGPHeader bgpMsgHeader) {
102             this.bgpMsgHeader = bgpMsgHeader;
103             return this;
104         }
105
106         @Override
107         public BGPKeepaliveMsg build() {
108             return new BGPKeepaliveMsgVer4();
109         }
110     }
111
112     @Override
113     public void writeTo(ChannelBuffer cb) {
114         WRITER.write(cb, this);
115     }
116
117     static final Writer WRITER = new Writer();
118
119     /**
120      * Writer class for writing the BGP keepalive message to channel buffer.
121      */
122     static class Writer implements BGPMessageWriter<BGPKeepaliveMsgVer4> {
123
124         @Override
125         public void write(ChannelBuffer cb, BGPKeepaliveMsgVer4 message) {
126
127             // write marker
128             cb.writeBytes(marker, 0, MARKER_LENGTH);
129
130             // write length of header
131             cb.writeShort(PACKET_MINIMUM_LENGTH);
132
133             // write the type of message
134             cb.writeByte(MSG_TYPE.getType());
135         }
136     }
137
138     @Override
139     public BGPVersion getVersion() {
140         return BGPVersion.BGP_4;
141     }
142
143     @Override
144     public BGPType getType() {
145         return MSG_TYPE;
146     }
147
148     @Override
149     public BGPHeader getHeader() {
150         return this.bgpMsgHeader;
151     }
152
153     @Override
154     public String toString() {
155         return MoreObjects.toStringHelper(getClass()).toString();
156     }
157 }