From 54fad6de0541c2f98e9b511f1d30bbcbcd743db6 Mon Sep 17 00:00:00 2001 From: Tom Joseph Date: Mon, 28 Jan 2019 15:11:53 +0530 Subject: eSEL: Remove unused code related to logging eSEL Change-Id: Ia9815102064d20795a44b8e6a7d8b324c280756c Signed-off-by: Tom Joseph --- Makefile.am | 1 - configure.ac | 4 - scripts/inventory-sensor-example.yaml | 340 ---------------------------------- scripts/inventory-sensor.py | 60 ------ scripts/inventorysensor.mako.cpp | 27 --- storageaddsel.cpp | 220 ---------------------- storageaddsel.hpp | 2 - storagehandler.cpp | 4 - 8 files changed, 658 deletions(-) delete mode 100755 scripts/inventory-sensor-example.yaml delete mode 100755 scripts/inventory-sensor.py delete mode 100644 scripts/inventorysensor.mako.cpp diff --git a/Makefile.am b/Makefile.am index 48aa48f..9a16082 100644 --- a/Makefile.am +++ b/Makefile.am @@ -16,7 +16,6 @@ nodist_ipmid_SOURCES = ipmiwhitelist.cpp libipmi20_BUILT_LIST = \ sensor-gen.cpp \ - inventory-sensor-gen.cpp \ fru-read-gen.cpp \ channel-gen.cpp diff --git a/configure.ac b/configure.ac index 8d5e6dd..1935135 100644 --- a/configure.ac +++ b/configure.ac @@ -85,10 +85,6 @@ AS_IF([test "x$SENSOR_YAML_GEN" == "x"], [SENSOR_YAML_GEN="sensor-example.yaml"] SENSORGEN="$PYTHON ${srcdir}/scripts/sensor_gen.py -i $SENSOR_YAML_GEN" AC_SUBST(SENSORGEN) -AS_IF([test "x$INVSENSOR_YAML_GEN" == "x"], [INVSENSOR_YAML_GEN="inventory-sensor-example.yaml"]) -INVSENSORGEN="$PYTHON ${srcdir}/scripts/inventory-sensor.py -i $INVSENSOR_YAML_GEN" -AC_SUBST(INVSENSORGEN) - AS_IF([test "x$FRU_YAML_GEN" == "x"], [FRU_YAML_GEN="fru-read-example.yaml"]) FRUGEN="$PYTHON $srcdir/scripts/fru_gen.py -i $FRU_YAML_GEN" AC_SUBST(FRUGEN) diff --git a/scripts/inventory-sensor-example.yaml b/scripts/inventory-sensor-example.yaml deleted file mode 100755 index 7ff78fb..0000000 --- a/scripts/inventory-sensor-example.yaml +++ /dev/null @@ -1,340 +0,0 @@ -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm0: - sensorID: 0xa6 - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm1: - sensorID: 0xa8 - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm10: - sensorID: 0xba - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm11: - sensorID: 0xbc - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm12: - sensorID: 0xbe - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm13: - sensorID: 0xc0 - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm14: - sensorID: 0xc2 - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm15: - sensorID: 0xc4 - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm2: - sensorID: 0xaa - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm3: - sensorID: 0xac - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm4: - sensorID: 0xae - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm5: - sensorID: 0xb0 - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm6: - sensorID: 0xb2 - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm7: - sensorID: 0xb4 - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm8: - sensorID: 0xb6 - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/dimm9: - sensorID: 0xb8 - sensorType: 0x0C - eventReadingType: 0x6F - offset: 0x04 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0: - sensorID: 0x5a - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core0: - sensorID: 0x12 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core1: - sensorID: 0x15 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core2: - sensorID: 0x18 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core3: - sensorID: 0x1b - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core4: - sensorID: 0x1e - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core5: - sensorID: 0x21 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core6: - sensorID: 0x24 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core7: - sensorID: 0x27 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core8: - sensorID: 0x2a - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core9: - sensorID: 0x2d - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core10: - sensorID: 0x30 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core11: - sensorID: 0x33 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core12: - sensorID: 0x36 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core13: - sensorID: 0x39 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core14: - sensorID: 0x3c - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core15: - sensorID: 0x3f - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core16: - sensorID: 0x42 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core17: - sensorID: 0x45 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core18: - sensorID: 0x48 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core19: - sensorID: 0x4b - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core20: - sensorID: 0x4e - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core21: - sensorID: 0x51 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core22: - sensorID: 0x54 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu0/core23: - sensorID: 0x57 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1: - sensorID: 0xa4 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core0: - sensorID: 0x5c - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core1: - sensorID: 0x5f - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core2: - sensorID: 0x62 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core3: - sensorID: 0x65 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core4: - sensorID: 0x68 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core5: - sensorID: 0x6b - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core6: - sensorID: 0x6e - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core7: - sensorID: 0x71 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core8: - sensorID: 0x74 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core9: - sensorID: 0x77 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core10: - sensorID: 0x7a - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core11: - sensorID: 0x7d - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core12: - sensorID: 0x80 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core13: - sensorID: 0x83 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core14: - sensorID: 0x86 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core15: - sensorID: 0x89 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core16: - sensorID: 0x8c - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core17: - sensorID: 0x8f - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core18: - sensorID: 0x92 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core19: - sensorID: 0x95 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core20: - sensorID: 0x98 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core21: - sensorID: 0x9b - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core22: - sensorID: 0x9e - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core23: - sensorID: 0xa1 - sensorType: 0x07 - eventReadingType: 0x6F - offset: 0x08 -/xyz/openbmc_project/inventory/system/chassis/motherboard: - sensorID: 0x0c - sensorType: 0xC7 - eventReadingType: 0x03 - offset: 0x00 -/xyz/openbmc_project/inventory/system: - sensorID: 0x01 - sensorType: 0x12 - eventReadingType: 0x6F - offset: 0x02 diff --git a/scripts/inventory-sensor.py b/scripts/inventory-sensor.py deleted file mode 100755 index 77222f5..0000000 --- a/scripts/inventory-sensor.py +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -import yaml -import argparse -from mako.template import Template - - -def generate_cpp(sensor_yaml, output_dir): - with open(os.path.join(script_dir, sensor_yaml), 'r') as f: - ifile = yaml.safe_load(f) - if not isinstance(ifile, dict): - ifile = {} - - # Render the mako template - - t = Template(filename=os.path.join( - script_dir, - "inventorysensor.mako.cpp")) - - output_cpp = os.path.join(output_dir, "inventory-sensor-gen.cpp") - with open(output_cpp, 'w') as fd: - fd.write(t.render(sensorDict=ifile)) - - -def main(): - - valid_commands = { - 'generate-cpp': generate_cpp - } - parser = argparse.ArgumentParser( - description="Inventory Object to IPMI SensorID code generator") - - parser.add_argument( - '-i', '--sensor_yaml', dest='sensor_yaml', - default='example.yaml', help='input sensor yaml file to parse') - - parser.add_argument( - "-o", "--output-dir", dest="outputdir", - default=".", - help="output directory") - - parser.add_argument( - 'command', metavar='COMMAND', type=str, - choices=valid_commands.keys(), - help='Command to run.') - - args = parser.parse_args() - - if (not (os.path.isfile(os.path.join(script_dir, args.sensor_yaml)))): - sys.exit("Can not find input yaml file " + args.sensor_yaml) - - function = valid_commands[args.command] - function(args.sensor_yaml, args.outputdir) - - -if __name__ == '__main__': - script_dir = os.path.dirname(os.path.realpath(__file__)) - main() diff --git a/scripts/inventorysensor.mako.cpp b/scripts/inventorysensor.mako.cpp deleted file mode 100644 index 000f758..0000000 --- a/scripts/inventorysensor.mako.cpp +++ /dev/null @@ -1,27 +0,0 @@ -## This file is a template. The comment below is emitted -## into the rendered file; feel free to edit this file. - -// !!! WARNING: This is a GENERATED Code..Please do NOT Edit !!! - -#include "types.hpp" -using namespace ipmi::sensor; - -extern const InvObjectIDMap invSensors = { -% for key in sensorDict.iterkeys(): - % if key: -{"${key}", - { -<% - objectPath = sensorDict[key] - sensorID = objectPath["sensorID"] - sensorType = objectPath["sensorType"] - eventReadingType = objectPath["eventReadingType"] - offset = objectPath["offset"] -%> - ${sensorID},${sensorType},${eventReadingType},${offset} - } -}, - % endif -% endfor -}; - diff --git a/storageaddsel.cpp b/storageaddsel.cpp index 1dde2a4..5cdf535 100644 --- a/storageaddsel.cpp +++ b/storageaddsel.cpp @@ -21,7 +21,6 @@ using namespace std; using namespace phosphor::logging; using namespace sdbusplus::xyz::openbmc_project::Logging::server; -extern const ipmi::sensor::InvObjectIDMap invSensors; ////////////////////////// struct esel_section_headers_t @@ -33,225 +32,6 @@ struct esel_section_headers_t uint8_t compid; }; -struct severity_values_t -{ - uint8_t type; - Entry::Level level; -}; - -const std::vector g_sev_desc = { - {0x10, Entry::Level::Warning}, // recoverable error - {0x20, Entry::Level::Warning}, // predictive error - // TODO via github issue 3066 : map level - // below to Level::Unrecoverable - {0x40, Entry::Level::Error}, // unrecoverable error - // TODO via github issue 3066 : map level below - // to Level::Critical - {0x50, Entry::Level::Error}, // critical error - {0x60, Entry::Level::Error}, // error from a diagnostic test - {0x70, Entry::Level::Warning}, // recoverable symptom - {0xFF, Entry::Level::Error}, // unknown error -}; - -Entry::Level sev_lookup(uint8_t n) -{ - auto i = - std::find_if(std::begin(g_sev_desc), std::end(g_sev_desc), - [n](auto p) { return p.type == n || p.type == 0xFF; }); - return i->level; -} - -int find_sensor_type_string(uint8_t sensor_number, char** s) -{ - - dbus_interface_t a; - int r; - - r = find_openbmc_path(sensor_number, &a); - - if ((r < 0) || (a.bus[0] == 0)) - { - // Just make a generic message for errors that - // occur on sensors that don't exist - r = asprintf(s, "Unknown Sensor (0x%02x)", sensor_number); - } - else - { - const char* p; - - if ((p = strrchr(a.path, '/')) == NULL) - { - p = "/Unknown Sensor"; - } - - *s = strdup(p + 1); - } - - return 0; -} - -size_t getfilestream(const char* fn, uint8_t** buffer) -{ - - FILE* fp; - ssize_t size = 0; - int r; - - if ((fp = fopen(fn, "rb")) != NULL) - { - - r = fseek(fp, 0, SEEK_END); - if (r) - { - log("Fseek failed"); - goto fclose_fp; - } - - size = ftell(fp); - if (size == -1L) - { - log("Ftell failed", entry("ERROR=%s", strerror(errno))); - size = 0; - goto fclose_fp; - } - - r = fseek(fp, 0, SEEK_SET); - if (r) - { - log("Fseek failed"); - size = 0; - goto fclose_fp; - } - - *buffer = new uint8_t[size]; - - r = fread(*buffer, 1, size, fp); - if (r != size) - { - size = 0; - log("Fread failed\n"); - } - - fclose_fp: - fclose(fp); - } - - return static_cast(size); -} - -Entry::Level create_esel_severity(const uint8_t* buffer) -{ - - uint8_t severity; - // Dive in to the IBM log to find the severity - severity = (0xF0 & buffer[0x4A]); - - return sev_lookup(severity); -} - -int create_esel_association(const uint8_t* buffer, std::string& inventoryPath) -{ - auto p = reinterpret_cast(buffer); - - uint8_t sensor = p->sensornumber; - - inventoryPath = {}; - - /* - * Search the sensor number to inventory path mapping to figure out the - * inventory associated with the ESEL. - */ - auto found = std::find_if(invSensors.begin(), invSensors.end(), - [&sensor](const auto& iter) { - return (iter.second.sensorID == sensor); - }); - if (found != invSensors.end()) - { - inventoryPath = found->first; - } - - return 0; -} - -int create_esel_description(const uint8_t* buffer, Entry::Level level, - char** message) -{ - char* m; - int r; - - auto p = reinterpret_cast(buffer); - - find_sensor_type_string(p->sensornumber, &m); - - r = asprintf(message, "A %s has experienced an error of level %d", m, - static_cast(level)); - if (r == -1) - { - log("Failed to allocate memory for ESEL description"); - } - - free(m); - - return 0; -} - -int send_esel_to_dbus(const char* desc, Entry::Level level, - const std::string& inventoryPath, uint8_t* debug, - size_t debuglen) -{ - - // Allocate enough space to represent the data in hex separated by spaces, - // to mimic how IPMI would display the data. - unique_ptr selData(new char[(debuglen * 3) + 1]()); - uint32_t i = 0; - for (i = 0; i < debuglen; i++) - { - sprintf(&selData[i * 3], "%02x ", 0xFF & ((char*)debug)[i]); - } - selData[debuglen * 3] = '\0'; - - using error = sdbusplus::org::open_power::Host::Error::Event; - using metadata = org::open_power::Host::Event; - - report(level, metadata::ESEL(selData.get()), - metadata::CALLOUT_INVENTORY_PATH(inventoryPath.c_str())); - - return 0; -} - -void send_esel(uint16_t recordid) -{ - char* desc; - uint8_t* buffer = NULL; - const char* path = "/tmp/esel"; - ssize_t sz; - int r; - std::string inventoryPath; - - sz = getfilestream(path, &buffer); - if (sz == 0) - { - log("Error file does not exist", - entry("FILENAME=%s", path)); - return; - } - - auto sev = create_esel_severity(buffer); - create_esel_association(buffer, inventoryPath); - create_esel_description(buffer, sev, &desc); - - r = send_esel_to_dbus(desc, sev, inventoryPath, buffer, sz); - if (r < 0) - { - log("Failed to send esel to dbus"); - } - - free(desc); - delete[] buffer; - - return; -} - std::string readESEL(const char* fileName) { std::string content; diff --git a/storageaddsel.hpp b/storageaddsel.hpp index c25ead3..e3065b0 100644 --- a/storageaddsel.hpp +++ b/storageaddsel.hpp @@ -2,8 +2,6 @@ #include -void send_esel(uint16_t recordid); - /** @brief Read eSEL data into a string * * @param[in] filename - filename of file containing eSEL diff --git a/storagehandler.cpp b/storagehandler.cpp index ebd0a20..36449ab 100644 --- a/storagehandler.cpp +++ b/storagehandler.cpp @@ -631,10 +631,6 @@ ipmi_ret_t ipmi_storage_add_sel(ipmi_netfn_t netfn, ipmi_cmd_t cmd, // procedure number. createProcedureLogEntry(p->sensortype); } - else - { - send_esel(recordid); - } return rc; } -- cgit v1.2.1