code: def parse(cls, buf):
          
  
          pkt = DhcpPacket()
          (pkt.ciaddr,) = cls.struct('4s').unpack_from(buf, 12)
          (pkt.giaddr,) = cls.struct('4s').unpack_from(buf, 24)
          cls.struct('4s').pack_into(buf, 24, b'')
          pos = 240
          while pos < len(buf):
              (opttag,) = cls.struct('B').unpack_from(buf, pos)
              if opttag == 0:
                  pos += 1
                  continue
              if opttag == END:
                  pkt.end = pos
                  break
              (optlen,) = cls.struct('B').unpack_from(buf, pos + 1)
              startpos = pos
              pos += 2
              if opttag != RELAY_AGENT_INFO:
                  pos += optlen
                  continue
              optend = pos + optlen
              while pos < optend:
                  (subopttag, suboptlen) = cls.struct('BB').unpack_from(buf, pos)
                  fmt = '%is' % (suboptlen,)
                  (val,) = cls.struct(fmt).unpack_from(buf, pos + 2)
                  pkt.relay_options[subopttag] = val
                  pos += suboptlen + 2
              cls.struct('%is' % (optlen + 2)).pack_into(buf, startpos, b'')
          pkt.buf = buf
          return pkt
docs: Parse DHCP Packet.
  
          1. To get client IP Address(ciaddr).
          2. To get relaying gateway IP Address(giaddr).
          3. To get DHCP Relay Agent Information Option Suboption
              such as Link Selection, VSS, Server Identifier override.