type JsonExpr = JsObject | JsArray | JsNumber | JsBoolean | JsString | JsNull sealed trait JsonExpr case class JsObject(obj: Map[String, JsonExpr]) extends JsonExpr case class JsArray(values: Seq[JsonExpr]) extends JsonExpr case class JsBoolean(value: Boolean) extends JsonExpr case class JsNumber(value: Int) extends JsonExpr case class JsString(value: String) extends JsonExpr case object JsNull extends JsonExpr } 10
val Router = 3.toShort val DNS = 6.toShort val HostName = 12.toShort val RequestedIpAddress = 50.toShort val IpAddressLeaseTime = 51.toShort val DhcpMessageType = 53.toShort val DhcpServerIdentify = 54.toShort val ParameterRequestList = 55.toShort } object DhcpMessageType extends Enumeration { val Discover = 1 val Offer = 2 val Request = 3 val Ack = 5 val Release = 7 } 24
PcapNetworkInterface = Pcaps.getDevByAddress(address) // ip val handle: PcapHandle = nif.openLive(65536, PromiscuousMode.PROMISCUOUS, 10) handle.setFilter("udp and ( port 67 or port 68 )", BpfCompileMode.OPTIMIZE) handle.loop(packetCount = ‐1, new PacketListener { override def gotPacket(packet: Packet): Unit = handlePacket(packet) }) def handlePacket(packet: Packet) = packet match { case eth: EthernetPacket => println(s"Ethernet ${eth.getHeader.getSrcAddr} ‐> ${eth.getHeader.getDstAddr}") eth.getPayload match { case ipv4: IpV4packet => ipv4.getPayload match { case udp: UdpPacket => val arr = udp.getPayload.getRawData // process } } } 30