diff options
-rw-r--r-- | Makefile.am | 6 | ||||
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | net.cpp | 17 | ||||
-rw-r--r-- | scripts/channel-example.yaml | 6 | ||||
-rwxr-xr-x | scripts/channel_gen.py | 60 | ||||
-rw-r--r-- | scripts/writechannel.mako.cpp | 20 | ||||
-rw-r--r-- | types.hpp | 1 |
7 files changed, 101 insertions, 13 deletions
diff --git a/Makefile.am b/Makefile.am index 99808ab..8190320 100644 --- a/Makefile.am +++ b/Makefile.am @@ -15,7 +15,8 @@ BUILT_SOURCES = \ ipmiwhitelist.cpp \ sensor-gen.cpp \ inventory-sensor-gen.cpp \ - fru-read-gen.cpp + fru-read-gen.cpp \ + channel-gen.cpp CLEANFILES = $(BUILT_SOURCES) @@ -46,6 +47,9 @@ inventory-sensor-gen.cpp: fru-read-gen.cpp: $(AM_V_GEN)@FRUGEN@ -o $(top_builddir) generate-cpp +channel-gen.cpp: + $(AM_V_GEN)@CHANNELGEN@ -o $(top_builddir) generate-cpp + libapphandlerdir = ${libdir}/ipmid-providers libapphandler_LTLIBRARIES = libapphandler.la libapphandler_la_SOURCES = \ diff --git a/configure.ac b/configure.ac index a041971..4d52659 100644 --- a/configure.ac +++ b/configure.ac @@ -88,6 +88,10 @@ 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) +AS_IF([test "x$CHANNEL_YAML_GEN" == "x"], [CHANNEL_YAML_GEN="channel-example.yaml"]) +CHANNELGEN="$PYTHON ${srcdir}/scripts/channel_gen.py -i $CHANNEL_YAML_GEN" +AC_SUBST(CHANNELGEN) + AC_DEFINE(CALLOUT_FWD_ASSOCIATION, "callout", [The name of the callout's forward association.]) AC_DEFINE(BOARD_SENSOR, "/xyz/openbmc_project/inventory/system/chassis/motherboard", [The inventory path to the motherboard fault sensor.]) AC_DEFINE(SYSTEM_SENSOR, "/xyz/openbmc_project/inventory/system", [The inventory path to the system event sensor.]) @@ -1,6 +1,8 @@ #include <map> #include <string> +#include "utils.hpp" + // Not sure if this should live in utils. Because it's really a per-system // configuration, instead of just hard-coding channel 1 to be eth0, one could // conceivably configure it however they pleased. @@ -12,23 +14,14 @@ namespace ipmi namespace network { -// This map should come from a configuration yaml. -// Also, no need to really be a map, could be just an array -// we index into by channel. :D -std::map<int, std::string> ethDeviceMap = { - {1, "eth0"}, - {2, "eth1"}, -}; - +extern const ipmi::network::ChannelEthMap ethdevices; // Given a channel number, return a matching ethernet device, or empty string // if there is no match. -// TODO provide this from a configuration: -// https://github.com/openbmc/openbmc/issues/2667 std::string ChanneltoEthernet(int channel) { - auto dev = ethDeviceMap.find(channel); - if (dev == ethDeviceMap.end()) + auto dev = ethdevices.find(channel); + if (dev == ethdevices.end()) { return ""; } diff --git a/scripts/channel-example.yaml b/scripts/channel-example.yaml new file mode 100644 index 0000000..819f251 --- /dev/null +++ b/scripts/channel-example.yaml @@ -0,0 +1,6 @@ +# Channel Number (must be unique) is the key +1: + # ifName the ethernet device name (used in the dbus path) + ifName: eth0 +2: + ifName: eth1 diff --git a/scripts/channel_gen.py b/scripts/channel_gen.py new file mode 100755 index 0000000..77fbd2e --- /dev/null +++ b/scripts/channel_gen.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +import os +import sys +import yaml +import argparse +from mako.template import Template + + +def generate_cpp(interface_yaml, output_dir): + with open(os.path.join(script_dir, interface_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, + "writechannel.mako.cpp")) + + output_cpp = os.path.join(output_dir, "channel-gen.cpp") + with open(output_cpp, 'w') as fd: + fd.write(t.render(interfaceDict=ifile)) + + +def main(): + + valid_commands = { + 'generate-cpp': generate_cpp + } + parser = argparse.ArgumentParser( + description="IPMI ethernet interface parser and code generator") + + parser.add_argument( + '-i', '--interface_yaml', dest='interface_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.interface_yaml)))): + sys.exit("Can not find input yaml file " + args.interface_yaml) + + function = valid_commands[args.command] + function(args.interface_yaml, args.outputdir) + + +if __name__ == '__main__': + script_dir = os.path.dirname(os.path.realpath(__file__)) + main() diff --git a/scripts/writechannel.mako.cpp b/scripts/writechannel.mako.cpp new file mode 100644 index 0000000..922611a --- /dev/null +++ b/scripts/writechannel.mako.cpp @@ -0,0 +1,20 @@ +## 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" + +namespace ipmi +{ +namespace network +{ + +extern const ChannelEthMap ethdevices = { +% for channel,channelInfo in interfaceDict.iteritems(): + {${channel},"${channelInfo['ifName']}"}, +% endfor +}; + +} // namespace network +} // namespace ipmi + @@ -181,6 +181,7 @@ using InvObjectIDMap = std::map<InventoryPath, SelData>; namespace network { +using ChannelEthMap = std::map<int, std::string>; constexpr auto MAC_ADDRESS_FORMAT = "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx"; constexpr auto IP_ADDRESS_FORMAT = "%u.%u.%u.%u"; |