code: def read_option_value_len_from_byte(byte, pos, values):
          
          h_nibble = (byte & 0xF0) >> 4
          l_nibble = byte & 0x0F
          value = 0
          length = 0
          if h_nibble <= 12:
              value = h_nibble
          elif h_nibble == 13:
              value = struct.unpack("!B", values[pos].to_bytes(1, "big"))[0] + 13
              pos += 1
          elif h_nibble == 14:
              s = struct.Struct("!H")
              value = s.unpack_from(values[pos:].to_bytes(2, "big"))[0] + 269
              pos += 2
          else:
              raise AttributeError("Unsupported option number nibble " + str(h_nibble))
  
          if l_nibble <= 12:
              length = l_nibble
          elif l_nibble == 13:
              length = struct.unpack("!B", values[pos].to_bytes(1, "big"))[0] + 13
              pos += 1
          elif l_nibble == 14:
              length = s.unpack_from(values[pos:].to_bytes(2, "big"))[0] + 269
              pos += 2
          else:
              raise AttributeError("Unsupported option length nibble " + str(l_nibble))
          return value, length, pos
docs: Calculates the value and length used in the extended option fields.
  
          :param byte: 1-byte option header value.
          :return: the value and length, calculated from the header including the extended fields.