)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"084429490857dc7895754d826e328375a01c93c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"12081487_898b4fff","updated":"2025-04-08 17:38:19.000000000","message":"This was reviewed as part of a PTG review jam, and includes feedback from multiple core reviewers.\n\nThis overall looks good; the only concern was how non-ethernet network interface cards will fare with this new code.","commit_id":"e445aefb7d16c3266b7481f6949d3eb6a70d591e"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"f528b51511d2080cf56313b1162ea921b96d52d6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"910d4a4c_331ea13d","in_reply_to":"12081487_898b4fff","updated":"2025-04-08 17:38:31.000000000","message":"Thanks, btw, this is cool!","commit_id":"e445aefb7d16c3266b7481f6949d3eb6a70d591e"},{"author":{"_account_id":31080,"name":"Nicolas Belouin","email":"nicolas.belouin@suse.com","username":"diconico07"},"change_message_id":"0990e3f685630e4af811a435993d4c8553a95765","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8a66dee3_e0ed175a","updated":"2025-04-25 10:10:06.000000000","message":"I added a release note entry and log when falling back to getting the effective MAC address.","commit_id":"b26ac141440754b8f1c7523b5d1254c6dceb97b4"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"f1a68a6d73ab8c93e634e5582df60c2b5e31483c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"74c21ed2_513ba21c","updated":"2025-04-18 19:52:51.000000000","message":"One more request: ideally this needs a release note, but I could go either way since this should (theoretically) be transparent to users.","commit_id":"b26ac141440754b8f1c7523b5d1254c6dceb97b4"},{"author":{"_account_id":31080,"name":"Nicolas Belouin","email":"nicolas.belouin@suse.com","username":"diconico07"},"change_message_id":"b965278fefbeb4e52794041a69b86a0ac5d82088","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a5431159_082ad5f7","updated":"2025-04-09 13:30:48.000000000","message":"Thanks for the quick review.\nI added reference for all the magic numbers so we can easily track them if they were to change.","commit_id":"b26ac141440754b8f1c7523b5d1254c6dceb97b4"},{"author":{"_account_id":31080,"name":"Nicolas Belouin","email":"nicolas.belouin@suse.com","username":"diconico07"},"change_message_id":"0990e3f685630e4af811a435993d4c8553a95765","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"6128f91a_bbdc76cc","in_reply_to":"74c21ed2_513ba21c","updated":"2025-04-25 10:10:06.000000000","message":"Added a \"fixes\" release note entry.","commit_id":"b26ac141440754b8f1c7523b5d1254c6dceb97b4"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"8fe8a2ce4921277ce47e495302f0bc0ea0ec31d6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d559c437_67aa3aac","updated":"2025-04-30 20:45:32.000000000","message":"I\u0027d feel a *lot* better about this change if we could get someone with IB cards to ensure we return a MAC in that case. A little quick research showed me that it looks like in linux, IB cards store their mac in a different field -- I\u0027m concerned that in the IB case, we\u0027ll get an invalid value instead of an OSError, which would be a regression.\n\nI have no idea how to test this without physical IB hardware :|. I\u0027ll see if I can get someone to run some test code for us 😊","commit_id":"48422a532fe20e6f4fe93784a5a948f773fb5701"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"be487e3e9565b8d393ad8c8e10d6216e03dfeee4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"0304e5e1_a5443952","updated":"2025-04-30 21:03:06.000000000","message":"I\u0027ve got someone running an extracted test version of this code against an IB interface. Please stand by :D \n\n```\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#   http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\nimport ctypes\nimport fcntl\nimport socket\n\nINTERFACE \u003d \"wlan0\"\n# SIOCETHTOOL from linux/sockios.h\nSIOCETHTOOL \u003d 0x8946\n# ETHTOOL_GPERMADDR from linux/ethtool.h\nETHTOOL_GPERMADDR \u003d 0x00000020\n# MAX_ADDR_LEN from linux/netdevice.h\nMAX_ADDR_LEN \u003d 32\n\nclass ethtoolPermAddr(ctypes.Structure):\n    \"\"\"Class for getting interface permanent MAC address\"\"\"\n    _fields_ \u003d [(\"cmd\", ctypes.c_uint32),\n                (\"size\", ctypes.c_uint32),\n                (\"data\", ctypes.c_uint8 * MAX_ADDR_LEN)]\n\nclass ifreq_data(ctypes.Union):\n    _fields_ \u003d [(\"ifr_flags\", ctypes.c_short),\n                (\n                    \"ifr_data_ethtool_perm_addr\",\n                    ctypes.POINTER(ethtoolPermAddr))]\n\nclass ifreq(ctypes.Structure):\n    \"\"\"Class for ioctl on socket.\"\"\"\n    _anonymous_ \u003d (\"ifr_data\",)\n    _fields_ \u003d [(\"ifr_ifrn\", ctypes.c_char * 16),\n                (\"ifr_data\", ifreq_data)]\n\ndef main():\n    data \u003d ethtoolPermAddr(cmd\u003dETHTOOL_GPERMADDR, size\u003dMAX_ADDR_LEN)\n    ifr \u003d ifreq(ifr_ifrn\u003dINTERFACE.encode())\n    ifr.ifr_data_ethtool_perm_addr \u003d ctypes.pointer(data)\n    sock \u003d socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)\n    fcntl.ioctl(sock.fileno(), SIOCETHTOOL, ifr)\n    # if not full of zeros\n    if any(data.data[:data.size]):\n        # kernel updates size to actual address size during ioctl call\n        permaddr \u003d [f\u0027{b:02x}\u0027 for b in data.data[:data.size]]\n        print(\u0027:\u0027.join(permaddr))\n    print(\"done\")\n\nif __name__ \u003d\u003d \"__main__\":\n    main()\n```\n\n(replace INTERFACE \u003d \"wlan0\" as appropriate)","commit_id":"48422a532fe20e6f4fe93784a5a948f773fb5701"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"f2e5934055029b0c35e23c1623412febac016003","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"b5d5b447_08375d3a","updated":"2025-04-27 12:34:57.000000000","message":"Just one question that does it be compatible with IB mode?","commit_id":"48422a532fe20e6f4fe93784a5a948f773fb5701"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"c999a5e2d9798c2269de67a3911b63aef8592f26","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"2bda3059_09acf713","updated":"2025-05-01 18:45:17.000000000","message":"The sample script returned the same physical address for IB that showed up in `ip link`. I have an extremely high level of confidence in this change.","commit_id":"48422a532fe20e6f4fe93784a5a948f773fb5701"},{"author":{"_account_id":31080,"name":"Nicolas Belouin","email":"nicolas.belouin@suse.com","username":"diconico07"},"change_message_id":"5b455ccf82fb0dadb7a37318736dd570fe367c6c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"27b004e9_c1569e30","in_reply_to":"b5d5b447_08375d3a","updated":"2025-04-28 08:43:41.000000000","message":"As said before, I did not test with real IB hardware, but the output is the same format as before, so it should work as expected with IB.","commit_id":"48422a532fe20e6f4fe93784a5a948f773fb5701"}],"ironic_python_agent/netutils.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"084429490857dc7895754d826e328375a01c93c1","unresolved":true,"context_lines":[{"line_number":36,"context_line":"SIOCSIFFLAGS \u003d 0x8914"},{"line_number":37,"context_line":"SIOCETHTOOL \u003d 0x8946"},{"line_number":38,"context_line":"ETHTOOL_GPERMADDR \u003d 0x00000020"},{"line_number":39,"context_line":"MAX_ADDR_LEN \u003d 32"},{"line_number":40,"context_line":"INFINIBAND_ADDR_LEN \u003d 59"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"# LLDP definitions needed to extract vlan information"}],"source_content_type":"text/x-python","patch_set":2,"id":"c2890367_c88636e4","line":39,"updated":"2025-04-08 17:38:19.000000000","message":"It would be a nice-to-have to document where the magic numbers come from. This feedback is not intended to block merge.","commit_id":"e445aefb7d16c3266b7481f6949d3eb6a70d591e"},{"author":{"_account_id":31080,"name":"Nicolas Belouin","email":"nicolas.belouin@suse.com","username":"diconico07"},"change_message_id":"b965278fefbeb4e52794041a69b86a0ac5d82088","unresolved":false,"context_lines":[{"line_number":36,"context_line":"SIOCSIFFLAGS \u003d 0x8914"},{"line_number":37,"context_line":"SIOCETHTOOL \u003d 0x8946"},{"line_number":38,"context_line":"ETHTOOL_GPERMADDR \u003d 0x00000020"},{"line_number":39,"context_line":"MAX_ADDR_LEN \u003d 32"},{"line_number":40,"context_line":"INFINIBAND_ADDR_LEN \u003d 59"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"# LLDP definitions needed to extract vlan information"}],"source_content_type":"text/x-python","patch_set":2,"id":"0c4ae420_a09e0fb0","line":39,"in_reply_to":"c2890367_c88636e4","updated":"2025-04-09 13:30:48.000000000","message":"Done","commit_id":"e445aefb7d16c3266b7481f6949d3eb6a70d591e"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"084429490857dc7895754d826e328375a01c93c1","unresolved":true,"context_lines":[{"line_number":265,"context_line":"        if any(data.data[:data.size]):"},{"line_number":266,"context_line":"            # kernel updates size to actual address size during ioctl call"},{"line_number":267,"context_line":"            permaddr \u003d [f\u0027{b:02x}\u0027 for b in data.data[:data.size]]"},{"line_number":268,"context_line":"            return \u0027:\u0027.join(permaddr)"},{"line_number":269,"context_line":"    except OSError:"},{"line_number":270,"context_line":"        pass"},{"line_number":271,"context_line":"    return get_default_ip_addr(socket.AF_PACKET, interface_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"4c53ed32_cd306b56","line":268,"updated":"2025-04-08 17:38:19.000000000","message":"The only question/concern in review is how this code will work when faced with an infiniband interface. Particularly, if the magic numbers are the same, infiniband link addresses are longer than ethernet ones. Let us know if you\u0027ve tested this.","commit_id":"e445aefb7d16c3266b7481f6949d3eb6a70d591e"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"f1a68a6d73ab8c93e634e5582df60c2b5e31483c","unresolved":true,"context_lines":[{"line_number":265,"context_line":"        if any(data.data[:data.size]):"},{"line_number":266,"context_line":"            # kernel updates size to actual address size during ioctl call"},{"line_number":267,"context_line":"            permaddr \u003d [f\u0027{b:02x}\u0027 for b in data.data[:data.size]]"},{"line_number":268,"context_line":"            return \u0027:\u0027.join(permaddr)"},{"line_number":269,"context_line":"    except OSError:"},{"line_number":270,"context_line":"        pass"},{"line_number":271,"context_line":"    return get_default_ip_addr(socket.AF_PACKET, interface_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"f0091604_178a4e03","line":268,"in_reply_to":"07228017_1aa4cab2","updated":"2025-04-18 19:52:51.000000000","message":"Some googling around, I couldn\u0027t find an official source, but it appears ethernet is 48 bit and IB is 64 bit. We should be good.","commit_id":"e445aefb7d16c3266b7481f6949d3eb6a70d591e"},{"author":{"_account_id":31080,"name":"Nicolas Belouin","email":"nicolas.belouin@suse.com","username":"diconico07"},"change_message_id":"b965278fefbeb4e52794041a69b86a0ac5d82088","unresolved":true,"context_lines":[{"line_number":265,"context_line":"        if any(data.data[:data.size]):"},{"line_number":266,"context_line":"            # kernel updates size to actual address size during ioctl call"},{"line_number":267,"context_line":"            permaddr \u003d [f\u0027{b:02x}\u0027 for b in data.data[:data.size]]"},{"line_number":268,"context_line":"            return \u0027:\u0027.join(permaddr)"},{"line_number":269,"context_line":"    except OSError:"},{"line_number":270,"context_line":"        pass"},{"line_number":271,"context_line":"    return get_default_ip_addr(socket.AF_PACKET, interface_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"07228017_1aa4cab2","line":268,"in_reply_to":"4c53ed32_cd306b56","updated":"2025-04-09 13:30:48.000000000","message":"The maximum size of the address here is 32 bytes and is from kernel\u0027s definition of maximum size for hardware address, so should be enough.\n\nI did not test this with infiniband since I don\u0027t have any on hand to test, my only concern here is formatting as I\u0027m not sure the expected format for an infiniband interface is colon separated hex.","commit_id":"e445aefb7d16c3266b7481f6949d3eb6a70d591e"},{"author":{"_account_id":31080,"name":"Nicolas Belouin","email":"nicolas.belouin@suse.com","username":"diconico07"},"change_message_id":"0990e3f685630e4af811a435993d4c8553a95765","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        if any(data.data[:data.size]):"},{"line_number":266,"context_line":"            # kernel updates size to actual address size during ioctl call"},{"line_number":267,"context_line":"            permaddr \u003d [f\u0027{b:02x}\u0027 for b in data.data[:data.size]]"},{"line_number":268,"context_line":"            return \u0027:\u0027.join(permaddr)"},{"line_number":269,"context_line":"    except OSError:"},{"line_number":270,"context_line":"        pass"},{"line_number":271,"context_line":"    return get_default_ip_addr(socket.AF_PACKET, interface_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"4fe8897c_be6585a3","line":268,"in_reply_to":"f0091604_178a4e03","updated":"2025-04-25 10:10:06.000000000","message":"Also checked formatting, it is consistent with what the current implementation outputs.","commit_id":"e445aefb7d16c3266b7481f6949d3eb6a70d591e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3e6e8417de7d2dfa40c1bd286c67ff00afb2cac8","unresolved":false,"context_lines":[{"line_number":271,"context_line":"            permaddr \u003d [f\u0027{b:02x}\u0027 for b in data.data[:data.size]]"},{"line_number":272,"context_line":"            return \u0027:\u0027.join(permaddr)"},{"line_number":273,"context_line":"    except OSError:"},{"line_number":274,"context_line":"        pass"},{"line_number":275,"context_line":"    return get_default_ip_addr(socket.AF_PACKET, interface_id)"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"d50be0c9_9627b997","line":274,"updated":"2025-04-22 10:52:58.000000000","message":"Let us log the exception here in case anyone will be wondering why the logic does not work.","commit_id":"b26ac141440754b8f1c7523b5d1254c6dceb97b4"},{"author":{"_account_id":31080,"name":"Nicolas Belouin","email":"nicolas.belouin@suse.com","username":"diconico07"},"change_message_id":"0990e3f685630e4af811a435993d4c8553a95765","unresolved":false,"context_lines":[{"line_number":271,"context_line":"            permaddr \u003d [f\u0027{b:02x}\u0027 for b in data.data[:data.size]]"},{"line_number":272,"context_line":"            return \u0027:\u0027.join(permaddr)"},{"line_number":273,"context_line":"    except OSError:"},{"line_number":274,"context_line":"        pass"},{"line_number":275,"context_line":"    return get_default_ip_addr(socket.AF_PACKET, interface_id)"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5ca8cb33_1df94c83","line":274,"in_reply_to":"d50be0c9_9627b997","updated":"2025-04-25 10:10:06.000000000","message":"Added a log when we fall back, so that it is more explicit when we do.\nDid not log the exception itself, as the kernel will not give any meaningful failure reason here.","commit_id":"b26ac141440754b8f1c7523b5d1254c6dceb97b4"}]}
