code: def unpack(self, buff, offset=0):
          
          begin = offset
  
          vlan_length = self._get_vlan_length(buff)
  
          for attribute_name, class_attribute in self.get_class_attributes():
              attribute = deepcopy(class_attribute)
              if attribute_name == 'vlans':
                  attribute.unpack(buff[begin:begin+vlan_length])
              else:
                  attribute.unpack(buff, begin)
              setattr(self, attribute_name, attribute)
              begin += attribute.get_size()
docs: Unpack a binary message into this object's attributes.
  
          Unpack the binary value *buff* and update this object attributes based
          on the results.
  
          Ethernet headers may have VLAN tags. If no VLAN tag is found, a
          'wildcard VLAN tag' is inserted to assure correct unpacking.
  
          Args:
              buff (bytes): Binary data package to be unpacked.
              offset (int): Where to begin unpacking.
  
          Raises:
              UnpackException: If there is a struct unpacking error.