blob: 0cf4ae5d9df23b0ec2aeef98f400184d95f52405 [file] [log] [blame]
Vidyashree Ramae59ada12015-09-28 17:08:31 +05301/*
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 */
16package org.onosproject.bgpio.protocol.ver4;
17
18import org.jboss.netty.buffer.ChannelBuffer;
19import org.onosproject.bgpio.exceptions.BGPParseException;
20import org.onosproject.bgpio.protocol.BGPKeepaliveMsg;
21import org.onosproject.bgpio.protocol.BGPMessageReader;
22import org.onosproject.bgpio.protocol.BGPMessageWriter;
23import org.onosproject.bgpio.types.BGPHeader;
24import org.onosproject.bgpio.protocol.BGPType;
25import org.onosproject.bgpio.protocol.BGPVersion;
26import org.slf4j.Logger;
27import org.slf4j.LoggerFactory;
28
29import com.google.common.base.MoreObjects;
30
31/**
32 * Provides BGP keep alive message.
33 */
Vidyashree Rama7bd3d782015-11-23 08:46:33 +053034public class BGPKeepaliveMsgVer4 implements BGPKeepaliveMsg {
Vidyashree Ramae59ada12015-09-28 17:08:31 +053035
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 */
Vidyashree Rama7bd3d782015-11-23 08:46:33 +053091 public BGPKeepaliveMsgVer4() {
Vidyashree Ramae59ada12015-09-28 17:08:31 +053092 }
93
94 /**
95 * Builder class for BGP keepalive message.
96 */
97 static class Builder implements BGPKeepaliveMsg.Builder {
98 BGPHeader bgpMsgHeader;
99
100 @Override
Vidyashree Ramae59ada12015-09-28 17:08:31 +0530101 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}