ncsi-cmd: Add a new executable for issuing NCSI commands

At the moment, the ncsi-netlink utility does two things:

 - allows management of the kernel NCSI state, such as the channel and
   package masks

 - allows issuing NCSI messages to the NCSI-capable NIC, through the
   NCSI_CMD_SEND_CMD interface

While these two things do share the same kernel API, they have somewhat
different objectives: one is controlling local state, the other is
controlling remote (ie, the NIC) state.

In future, we want to allow non-netlink-based NCSI transports for
issuing commands to the NIC, which makes the ncsi-netlink name somewhat
inaccurate for those.

So, introduce a new tool, 'ncsi-cmd', for issuing NCSI commands over the
netlink interface.

This has similar command-line semantics to the existing
'ncsi-netlink [...] -o <PAYLOAD>' usage, but has a few changes for a
more ergonomic UI:

Firstly, the type (or "opcode") byte is no longer packed into the
payload data, because it's not really payload.

Secondly, we use --interface/-i rather than --index/-x, with a note that
interfaces are specified by index. This allows for future changes that
allow specifying interfaces by name.

Finally, to make it clear that we can issue more than just OEM
commands, we have separate subcommands: "oem" and "raw". These are
similar, just that "oem" implies the standard OEM type value of 0x50.
So, the following are equivalent:

  ncsi-cmd -i2 -p0 oem 010203

  ncsi-cmd -i2 -p0 raw 0x50 010203

But now we have a cleaner interface for not-OEM commands:

  ncsi-cmd -i12 -p0 raw 0x15

For issuing command type 0x15, "Get Version ID".

We remove the send logic from ncsi-netlink, but leave a compatibility
shim that will exec() ncsi-cmd with the appropriate arguments instead.

Change-Id: Ied240db0d545d5770df0927da354c65b82ee9508
Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
4 files changed