Added new methods IPv4.getDscp() / IPv4.setDscp()
and IPv4.getEcn() / IPv4.setEcn(). Those can be used to get/set the DSCP and ECN bits in the IPv4 header without explicit bit manipulation at the caller. Change-Id: Ia7c5779abae5c4fc7a343e3f7ef3355eb7e86e3d
Showing
2 changed files
with
56 additions
and
7 deletions
| ... | @@ -505,10 +505,9 @@ public class ReactiveForwarding { | ... | @@ -505,10 +505,9 @@ public class ReactiveForwarding { |
| 505 | .matchIPProtocol(ipv4Protocol); | 505 | .matchIPProtocol(ipv4Protocol); |
| 506 | 506 | ||
| 507 | if (matchIpv4Dscp) { | 507 | if (matchIpv4Dscp) { |
| 508 | - int dscp = ipv4Packet.getDiffServ() >>> 2; | 508 | + byte dscp = ipv4Packet.getDscp(); |
| 509 | - int ecn = ipv4Packet.getDiffServ() % 4; | 509 | + byte ecn = ipv4Packet.getEcn(); |
| 510 | - builder.matchIPDscp((byte) (dscp)) | 510 | + builder.matchIPDscp(dscp).matchIPEcn(ecn); |
| 511 | - .matchIPEcn((byte) (ecn)); | ||
| 512 | } | 511 | } |
| 513 | 512 | ||
| 514 | if (matchTcpUdpPorts && ipv4Protocol == IPv4.PROTOCOL_TCP) { | 513 | if (matchTcpUdpPorts && ipv4Protocol == IPv4.PROTOCOL_TCP) { | ... | ... |
| ... | @@ -41,6 +41,10 @@ public class IPv4 extends BasePacket { | ... | @@ -41,6 +41,10 @@ public class IPv4 extends BasePacket { |
| 41 | IPv4.PROTOCOL_CLASS_MAP.put(IPv4.PROTOCOL_UDP, UDP.class); | 41 | IPv4.PROTOCOL_CLASS_MAP.put(IPv4.PROTOCOL_UDP, UDP.class); |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | + private static final byte DSCP_MASK = 0x3f; | ||
| 45 | + private static final byte DSCP_OFFSET = 2; | ||
| 46 | + private static final byte ECN_MASK = 0x3; | ||
| 47 | + | ||
| 44 | protected byte version; | 48 | protected byte version; |
| 45 | protected byte headerLength; | 49 | protected byte headerLength; |
| 46 | protected byte diffServ; | 50 | protected byte diffServ; |
| ... | @@ -91,15 +95,61 @@ public class IPv4 extends BasePacket { | ... | @@ -91,15 +95,61 @@ public class IPv4 extends BasePacket { |
| 91 | } | 95 | } |
| 92 | 96 | ||
| 93 | /** | 97 | /** |
| 94 | - * @return the diffServ | 98 | + * Gets the DSCP value (6 bits). |
| 99 | + * | ||
| 100 | + * @return the DSCP value (6 bits) | ||
| 101 | + */ | ||
| 102 | + public byte getDscp() { | ||
| 103 | + return (byte) ((this.diffServ >>> DSCP_OFFSET) & DSCP_MASK); | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + /** | ||
| 107 | + * Sets the DSCP value (6 bits). | ||
| 108 | + * | ||
| 109 | + * @param dscp the DSCP value (6 bits) | ||
| 110 | + * @return this | ||
| 111 | + */ | ||
| 112 | + public IPv4 setDscp(byte dscp) { | ||
| 113 | + this.diffServ &= ~(DSCP_MASK << DSCP_OFFSET); | ||
| 114 | + this.diffServ |= (dscp & DSCP_MASK) << DSCP_OFFSET; | ||
| 115 | + return this; | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + /** | ||
| 119 | + * Gets the ECN value (2 bits). | ||
| 120 | + * | ||
| 121 | + * @return the ECN value (2 bits) | ||
| 122 | + */ | ||
| 123 | + public byte getEcn() { | ||
| 124 | + return (byte) (this.diffServ & ECN_MASK); | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + /** | ||
| 128 | + * Sets the ECN value (2 bits). | ||
| 129 | + * | ||
| 130 | + * @param ecn the ECN value (2 bits) | ||
| 131 | + * @return this | ||
| 132 | + */ | ||
| 133 | + public IPv4 setEcn(byte ecn) { | ||
| 134 | + this.diffServ &= ~ECN_MASK; | ||
| 135 | + this.diffServ |= (ecn & ECN_MASK); | ||
| 136 | + return this; | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | + /** | ||
| 140 | + * Gets the DiffServ octet (including the DSCP and ECN bits). | ||
| 141 | + * | ||
| 142 | + * @return the diffServ octet (including the DSCP and ECN bits) | ||
| 95 | */ | 143 | */ |
| 96 | public byte getDiffServ() { | 144 | public byte getDiffServ() { |
| 97 | return this.diffServ; | 145 | return this.diffServ; |
| 98 | } | 146 | } |
| 99 | 147 | ||
| 100 | /** | 148 | /** |
| 101 | - * @param diffServ | 149 | + * Sets the DiffServ octet (including the DSCP and ECN bits). |
| 102 | - * the diffServ to set | 150 | + * |
| 151 | + * @param diffServ the diffServ octet to set (including the DSCP and ECN | ||
| 152 | + * bits) | ||
| 103 | * @return this | 153 | * @return this |
| 104 | */ | 154 | */ |
| 105 | public IPv4 setDiffServ(final byte diffServ) { | 155 | public IPv4 setDiffServ(final byte diffServ) { | ... | ... |
-
Please register or login to post a comment