In doing some more research, I put ASRock's MAC util through strings and it's become apparent that it's just issuing raw commands to the IPMI using the bundled asrripmi binary. Through some trial and error (I'm new to the whole reverse engineering thing) I was able to identify the commands sent and I can verify they work in regular ipmitool.
In my original situation, the problem was that the MAC addrs for eth0 (dedicated IPMI NIC) and eth1 (combo ethernet shared with mobo NIC via NCSI) were the same. These can also be read and set as follows:
Even better, ASRR posted a FAQ entry listing even more of their raw commands for fan control, most interestingly the ability to change the fan curves (temps vs. duty cycle) without needing to boot in to the BIOS. Their explanation lacks finesse so here goes:
The FAQ entry suggests that the IPMI settings page will at some point contain a GUI for this but it's not present on mine at least.
I suspect these raw values will hold true for all of their current IPMI implementations. I've tried looking through the IPMI image to see if there's any sort of a list or dictionary of IPMI raw values within it but sadly didn't find anything yet. If anyone knows of a method to see what the calls from the web UI actually do under the hood I'd love to hear about it.
Code:
# get current bonding status
ipmitool raw 0x32 0x72 0x01 0x00 0x00
# don't know what all the numbers mean, but:
# bonding on returns 01 00 01 00 00 00 01
# bonding off returns 00 00 01 00 00 00 01
Code:
# get eth0
ipmitool raw 0x3a 0xa1 0x00
# set eth0 MAC to de:ad:be:ef:ba:be
ipmitool raw 0x3a 0xa0 0x00 0xde 0xad 0xbe 0xef 0xba 0xbe
# get eth1
ipmitool raw 0x3a 0xa1 0x01
# set eth1 MAC to be:ef:f0:0d:ca:fe
ipmitool raw 0x3a 0xa0 0x01 0xbe 0xef 0xf0 0x0d 0xca 0xfe
Code:
# get fan duty cycles - returns a list of 12 duties (0x00 = 0%, 0x64 = 100%)
ipmitool raw 0x3a 0x06 0x01 0x00
00 2d 32 37 3c 41 46 4a 4e 52 56 5a
# get fan temp tables - returns a list of 12 temperatures (degrees C in hex values)
ipmitool raw 0x3a 0x06 0x02 0x00
# set a new duty cycle table with 11 values in it - looks like the raws accept decimal values so that makes it easy
ipmitool raw 0x3a 0x05 0x01 0x00 30 55 60 65 70 75 80 85 90 95 100
# set a new temp table, again 11 values needed and decimal works
ipmitool raw 0x3a 0x05 0x02 0x00 45 50 55 60 65 70 74 78 82 86 90
# from previous findings, get current settings for all 6 fans
ipmitool raw 0x3a 0x02
# set all 6 fans to various thresholds (last two values always 0x00)
0x00 - use smart fan tables vs. duty cycle values
0x04 through 0x64 - manually set duty cycle 0-100%
# the following sets FAN1 to smart fan, FAN2 and FAN3 to 50%, FAN4 to 100%, 5 and 6 on smart fan
ipmitool raw 0x3a 0x01 0x00 0x32 0x32 0x64 0x00 0x00 0x00 0x00
I suspect these raw values will hold true for all of their current IPMI implementations. I've tried looking through the IPMI image to see if there's any sort of a list or dictionary of IPMI raw values within it but sadly didn't find anything yet. If anyone knows of a method to see what the calls from the web UI actually do under the hood I'd love to hear about it.