/** * Computes the prefix padding size (in bits) based on value and bit width. * * @return prefix padding in bits */ private int prefixPadding() { return value.size() * Byte.SIZE - this.bitWidth; }
/** * Creates a new byte array view of this sequence. * * @return a new byte array */ public byte[] asArray() { ByteBuffer bb = asReadOnlyBuffer(); byte[] bytes = new byte[size()]; bb.get(bytes); return bytes; }
private ImmutableByteSequence doBitwiseOp(ImmutableByteSequence other, BitwiseOp op) { checkArgument(other != null && this.size() == other.size(), "Other sequence must be non null and with same size as this"); byte[] newBytes = new byte[this.size()]; byte[] thisBytes = this.asArray(); byte[] otherBytes = other.asArray(); for (int i = 0; i < this.size(); i++) { switch (op) { case AND: newBytes[i] = (byte) (thisBytes[i] & otherBytes[i]); break; case OR: newBytes[i] = (byte) (thisBytes[i] | otherBytes[i]); break; case XOR: newBytes[i] = (byte) (thisBytes[i] ^ otherBytes[i]); break; default: throw new IllegalArgumentException( "Unknown bitwise operator " + op.name()); } } return ImmutableByteSequence.copyFrom(newBytes); }
if (bitWidth == original.size() * 8) { if (newByteWidth > original.size()) { int numPadBytes = newByteWidth - original.size(); for (int i = 0; i < numPadBytes; i++) { newBuffer.put((byte) 0x00); int diff = original.size() - newByteWidth; ByteBuffer originalBuffer = original.asReadOnlyBuffer(); for (int i = diff; i < original.size(); i++) { newBuffer.put(originalBuffer.get(i));
@Override public Pair<ImmutableByteSequence, ImmutableByteSequence> ternaryMatch() { switch (initType) { case EXACT: mask = ImmutableByteSequence.prefixZeros(value.size(), prefixPadding()); break; case TERNARY: break; case LPM: mask = getMaskFromPrefixLength(prefixLength, value.size()); break; default: throw new IllegalArgumentException("Unrecognized init type " + initType.name()); } return Pair.of(value, mask); }
@Override public ImmutableByteSequence exactMatch() throws CriterionTranslatorException { switch (initType) { case EXACT: break; case TERNARY: ImmutableByteSequence exactMask = ImmutableByteSequence.ofOnes(value.size()); if (!mask.equals(exactMask)) { throw new CriterionTranslator.CriterionTranslatorException( "trying to use masked field as an exact match, but mask is not exact"); } break; case LPM: if (prefixLength < bitWidth) { throw new CriterionTranslator.CriterionTranslatorException( "trying to use LPM field as an exact match, but prefix is not full"); } break; default: throw new IllegalArgumentException("Unrecognized init type " + initType.name()); } return value; }
@Override public void handlePacketIn(Bmv2Device device, int inputPort, ImmutableByteSequence packet) { Ethernet ethPkt = new Ethernet(); ethPkt.deserialize(packet.asArray(), 0, packet.size()); DeviceId deviceId = device.asDeviceId(); ConnectPoint receivedFrom = new ConnectPoint(deviceId, PortNumber.portNumber(inputPort)); ByteBuffer rawData = ByteBuffer.wrap(packet.asArray()); InboundPacket inPkt = new DefaultInboundPacket(receivedFrom, ethPkt, rawData); OutboundPacket outPkt = new DefaultOutboundPacket(deviceId, null, rawData); PacketContext pktCtx = new Bmv2PacketContext(System.currentTimeMillis(), inPkt, outPkt, false); providerService.processPacket(pktCtx); } }
ImmutableByteSequence lpmMask = prefixOnes(lpmValue.size(), lpmfield.prefixLength()); lpmValue = lpmValue.bitwiseAnd(lpmMask);