blob: 385f099f654940afebaeb98bb1d912b6903a76bf [file] [log] [blame]
Andrea Campanella432f7182017-07-14 18:43:27 +02001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Andrea Campanella432f7182017-07-14 18:43:27 +02003 *
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
17package org.onosproject.net.pi.runtime;
18
19import com.google.common.annotations.Beta;
20import com.google.common.base.Objects;
21import org.onlab.util.ImmutableByteSequence;
Carmelo Cascone4c289b72019-01-22 15:30:45 -080022import org.onosproject.net.pi.model.PiPacketMetadataId;
Andrea Campanella432f7182017-07-14 18:43:27 +020023
24import static com.google.common.base.Preconditions.checkNotNull;
25
26/**
Carmelo Cascone4c289b72019-01-22 15:30:45 -080027 * Instance of a metadata field for a controller packet-in/out for a
28 * protocol-independent pipeline. Metadata are used to carry information other
29 * than the packet-in/out payload, such as the original ingress port of a
30 * packet-in, or the egress port of packet-out.
Andrea Campanella432f7182017-07-14 18:43:27 +020031 */
32@Beta
Carmelo Cascone4c289b72019-01-22 15:30:45 -080033public final class PiPacketMetadata {
Andrea Campanella432f7182017-07-14 18:43:27 +020034
Carmelo Cascone4c289b72019-01-22 15:30:45 -080035 private final PiPacketMetadataId id;
Andrea Campanella432f7182017-07-14 18:43:27 +020036 private final ImmutableByteSequence value;
37
38 /**
Carmelo Cascone4c289b72019-01-22 15:30:45 -080039 * Creates a new packet metadata instance for the given identifier and
40 * value.
Andrea Campanella432f7182017-07-14 18:43:27 +020041 *
Carmelo Cascone4c289b72019-01-22 15:30:45 -080042 * @param id packet metadata identifier
Andrea Campanella432f7182017-07-14 18:43:27 +020043 * @param value value for this metadata
44 */
Carmelo Cascone4c289b72019-01-22 15:30:45 -080045 private PiPacketMetadata(PiPacketMetadataId id, ImmutableByteSequence value) {
Andrea Campanella432f7182017-07-14 18:43:27 +020046 this.id = id;
47 this.value = value;
48 }
49
50 /**
Carmelo Cascone4c289b72019-01-22 15:30:45 -080051 * Return the identifier of this packet metadata.
Andrea Campanella432f7182017-07-14 18:43:27 +020052 *
Carmelo Cascone4c289b72019-01-22 15:30:45 -080053 * @return packet metadata identifier
Andrea Campanella432f7182017-07-14 18:43:27 +020054 */
Carmelo Cascone4c289b72019-01-22 15:30:45 -080055 public PiPacketMetadataId id() {
Andrea Campanella432f7182017-07-14 18:43:27 +020056 return id;
57 }
58
59 /**
60 * Returns the value for the field in this metadata.
61 *
62 * @return value
63 */
64 public ImmutableByteSequence value() {
65 return value;
66 }
67
68 @Override
69 public boolean equals(Object o) {
70 if (this == o) {
71 return true;
72 }
73 if (o == null || getClass() != o.getClass()) {
74 return false;
75 }
Carmelo Cascone4c289b72019-01-22 15:30:45 -080076 PiPacketMetadata piPacket = (PiPacketMetadata) o;
Andrea Campanella432f7182017-07-14 18:43:27 +020077 return Objects.equal(id, piPacket.id()) &&
78 Objects.equal(value, piPacket.value());
79 }
80
81 @Override
82 public int hashCode() {
83 return Objects.hashCode(id, value);
84 }
85
86 @Override
87 public String toString() {
88 return this.id().toString() + " = " + value.toString();
89 }
90
91 /**
Carmelo Cascone4c289b72019-01-22 15:30:45 -080092 * Returns a packet metadata builder.
Andrea Campanella432f7182017-07-14 18:43:27 +020093 *
94 * @return a new builder
95 */
96 public static Builder builder() {
97 return new Builder();
98 }
99
100 /**
Carmelo Cascone4c289b72019-01-22 15:30:45 -0800101 * Builder of protocol-independent packet metadatas.
Andrea Campanella432f7182017-07-14 18:43:27 +0200102 */
103 public static final class Builder {
104
Carmelo Cascone4c289b72019-01-22 15:30:45 -0800105 private PiPacketMetadataId id;
Andrea Campanella432f7182017-07-14 18:43:27 +0200106 private ImmutableByteSequence value;
107
108 private Builder() {
109 // hides constructor.
110 }
111
112 /**
Carmelo Cascone4c289b72019-01-22 15:30:45 -0800113 * Sets the identifier of this packet metadata.
Andrea Campanella432f7182017-07-14 18:43:27 +0200114 *
Carmelo Cascone4c289b72019-01-22 15:30:45 -0800115 * @param id packet metadata identifier
Andrea Campanella432f7182017-07-14 18:43:27 +0200116 * @return this
117 */
Carmelo Cascone4c289b72019-01-22 15:30:45 -0800118 public Builder withId(PiPacketMetadataId id) {
Andrea Campanella432f7182017-07-14 18:43:27 +0200119 this.id = id;
120 return this;
121 }
122
123 /**
124 * Sets the value of this metadata.
125 *
126 * @param value value of the metadata
127 * @return this
128 */
129 public Builder withValue(ImmutableByteSequence value) {
130 this.value = value;
131 return this;
132 }
133
134 /**
Carmelo Cascone4c289b72019-01-22 15:30:45 -0800135 * Returns a new packet metadata instance.
Andrea Campanella432f7182017-07-14 18:43:27 +0200136 *
Carmelo Cascone4c289b72019-01-22 15:30:45 -0800137 * @return packet metadata
Andrea Campanella432f7182017-07-14 18:43:27 +0200138 */
Carmelo Cascone4c289b72019-01-22 15:30:45 -0800139 public PiPacketMetadata build() {
Andrea Campanella432f7182017-07-14 18:43:27 +0200140 checkNotNull(id);
141 checkNotNull(value);
Carmelo Cascone4c289b72019-01-22 15:30:45 -0800142 return new PiPacketMetadata(id, value);
Andrea Campanella432f7182017-07-14 18:43:27 +0200143 }
144 }
145}