aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpHeader.java
blob: ad63775368571325525535a7003c64f281f2c991 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onosproject.bgpio.types;

import org.jboss.netty.buffer.ChannelBuffer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Provides BGP Message Header which is common for all the Messages.
 */

public class BgpHeader {

    /*      0                   1                   2                   3
          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
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |                                                               |
          +                                                               +
          |                                                               |
          +                                                               +
          |                           Marker                              |
          +                                                               +
          |                                                               |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          |          Length               |      Type     |
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    */

    protected static final Logger log = LoggerFactory.getLogger(BgpHeader.class);

    public static final int MARKER_LENGTH = 16;
    public static final short DEFAULT_HEADER_LENGTH = 19;

    private byte[] marker;
    private byte type;
    private short length;

    /**
     * Reset fields.
     */
    public BgpHeader() {
        this.marker = null;
        this.length = 0;
        this.type = 0;
    }

    /**
     * Constructors to initialize parameters.
     *
     * @param marker field in BGP header
     * @param length message length
     * @param type message type
     */
    public BgpHeader(byte[] marker, short length, byte type) {
        this.marker = marker;
        this.length = length;
        this.type = type;
    }

    /**
     * Sets marker field.
     *
     * @param value marker field
     */
    public void setMarker(byte[] value) {
        this.marker = value;
    }

    /**
     * Sets message type.
     *
     * @param value message type
     */
    public void setType(byte value) {
        this.type = value;
    }

    /**
     * Sets message length.
     *
     * @param value message length
     */
    public void setLength(short value) {
        this.length = value;
    }

    /**
     * Returns message length.
     *
     * @return message length
     */
    public short getLength() {
        return this.length;
    }

    /**
     * Returns message marker.
     *
     * @return message marker
     */
    public byte[] getMarker() {
        return this.marker;
    }

    /**
     * Returns message type.
     *
     * @return message type
     */
    public byte getType() {
        return this.type;
    }

    /**
     * Writes Byte stream of BGP header to channel buffer.
     *
     * @param cb ChannelBuffer
     * @return length index of message header
     */
    public int write(ChannelBuffer cb) {

        cb.writeBytes(getMarker(), 0, MARKER_LENGTH);

        int headerLenIndex = cb.writerIndex();
        cb.writeShort((short) 0);
        cb.writeByte(type);

        return headerLenIndex;
    }

    /**
     * Read from channel buffer and Returns BGP header.
     *
     * @param cb ChannelBuffer
     * @return object of BGPHeader
     */
    public static BgpHeader read(ChannelBuffer cb) {

        byte[] marker = new byte[MARKER_LENGTH];
        byte type;
        short length;
        cb.readBytes(marker, 0, MARKER_LENGTH);
        length = cb.readShort();
        type = cb.readByte();
        return new BgpHeader(marker, length, type);
    }
}