private static final int ETHER_TYPE_OFFSET = 12; // first 14 bytes represent L2 header (2x6)
private static final int IP_VERSION_OFFSET = ETHER_TYPE_OFFSET+2;
- private static final int IP_VERSION_MASK = 0xf0;
private static final int DSCP_OFFSET = 15;
private static final int DSCP_MASK = 0xfc;
+ private static final int IP_PROTOCOL_OFFSET = IP_VERSION_OFFSET+9;
+ private static final int IP_PROTOCOL_MASK = 0xff;
private static final int IP4_LEN = 4;
private static final int SRC_IP_OFFSET = IP_VERSION_OFFSET + 12;
private static final int DST_IP_OFFSET = SRC_IP_OFFSET + IP4_LEN;
request.mask[baseOffset + ETHER_TYPE_OFFSET + 1] = (byte) 0xff;
}
- // First 14 bytes represent l2 header (2x6 + etherType(2))
- if (aceIp.getProtocol() != null) { // Internet Protocol number
- request.mask[baseOffset + IP_VERSION_OFFSET] = (byte) IP_VERSION_MASK; // first 4 bits
- }
-
if (aceIp.getDscp() != null) {
aceIsEmpty = false;
request.mask[baseOffset + DSCP_OFFSET] = (byte) DSCP_MASK; // first 6 bits
}
+ if (aceIp.getProtocol() != null) { // Internet Protocol number
+ request.mask[baseOffset + IP_PROTOCOL_OFFSET] = (byte) IP_PROTOCOL_MASK;
+ }
+
if (aceIp.getSourcePortRange() != null) {
LOG.warn("L4 Header fields are not supported. Ignoring {}", aceIp.getSourcePortRange());
}
}
if (aceIp.getProtocol() != null) {
- request.match[baseOffset + IP_VERSION_OFFSET] =
- (byte) (IP_VERSION_MASK & (aceIp.getProtocol().intValue() << 4));
+ request.match[baseOffset + IP_PROTOCOL_OFFSET] = (byte) (IP_PROTOCOL_MASK & aceIp.getProtocol());
}
if (aceIp.getDscp() != null) {
private static final int ETHER_TYPE_OFFSET = 12; // first 14 bytes represent L2 header (2x6)
private static final int IP_VERSION_OFFSET = ETHER_TYPE_OFFSET+2;
- private static final int IP_VERSION_MASK = 0xf0;
private static final int DSCP_MASK1 = 0x0f;
private static final int DSCP_MASK2 = 0xc0;
+ private static final int IP_PROTOCOL_OFFSET = IP_VERSION_OFFSET+6;
+ private static final int IP_PROTOCOL_MASK = 0xff;
private static final int IP6_LEN = 16;
private static final int SRC_IP_OFFSET = IP_VERSION_OFFSET + 8;
private static final int DST_IP_OFFSET = SRC_IP_OFFSET + IP6_LEN;
request.mask[baseOffset + ETHER_TYPE_OFFSET + 1] = (byte) 0xff;
}
- if (aceIp.getProtocol() != null) {
- aceIsEmpty = false;
- request.mask[baseOffset + IP_VERSION_OFFSET] |= IP_VERSION_MASK;
- }
-
if (aceIp.getDscp() != null) {
aceIsEmpty = false;
// DCSP (bits 4-9 of IP6 header)
request.mask[baseOffset + IP_VERSION_OFFSET + 1] |= DSCP_MASK2;
}
+ if (aceIp.getProtocol() != null) {
+ aceIsEmpty = false;
+ request.mask[baseOffset + IP_PROTOCOL_OFFSET] = (byte) IP_PROTOCOL_MASK;
+ }
+
if (aceIp.getSourcePortRange() != null) {
LOG.warn("L4 Header fields are not supported. Ignoring {}", aceIp.getSourcePortRange());
}
request.match[baseOffset + ETHER_TYPE_OFFSET + 1] = (byte) 0xdd;
}
- if (aceIp.getProtocol() != null) {
- noMatch = false;
- request.match[baseOffset + IP_VERSION_OFFSET] |=
- (byte) (IP_VERSION_MASK & (aceIp.getProtocol().intValue() << 4));
- }
-
if (aceIp.getDscp() != null) {
noMatch = false;
final int dscp = aceIp.getDscp().getValue();
request.match[baseOffset + IP_VERSION_OFFSET + 1] |= (byte) (DSCP_MASK2 & (dscp << 6));
}
+ if (aceIp.getProtocol() != null) {
+ noMatch = false;
+ request.match[baseOffset + IP_PROTOCOL_OFFSET] = (byte) (IP_PROTOCOL_MASK & aceIp.getProtocol());
+ }
+
if (aceIp.getSourcePortRange() != null) {
LOG.warn("L4 Header fields are not supported. Ignoring {}", aceIp.getSourcePortRange());
}
writer = new AceIp4Writer(jvpp);
action = new DenyBuilder().setDeny(true).build();
aceIp = new AceIpBuilder()
- .setProtocol((short) 4)
+ .setProtocol((short) 132)
.setDscp(new Dscp((short) 11))
.setAceIpVersion(new AceIpv4Builder()
.setSourceIpv4Network(new Ipv4Prefix("1.2.3.4/32"))
assertEquals(AceIp4Writer.TABLE_MEM_SIZE, request.memorySize);
byte[] expectedMask = new byte[] {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (byte) 0xf0, (byte) 0xfc,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1,
- -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ // L2:
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ // dscp:
+ (byte) 0x00, (byte) 0xfc,
+ // protocol:
+ 0, 0, 0, 0, 0, 0, 0, (byte) 0xff, 0, 0,
+ // source address:
+ -1, -1, -1, -1,
+ // destination address:
+ -1, -1, -1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
if (isL2) {
assertEquals(0, request.hitNextIndex);
byte[] expectedMatch = new byte[] {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (byte) 0x40, (byte) 0x2c,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 1, 2,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ // L2:
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ // dscp:
+ 0, (byte) 0x2c,
+ // protocol (132):
+ 0, 0, 0, 0, 0, 0, 0, (byte) 132, 0, 0,
+ // source address:
+ 1, 2, 3, 4,
+ // destination address:
+ 1, 2, 4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
if (isL2) {
writer = new AceIp6Writer(jvpp);
action = new DenyBuilder().setDeny(true).build();
aceIp = new AceIpBuilder()
- .setProtocol((short) 6)
+ .setProtocol((short) 132)
.setDscp(new Dscp((short) 11))
.setAceIpVersion(new AceIpv6Builder()
.setFlowLabel(new Ipv6FlowLabel(123L))
byte[] expectedMask = new byte[] {
// L2:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- // version, dscp, flow:
- (byte) 0xff, (byte) 0xcf, (byte) 0xff, (byte) 0xff,
- 0, 0, 0, 0,
+ // dscp, flow:
+ (byte) 0x0f, (byte) 0xcf, (byte) 0xff, (byte) 0xff,
+ // protocol:
+ 0, 0, (byte) 0xff, 0,
// source address:
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
byte[] expectedMatch = new byte[] {
// L2:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- // version(6), dscp(11), flow(123):
- (byte) 0x62, (byte) 0xc0, (byte) 0x00, (byte) 0x7b,
- 0, 0, 0, 0,
+ // dscp(11), flow(123):
+ (byte) 0x02, (byte) 0xc0, (byte) 0x00, (byte) 0x7b,
+ // protocol (132):
+ 0, 0, (byte) 132, 0,
// source address:
(byte) 0x20, (byte) 0x01, (byte) 0x0d, (byte) 0xb8, (byte) 0x85, (byte) 0xa3, (byte) 0x08, (byte) 0xd3,
(byte) 0x13, (byte) 0x19, (byte) 0x8a, (byte) 0x2e, (byte) 0x03, (byte) 0x70, (byte) 0x73, (byte) 0x48,