)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"379f30245ba3642a302afdbb28ddf8acd4f011d0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"feb375a2_90407143","updated":"2023-02-02 17:28:17.000000000","message":"Overall I am a lot happier with this now. The code itself looks mostly good, just the tests needs some work still.","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"719c8ae2edda0514201075f611f3996bf25371a9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"4c8d04b5_8cd185b4","updated":"2023-02-07 15:27:48.000000000","message":"One last typo, otherwise this is now good.","commit_id":"754b60138446846b0ecdff6ead7e35294e2d82f2"}],"go/net/psample/psample_test.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"379f30245ba3642a302afdbb28ddf8acd4f011d0","unresolved":true,"context_lines":[{"line_number":35,"context_line":"\t\tt.Fatalf(\"while adding link: %v\", err)"},{"line_number":36,"context_line":"\t}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"\tlink, err :\u003d netlink.LinkByName(name)"},{"line_number":39,"context_line":"\tif err !\u003d nil {"},{"line_number":40,"context_line":"\t\tt.Fatalf(\"while looking up link: %v\", err)"},{"line_number":41,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":9,"id":"b70e263c_871f5343","line":38,"range":{"start_line":38,"start_character":14,"end_line":38,"end_character":32},"updated":"2023-02-02 17:28:17.000000000","message":"You can do this instead:\n\n```\ncaptureLnk :\u003d netlink.Dummy{...}\n... :\u003d netlink.LinkAdd(\u0026captureLnk)\n... :\u003d netlink.LinkSetUp(\u0026captureLnk)\n```\n\nLinkAdd will add the ifindex into the passed link, saving you the LinkByName call.","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c037cd77fd9bbca4ea7958575630d6aa416458d0","unresolved":false,"context_lines":[{"line_number":35,"context_line":"\t\tt.Fatalf(\"while adding link: %v\", err)"},{"line_number":36,"context_line":"\t}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"\tlink, err :\u003d netlink.LinkByName(name)"},{"line_number":39,"context_line":"\tif err !\u003d nil {"},{"line_number":40,"context_line":"\t\tt.Fatalf(\"while looking up link: %v\", err)"},{"line_number":41,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":9,"id":"40a4bf10_688ec800","line":38,"range":{"start_line":38,"start_character":14,"end_line":38,"end_character":32},"in_reply_to":"b70e263c_871f5343","updated":"2023-02-06 11:58:39.000000000","message":"Done","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"379f30245ba3642a302afdbb28ddf8acd4f011d0","unresolved":false,"context_lines":[{"line_number":48,"context_line":"// setupQdisc registers a clsact qdisc, which works on both the ingress and"},{"line_number":49,"context_line":"// the egress. This is important as we\u0027ll be sampling packets leaving the test"},{"line_number":50,"context_line":"// interface \u0027lk\u0027. The qdisc is registered with the link lk."},{"line_number":51,"context_line":"// More on clsact: https://lwn.net/Articles/671458/"},{"line_number":52,"context_line":"func setupQdisc(t *testing.T, lk netlink.Link) netlink.GenericQdisc {"},{"line_number":53,"context_line":"\tt.Helper()"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-go","patch_set":9,"id":"ef802844_3fc6aff9","line":51,"range":{"start_line":51,"start_character":3,"end_line":51,"end_character":51},"updated":"2023-02-02 17:28:17.000000000","message":"👍","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"379f30245ba3642a302afdbb28ddf8acd4f011d0","unresolved":true,"context_lines":[{"line_number":72,"context_line":"\tt.Helper()"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"\tsa :\u003d netlink.NewSampleAction()"},{"line_number":75,"context_line":"\tsa.Group \u003d 7"},{"line_number":76,"context_line":"\t// Every 10th packet will be sampled."},{"line_number":77,"context_line":"\tsa.Rate \u003d 10"},{"line_number":78,"context_line":"\t// Packet samples will be truncated to sa.TruncSize."}],"source_content_type":"text/x-go","patch_set":9,"id":"9143c6c0_b3c90cf3","line":75,"range":{"start_line":75,"start_character":4,"end_line":75,"end_character":9},"updated":"2023-02-02 17:28:17.000000000","message":"If you\u0027re going to comment all of those, this is IMO the most non-self-explanatory property of the sample action, thus most in need of a comment.","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c037cd77fd9bbca4ea7958575630d6aa416458d0","unresolved":false,"context_lines":[{"line_number":72,"context_line":"\tt.Helper()"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"\tsa :\u003d netlink.NewSampleAction()"},{"line_number":75,"context_line":"\tsa.Group \u003d 7"},{"line_number":76,"context_line":"\t// Every 10th packet will be sampled."},{"line_number":77,"context_line":"\tsa.Rate \u003d 10"},{"line_number":78,"context_line":"\t// Packet samples will be truncated to sa.TruncSize."}],"source_content_type":"text/x-go","patch_set":9,"id":"c7a689c9_427b294e","line":75,"range":{"start_line":75,"start_character":4,"end_line":75,"end_character":9},"in_reply_to":"9143c6c0_b3c90cf3","updated":"2023-02-06 11:58:39.000000000","message":"Done","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"379f30245ba3642a302afdbb28ddf8acd4f011d0","unresolved":true,"context_lines":[{"line_number":96,"context_line":"\t}"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"\t// Make sure that a correct filter has been added."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"\tfs, err :\u003d netlink.FilterList(lk, netlink.HANDLE_MIN_EGRESS)"},{"line_number":101,"context_line":"\tif err !\u003d nil {"},{"line_number":102,"context_line":"\t\tt.Fatalf(\"while listing filters: %v\", err)"},{"line_number":103,"context_line":"\t}"},{"line_number":104,"context_line":"\tif want, got :\u003d 1, len(fs); want !\u003d got {"},{"line_number":105,"context_line":"\t\tt.Fatalf(\"expected %d filters, got %d\", want, got)"},{"line_number":106,"context_line":"\t}"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"\tqf, ok :\u003d fs[0].(*netlink.MatchAll)"},{"line_number":109,"context_line":"\tif !ok {"},{"line_number":110,"context_line":"\t\tt.Fatal(\"expected different filter type\")"},{"line_number":111,"context_line":"\t}"},{"line_number":112,"context_line":"\tif qf.ClassId !\u003d fcid {"},{"line_number":113,"context_line":"\t\tt.Fatal(\"expected different filter ClassId\")"},{"line_number":114,"context_line":"\t}"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"\tqsa, ok :\u003d qf.Actions[0].(*netlink.SampleAction)"},{"line_number":117,"context_line":"\tif !ok {"},{"line_number":118,"context_line":"\t\tt.Fatal(\"expected different filter action type\")"},{"line_number":119,"context_line":"\t}"},{"line_number":120,"context_line":"\tif qsa.Group !\u003d sa.Group {"},{"line_number":121,"context_line":"\t\tt.Fatal(\"inconsistent sample action group\")"},{"line_number":122,"context_line":"\t}"},{"line_number":123,"context_line":"\tif qsa.Rate !\u003d sa.Rate {"},{"line_number":124,"context_line":"\t\tt.Fatal(\"inconsistent sample action rate\")"},{"line_number":125,"context_line":"\t}"},{"line_number":126,"context_line":"\tif qsa.TruncSize !\u003d sa.TruncSize {"},{"line_number":127,"context_line":"\t\tt.Fatal(\"inconsistent sample action size\")"},{"line_number":128,"context_line":"\t}"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"\treturn qf"},{"line_number":131,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":9,"id":"5b95fbb3_28cbee7a","line":128,"range":{"start_line":99,"start_character":0,"end_line":128,"end_character":2},"updated":"2023-02-02 17:28:17.000000000","message":"Why are we testing if the filter was added correctly? This is third-party code, right? Doesn\u0027t FilterAdd error out if the filter is broken?","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c037cd77fd9bbca4ea7958575630d6aa416458d0","unresolved":false,"context_lines":[{"line_number":96,"context_line":"\t}"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"\t// Make sure that a correct filter has been added."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"\tfs, err :\u003d netlink.FilterList(lk, netlink.HANDLE_MIN_EGRESS)"},{"line_number":101,"context_line":"\tif err !\u003d nil {"},{"line_number":102,"context_line":"\t\tt.Fatalf(\"while listing filters: %v\", err)"},{"line_number":103,"context_line":"\t}"},{"line_number":104,"context_line":"\tif want, got :\u003d 1, len(fs); want !\u003d got {"},{"line_number":105,"context_line":"\t\tt.Fatalf(\"expected %d filters, got %d\", want, got)"},{"line_number":106,"context_line":"\t}"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"\tqf, ok :\u003d fs[0].(*netlink.MatchAll)"},{"line_number":109,"context_line":"\tif !ok {"},{"line_number":110,"context_line":"\t\tt.Fatal(\"expected different filter type\")"},{"line_number":111,"context_line":"\t}"},{"line_number":112,"context_line":"\tif qf.ClassId !\u003d fcid {"},{"line_number":113,"context_line":"\t\tt.Fatal(\"expected different filter ClassId\")"},{"line_number":114,"context_line":"\t}"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"\tqsa, ok :\u003d qf.Actions[0].(*netlink.SampleAction)"},{"line_number":117,"context_line":"\tif !ok {"},{"line_number":118,"context_line":"\t\tt.Fatal(\"expected different filter action type\")"},{"line_number":119,"context_line":"\t}"},{"line_number":120,"context_line":"\tif qsa.Group !\u003d sa.Group {"},{"line_number":121,"context_line":"\t\tt.Fatal(\"inconsistent sample action group\")"},{"line_number":122,"context_line":"\t}"},{"line_number":123,"context_line":"\tif qsa.Rate !\u003d sa.Rate {"},{"line_number":124,"context_line":"\t\tt.Fatal(\"inconsistent sample action rate\")"},{"line_number":125,"context_line":"\t}"},{"line_number":126,"context_line":"\tif qsa.TruncSize !\u003d sa.TruncSize {"},{"line_number":127,"context_line":"\t\tt.Fatal(\"inconsistent sample action size\")"},{"line_number":128,"context_line":"\t}"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"\treturn qf"},{"line_number":131,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":9,"id":"501a372d_3ac1fe4b","line":128,"range":{"start_line":99,"start_character":0,"end_line":128,"end_character":2},"in_reply_to":"5b95fbb3_28cbee7a","updated":"2023-02-06 11:58:39.000000000","message":"Out of abundance of caution. I imagine there are multiple things that could go wrong while applying the filter struct. This is covered by the tests in vishvananda/netlink, however I can\u0027t tell whether their test coverage is complete. I removed this part.","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"379f30245ba3642a302afdbb28ddf8acd4f011d0","unresolved":true,"context_lines":[{"line_number":184,"context_line":"\t// which will enable routing for the test packets."},{"line_number":185,"context_line":"\tvar localA \u003d netlink.Addr{"},{"line_number":186,"context_line":"\t\tIPNet: \u0026net.IPNet{"},{"line_number":187,"context_line":"\t\t\tIP:   net.IPv4(1, 2, 3, 4),"},{"line_number":188,"context_line":"\t\t\tMask: net.CIDRMask(24, 32),"},{"line_number":189,"context_line":"\t\t},"},{"line_number":190,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":9,"id":"a852ee53_df0d7f0b","line":187,"range":{"start_line":187,"start_character":18,"end_line":187,"end_character":28},"updated":"2023-02-02 17:28:17.000000000","message":"I know this should only be used in a ktest, but I\u0027d still prefer private-use space for this.","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c037cd77fd9bbca4ea7958575630d6aa416458d0","unresolved":false,"context_lines":[{"line_number":184,"context_line":"\t// which will enable routing for the test packets."},{"line_number":185,"context_line":"\tvar localA \u003d netlink.Addr{"},{"line_number":186,"context_line":"\t\tIPNet: \u0026net.IPNet{"},{"line_number":187,"context_line":"\t\t\tIP:   net.IPv4(1, 2, 3, 4),"},{"line_number":188,"context_line":"\t\t\tMask: net.CIDRMask(24, 32),"},{"line_number":189,"context_line":"\t\t},"},{"line_number":190,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":9,"id":"b0354b59_12e7d299","line":187,"range":{"start_line":187,"start_character":18,"end_line":187,"end_character":28},"in_reply_to":"a852ee53_df0d7f0b","updated":"2023-02-06 11:58:39.000000000","message":"Done","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"379f30245ba3642a302afdbb28ddf8acd4f011d0","unresolved":true,"context_lines":[{"line_number":208,"context_line":"\t// egress traffic."},{"line_number":209,"context_line":"\tvar dstA \u003d netlink.Addr{"},{"line_number":210,"context_line":"\t\tIPNet: \u0026net.IPNet{"},{"line_number":211,"context_line":"\t\t\tIP:   net.IPv4(1, 2, 3, 5),"},{"line_number":212,"context_line":"\t\t\tMask: net.CIDRMask(24, 32),"},{"line_number":213,"context_line":"\t\t},"},{"line_number":214,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":9,"id":"7ffae685_8d4afbf7","line":211,"range":{"start_line":211,"start_character":17,"end_line":211,"end_character":29},"updated":"2023-02-02 17:28:17.000000000","message":"Same as above.","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c037cd77fd9bbca4ea7958575630d6aa416458d0","unresolved":false,"context_lines":[{"line_number":208,"context_line":"\t// egress traffic."},{"line_number":209,"context_line":"\tvar dstA \u003d netlink.Addr{"},{"line_number":210,"context_line":"\t\tIPNet: \u0026net.IPNet{"},{"line_number":211,"context_line":"\t\t\tIP:   net.IPv4(1, 2, 3, 5),"},{"line_number":212,"context_line":"\t\t\tMask: net.CIDRMask(24, 32),"},{"line_number":213,"context_line":"\t\t},"},{"line_number":214,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":9,"id":"0c7d7630_d8b57b4f","line":211,"range":{"start_line":211,"start_character":17,"end_line":211,"end_character":29},"in_reply_to":"7ffae685_8d4afbf7","updated":"2023-02-06 11:58:39.000000000","message":"Done","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"379f30245ba3642a302afdbb28ddf8acd4f011d0","unresolved":true,"context_lines":[{"line_number":218,"context_line":"\t// - contain a magic payload"},{"line_number":219,"context_line":"\tsa :\u003d packetAttrs{"},{"line_number":220,"context_line":"\t\tmagic:   \"test datagram\","},{"line_number":221,"context_line":"\t\toifName: \"if1\","},{"line_number":222,"context_line":"\t}"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"\t// Look for packets matching attributes defined in \u0027sa\u0027. Signal on \u0027dC\u0027"}],"source_content_type":"text/x-go","patch_set":9,"id":"299a5ff3_ea00a871","line":221,"range":{"start_line":221,"start_character":2,"end_line":221,"end_character":9},"updated":"2023-02-02 17:28:17.000000000","message":"You can use the index (available in lk.Attrs().Index) here and in match, saving a bunch of code while accomplishing the same.","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c037cd77fd9bbca4ea7958575630d6aa416458d0","unresolved":false,"context_lines":[{"line_number":218,"context_line":"\t// - contain a magic payload"},{"line_number":219,"context_line":"\tsa :\u003d packetAttrs{"},{"line_number":220,"context_line":"\t\tmagic:   \"test datagram\","},{"line_number":221,"context_line":"\t\toifName: \"if1\","},{"line_number":222,"context_line":"\t}"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"\t// Look for packets matching attributes defined in \u0027sa\u0027. Signal on \u0027dC\u0027"}],"source_content_type":"text/x-go","patch_set":9,"id":"5f0b8c96_653366b2","line":221,"range":{"start_line":221,"start_character":2,"end_line":221,"end_character":9},"in_reply_to":"299a5ff3_ea00a871","updated":"2023-02-06 11:58:39.000000000","message":"I didn\u0027t mean the test code to be minimal, and rather to also to serve as a practical guide for anyone interested in packet sampling, but sure.","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"379f30245ba3642a302afdbb28ddf8acd4f011d0","unresolved":true,"context_lines":[{"line_number":224,"context_line":"\t// Look for packets matching attributes defined in \u0027sa\u0027. Signal on \u0027dC\u0027"},{"line_number":225,"context_line":"\t// immediately after the expected packet has been received, then return."},{"line_number":226,"context_line":"\tdC :\u003d make(chan struct{})"},{"line_number":227,"context_line":"\tgo func() {"},{"line_number":228,"context_line":"\t\tfor {"},{"line_number":229,"context_line":"\t\t\tpkts, err :\u003d Receive(c)"},{"line_number":230,"context_line":"\t\t\t// Receiving ENOBUFS is expected in this case. It signals that some of"}],"source_content_type":"text/x-go","patch_set":9,"id":"57304c94_17a9e22d","line":227,"range":{"start_line":227,"start_character":1,"end_line":227,"end_character":12},"updated":"2023-02-02 17:28:17.000000000","message":"Only spawn one goroutine, the test routine currently just waits.","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c037cd77fd9bbca4ea7958575630d6aa416458d0","unresolved":false,"context_lines":[{"line_number":224,"context_line":"\t// Look for packets matching attributes defined in \u0027sa\u0027. Signal on \u0027dC\u0027"},{"line_number":225,"context_line":"\t// immediately after the expected packet has been received, then return."},{"line_number":226,"context_line":"\tdC :\u003d make(chan struct{})"},{"line_number":227,"context_line":"\tgo func() {"},{"line_number":228,"context_line":"\t\tfor {"},{"line_number":229,"context_line":"\t\t\tpkts, err :\u003d Receive(c)"},{"line_number":230,"context_line":"\t\t\t// Receiving ENOBUFS is expected in this case. It signals that some of"}],"source_content_type":"text/x-go","patch_set":9,"id":"726065ec_3f7ee8d2","line":227,"range":{"start_line":227,"start_character":1,"end_line":227,"end_character":12},"in_reply_to":"57304c94_17a9e22d","updated":"2023-02-06 11:58:39.000000000","message":"Done","commit_id":"89578380b544be2279fca5418386a47b8e86afee"}],"go/net/psample/subscriber.go":[{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f50f14248b45ddd5123d7404a999ea22ad0fffd2","unresolved":true,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"// attrId identifies psample netlink message attributes."},{"line_number":15,"context_line":"// Identifier numbers are based on psample kernel module sources:"},{"line_number":16,"context_line":"//  https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/"},{"line_number":17,"context_line":"//  tree/include/uapi/linux/psample.h?h\u003dv5.15.89#n5"},{"line_number":18,"context_line":"type attrId uint16"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"const ("},{"line_number":21,"context_line":"\tattrData attrId \u003d 6"}],"source_content_type":"text/x-go","patch_set":2,"id":"b6478d63_3d97088b","line":18,"range":{"start_line":16,"start_character":0,"end_line":18,"end_character":0},"updated":"2023-01-23 17:41:49.000000000","message":"nit: can\u0027t click Ctrl-click this :-) Iirc, the line length annoy-a-tron allows links?","commit_id":"7576f87f6e53d1bf4ec0c1be6c016709d08e788d"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"8acbfb9940e11e5c35db12d3e4311bc38838c027","unresolved":true,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"// attrId identifies psample netlink message attributes."},{"line_number":15,"context_line":"// Identifier numbers are based on psample kernel module sources:"},{"line_number":16,"context_line":"//  https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/"},{"line_number":17,"context_line":"//  tree/include/uapi/linux/psample.h?h\u003dv5.15.89#n5"},{"line_number":18,"context_line":"type attrId uint16"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"const ("},{"line_number":21,"context_line":"\tattrData attrId \u003d 6"}],"source_content_type":"text/x-go","patch_set":2,"id":"e7188cd5_8b5cdb62","line":18,"range":{"start_line":16,"start_character":0,"end_line":18,"end_character":0},"in_reply_to":"b6478d63_3d97088b","updated":"2023-01-30 16:27:57.000000000","message":"I just checked - gofmt doesn\u0027t seem allow this.","commit_id":"7576f87f6e53d1bf4ec0c1be6c016709d08e788d"},{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"8c363e802a0fbfc6f795bf8209fe5d46b702ebe7","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"// attrId identifies psample netlink message attributes."},{"line_number":15,"context_line":"// Identifier numbers are based on psample kernel module sources:"},{"line_number":16,"context_line":"//  https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/"},{"line_number":17,"context_line":"//  tree/include/uapi/linux/psample.h?h\u003dv5.15.89#n5"},{"line_number":18,"context_line":"type attrId uint16"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"const ("},{"line_number":21,"context_line":"\tattrData attrId \u003d 6"}],"source_content_type":"text/x-go","patch_set":2,"id":"e2dd4e1c_da505324","line":18,"range":{"start_line":16,"start_character":0,"end_line":18,"end_character":0},"in_reply_to":"e7188cd5_8b5cdb62","updated":"2023-01-31 18:31:00.000000000","message":"Done","commit_id":"7576f87f6e53d1bf4ec0c1be6c016709d08e788d"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2d75d6efed82cf466e60ab6dfdaa09aecca04cc8","unresolved":true,"context_lines":[{"line_number":1,"context_line":"// This package contains a minimal golang psample packet subscriber/receiver."},{"line_number":2,"context_line":"package psample"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"import ("}],"source_content_type":"text/x-go","patch_set":7,"id":"3522f4c6_6c454066","line":1,"range":{"start_line":1,"start_character":3,"end_line":1,"end_character":77},"updated":"2023-02-01 12:38:01.000000000","message":"I\u0027d prefer something like\n```suggestion\n// Package psample provides a receiver for sampled network packets using the Netlink psample interface.\n```\nThis first covers what it does and what API it uses to do it.","commit_id":"7a2f97d70d8d654b42bb5f7b344a2ab147980431"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"30946af542b2f8d42c338a3a33baa439ec2ad666","unresolved":false,"context_lines":[{"line_number":1,"context_line":"// This package contains a minimal golang psample packet subscriber/receiver."},{"line_number":2,"context_line":"package psample"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"import ("}],"source_content_type":"text/x-go","patch_set":7,"id":"3767cafa_00076a0e","line":1,"range":{"start_line":1,"start_character":3,"end_line":1,"end_character":77},"in_reply_to":"3522f4c6_6c454066","updated":"2023-02-01 13:49:43.000000000","message":"Done","commit_id":"7a2f97d70d8d654b42bb5f7b344a2ab147980431"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2d75d6efed82cf466e60ab6dfdaa09aecca04cc8","unresolved":true,"context_lines":[{"line_number":4,"context_line":"import ("},{"line_number":5,"context_line":"\t\"fmt\""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\t\"github.com/mdlayher/genetlink\""},{"line_number":8,"context_line":"\tmdn \"github.com/mdlayher/netlink\""},{"line_number":9,"context_line":"\t\"github.com/vishvananda/netlink\""},{"line_number":10,"context_line":"\t\"github.com/vishvananda/netlink/nl\""},{"line_number":11,"context_line":"\t\"golang.org/x/sys/unix\""},{"line_number":12,"context_line":")"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"// attrId identifies psample netlink message attributes."}],"source_content_type":"text/x-go","patch_set":7,"id":"aee725f1_e287d172","line":11,"range":{"start_line":7,"start_character":0,"end_line":11,"end_character":0},"updated":"2023-02-01 12:38:01.000000000","message":"Try to use genetlink exclusively for this. This should save you quite a bit of duplicate code.","commit_id":"7a2f97d70d8d654b42bb5f7b344a2ab147980431"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"05414ee01522043525f4afb61b333a5f5c9a1734","unresolved":true,"context_lines":[{"line_number":4,"context_line":"import ("},{"line_number":5,"context_line":"\t\"fmt\""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\t\"github.com/mdlayher/genetlink\""},{"line_number":8,"context_line":"\tmdn \"github.com/mdlayher/netlink\""},{"line_number":9,"context_line":"\t\"github.com/vishvananda/netlink\""},{"line_number":10,"context_line":"\t\"github.com/vishvananda/netlink/nl\""},{"line_number":11,"context_line":"\t\"golang.org/x/sys/unix\""},{"line_number":12,"context_line":")"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"// attrId identifies psample netlink message attributes."}],"source_content_type":"text/x-go","patch_set":7,"id":"6a19c8dd_20ccbc68","line":11,"range":{"start_line":7,"start_character":0,"end_line":11,"end_character":0},"in_reply_to":"07fc3647_e09d4aa9","updated":"2023-02-01 17:01:33.000000000","message":"Regarding the first paragraph: OK, I wasn\u0027t aware of the existence of net.Interface. This makes more sense.\n\nHow would you encode all the integer and slice optional values in a struct like that, idiomatically?","commit_id":"7a2f97d70d8d654b42bb5f7b344a2ab147980431"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"8abeb9a2f8d63e7560b79e1244477c89a87e2525","unresolved":true,"context_lines":[{"line_number":4,"context_line":"import ("},{"line_number":5,"context_line":"\t\"fmt\""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\t\"github.com/mdlayher/genetlink\""},{"line_number":8,"context_line":"\tmdn \"github.com/mdlayher/netlink\""},{"line_number":9,"context_line":"\t\"github.com/vishvananda/netlink\""},{"line_number":10,"context_line":"\t\"github.com/vishvananda/netlink/nl\""},{"line_number":11,"context_line":"\t\"golang.org/x/sys/unix\""},{"line_number":12,"context_line":")"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"// attrId identifies psample netlink message attributes."}],"source_content_type":"text/x-go","patch_set":7,"id":"a2bb0f1f_6dd70a3d","line":11,"range":{"start_line":7,"start_character":0,"end_line":11,"end_character":0},"in_reply_to":"3ba9b2bb_94079f60","updated":"2023-02-01 14:16:47.000000000","message":"OK, I still don\u0027t think the result would be more concise or easy to read based on the implementation in mdlayher/quota, quite the opposite. I could strive to make it pure by trying to use the genetlink implementation as it was intended to be used, but IMHO there\u0027s no point. Would you agree, @lorenz@monogon.tech?","commit_id":"7a2f97d70d8d654b42bb5f7b344a2ab147980431"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"fd661153044e37157e7245c37c0334602fbe4326","unresolved":false,"context_lines":[{"line_number":4,"context_line":"import ("},{"line_number":5,"context_line":"\t\"fmt\""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\t\"github.com/mdlayher/genetlink\""},{"line_number":8,"context_line":"\tmdn \"github.com/mdlayher/netlink\""},{"line_number":9,"context_line":"\t\"github.com/vishvananda/netlink\""},{"line_number":10,"context_line":"\t\"github.com/vishvananda/netlink/nl\""},{"line_number":11,"context_line":"\t\"golang.org/x/sys/unix\""},{"line_number":12,"context_line":")"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"// attrId identifies psample netlink message attributes."}],"source_content_type":"text/x-go","patch_set":7,"id":"56980aab_6dafa78e","line":11,"range":{"start_line":7,"start_character":0,"end_line":11,"end_character":0},"in_reply_to":"634ea628_4c65ca5e","updated":"2023-02-02 14:47:12.000000000","message":"I\u0027ve reworked the subscriber to only use mdlayher\u0027s netlink libraries, and to return Packet structs. PTAL.","commit_id":"7a2f97d70d8d654b42bb5f7b344a2ab147980431"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"20c3fa63959da049a8636eeaf660c4d071c969ae","unresolved":true,"context_lines":[{"line_number":4,"context_line":"import ("},{"line_number":5,"context_line":"\t\"fmt\""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\t\"github.com/mdlayher/genetlink\""},{"line_number":8,"context_line":"\tmdn \"github.com/mdlayher/netlink\""},{"line_number":9,"context_line":"\t\"github.com/vishvananda/netlink\""},{"line_number":10,"context_line":"\t\"github.com/vishvananda/netlink/nl\""},{"line_number":11,"context_line":"\t\"golang.org/x/sys/unix\""},{"line_number":12,"context_line":")"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"// attrId identifies psample netlink message attributes."}],"source_content_type":"text/x-go","patch_set":7,"id":"634ea628_4c65ca5e","line":11,"range":{"start_line":7,"start_character":0,"end_line":11,"end_character":0},"in_reply_to":"6a19c8dd_20ccbc68","updated":"2023-02-02 11:01:26.000000000","message":"I looked at the kernel encoder and it looks like something like this would always work:\n\n```\ntype Packet struct {\n\t// IncomingInterfaceIndex is the incoming interface index of the packet or 0\n\t// if not applicable.\n\tIncomingInterfaceIndex uint16\n\t// OutgoingInterfaceIndex is the outgoing interface index of the packet or 0\n\t// if not applicable.\n\tOutgoingInterfaceIndex uint16\n\t// OriginalSize is the packet\u0027s original size in bytes without any\n\t// truncation.\n\tOriginalSize uint32\n\t// SampleGroup is the sample group to which this packet belongs. This is set\n\t// by the sampling action and can be used to differentiate different\n\t// sampling streams.\n\tSampleGroup uint32\n\t// GroupSequence is a monotonically-increasing counter of packets sampled\n\t// for each sample group.\n\tGroupSequence uint32\n\t// SampleRate is the sampling rate (1 in SampleRate packets) used to capture\n\t// this packet.\n\tSampleRate uint32\n\t// Data contains the packet data up to the specified size for truncation.\n\tData []byte\n}\n```\n\nAll of these fields are either always set or can be distinguished. The only fields not always set are iifindex and oifindex (which have 0 as a distinguisher, which is not a valid ifindex on Linux) and Data which has nil/empty slice.\n\nThis does not cover nested tunnel attributes and the extra attribute added in `psample: Add additional metadata attributes`, but if these are needed I\u0027d just use pointers for the optional ones.","commit_id":"7a2f97d70d8d654b42bb5f7b344a2ab147980431"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c5f29dfc348db2f816bb10be1d44476a9f86d265","unresolved":true,"context_lines":[{"line_number":4,"context_line":"import ("},{"line_number":5,"context_line":"\t\"fmt\""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\t\"github.com/mdlayher/genetlink\""},{"line_number":8,"context_line":"\tmdn \"github.com/mdlayher/netlink\""},{"line_number":9,"context_line":"\t\"github.com/vishvananda/netlink\""},{"line_number":10,"context_line":"\t\"github.com/vishvananda/netlink/nl\""},{"line_number":11,"context_line":"\t\"golang.org/x/sys/unix\""},{"line_number":12,"context_line":")"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"// attrId identifies psample netlink message attributes."}],"source_content_type":"text/x-go","patch_set":7,"id":"07fc3647_e09d4aa9","line":11,"range":{"start_line":7,"start_character":0,"end_line":11,"end_character":0},"in_reply_to":"a2bb0f1f_6dd70a3d","updated":"2023-02-01 16:06:04.000000000","message":"Can you tell me why this is married to vishvananda\u0027s netlink for the link structure? Interface indexes are quite flexible and generally used standalone (a lot of Kernel APIs take them directly), there\u0027s also net.Interface from the standard library to represent interfaces/links which is also instantiated with just an integer.\n\n4) There is mdlayher/netlink.AttributeDecoder which is IMO the nicest way you can do this. Doesn\u0027t necessarily save code but emitting Packet structs would make the interface a lot more Go-like. Also makes discovery \u0026 debugging nicer.","commit_id":"7a2f97d70d8d654b42bb5f7b344a2ab147980431"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"186478338f69b71be7208951ddb9346604966c06","unresolved":true,"context_lines":[{"line_number":4,"context_line":"import ("},{"line_number":5,"context_line":"\t\"fmt\""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\t\"github.com/mdlayher/genetlink\""},{"line_number":8,"context_line":"\tmdn \"github.com/mdlayher/netlink\""},{"line_number":9,"context_line":"\t\"github.com/vishvananda/netlink\""},{"line_number":10,"context_line":"\t\"github.com/vishvananda/netlink/nl\""},{"line_number":11,"context_line":"\t\"golang.org/x/sys/unix\""},{"line_number":12,"context_line":")"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"// attrId identifies psample netlink message attributes."}],"source_content_type":"text/x-go","patch_set":7,"id":"b208d18e_e15ae215","line":11,"range":{"start_line":7,"start_character":0,"end_line":11,"end_character":0},"in_reply_to":"aee725f1_e287d172","updated":"2023-02-01 13:48:41.000000000","message":"After looking into this I don\u0027t think this implementation could be made significantly more concise, for the following reasons:\n\n1) There\u0027s no alternative for netlink.GenlFamilyGet used in Subscribe in mdlayher/netlink.\n2) mdlayher/netlink doesn\u0027t seem to provide primitives for group discovery (see: subscriber.go:122)\n\n↑ Based on 1) and 2) using mdlayher/netlink\u0027s Conn implementation IMHO wouldn\u0027t be helpful. Also:\n\n3) Both InputInterface/OutputInterface return netlink.Link instances. This was a conscious decision aimed at improving usability. Given that, `vishvananda/netlink` would still need to be imported into this package.\n4) The implementation in subscriber.go already utilizes the attribute decoder provided in mdlayher/netlink, which doesn\u0027t seem to provide any accessors that would be easier to use.\n\nIt might be I\u0027m missing something here, in case of which please let me know.","commit_id":"7a2f97d70d8d654b42bb5f7b344a2ab147980431"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f88b854cb022b52f01f686d931e9e8017e596e6d","unresolved":true,"context_lines":[{"line_number":4,"context_line":"import ("},{"line_number":5,"context_line":"\t\"fmt\""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\t\"github.com/mdlayher/genetlink\""},{"line_number":8,"context_line":"\tmdn \"github.com/mdlayher/netlink\""},{"line_number":9,"context_line":"\t\"github.com/vishvananda/netlink\""},{"line_number":10,"context_line":"\t\"github.com/vishvananda/netlink/nl\""},{"line_number":11,"context_line":"\t\"golang.org/x/sys/unix\""},{"line_number":12,"context_line":")"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"// attrId identifies psample netlink message attributes."}],"source_content_type":"text/x-go","patch_set":7,"id":"3ba9b2bb_94079f60","line":11,"range":{"start_line":7,"start_character":0,"end_line":11,"end_character":0},"in_reply_to":"b208d18e_e15ae215","updated":"2023-02-01 14:08:09.000000000","message":"Oops, I missed that about 1) and 2), hang on: https://github.com/mdlayher/quota/blob/01f169384a62af5768a54b123f559aa41a7329ab/client.go#L50","commit_id":"7a2f97d70d8d654b42bb5f7b344a2ab147980431"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"379f30245ba3642a302afdbb28ddf8acd4f011d0","unresolved":true,"context_lines":[{"line_number":60,"context_line":"\t// Latency is the sampled packet\u0027s latency as indicated by psample. It\u0027s"},{"line_number":61,"context_line":"\t// expressed in nanoseconds."},{"line_number":62,"context_line":"\tLatency uint64"},{"line_number":63,"context_line":"\t// Timestamp marks time of the packet\u0027s sampling. It\u0027s set by the kernel, and"},{"line_number":64,"context_line":"\t// expressed in nanoseconds."},{"line_number":65,"context_line":"\tTimestamp uint64"},{"line_number":66,"context_line":"}"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-go","patch_set":9,"id":"5752db30_c5aee334","line":64,"range":{"start_line":63,"start_character":75,"end_line":64,"end_character":28},"updated":"2023-02-02 17:28:17.000000000","message":"What is zero here? Are these Unix-Nanoseconds?","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c037cd77fd9bbca4ea7958575630d6aa416458d0","unresolved":false,"context_lines":[{"line_number":60,"context_line":"\t// Latency is the sampled packet\u0027s latency as indicated by psample. It\u0027s"},{"line_number":61,"context_line":"\t// expressed in nanoseconds."},{"line_number":62,"context_line":"\tLatency uint64"},{"line_number":63,"context_line":"\t// Timestamp marks time of the packet\u0027s sampling. It\u0027s set by the kernel, and"},{"line_number":64,"context_line":"\t// expressed in nanoseconds."},{"line_number":65,"context_line":"\tTimestamp uint64"},{"line_number":66,"context_line":"}"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-go","patch_set":9,"id":"8ca7455f_0629b606","line":64,"range":{"start_line":63,"start_character":75,"end_line":64,"end_character":28},"in_reply_to":"5752db30_c5aee334","updated":"2023-02-06 11:58:39.000000000","message":"Done","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"379f30245ba3642a302afdbb28ddf8acd4f011d0","unresolved":true,"context_lines":[{"line_number":141,"context_line":"}"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"// Receive returns one or more of the sampled packets as soon as they\u0027re"},{"line_number":144,"context_line":"// available."},{"line_number":145,"context_line":"func Receive(c *genetlink.Conn) ([]Packet, error) {"},{"line_number":146,"context_line":"\t// Wait for the samples to arrive over generic netlink connection c."},{"line_number":147,"context_line":"\tgnms, nms, err :\u003d c.Receive()"}],"source_content_type":"text/x-go","patch_set":9,"id":"af728c4e_4f5c1b5a","line":144,"range":{"start_line":144,"start_character":3,"end_line":144,"end_character":12},"updated":"2023-02-02 17:28:17.000000000","message":"Document the ENOBUFS thing from the tests here.","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c037cd77fd9bbca4ea7958575630d6aa416458d0","unresolved":false,"context_lines":[{"line_number":141,"context_line":"}"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"// Receive returns one or more of the sampled packets as soon as they\u0027re"},{"line_number":144,"context_line":"// available."},{"line_number":145,"context_line":"func Receive(c *genetlink.Conn) ([]Packet, error) {"},{"line_number":146,"context_line":"\t// Wait for the samples to arrive over generic netlink connection c."},{"line_number":147,"context_line":"\tgnms, nms, err :\u003d c.Receive()"}],"source_content_type":"text/x-go","patch_set":9,"id":"753d5d1c_ceddebd5","line":144,"range":{"start_line":144,"start_character":3,"end_line":144,"end_character":12},"in_reply_to":"af728c4e_4f5c1b5a","updated":"2023-02-06 11:58:39.000000000","message":"Done","commit_id":"89578380b544be2279fca5418386a47b8e86afee"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"d651fa75bf8bdc6d264f6dbaa3ab11bad56f231a","unresolved":true,"context_lines":[{"line_number":61,"context_line":"\t// expressed in nanoseconds."},{"line_number":62,"context_line":"\tLatency uint64"},{"line_number":63,"context_line":"\t// Timestamp marks time of the packet\u0027s sampling. It\u0027s set by the kernel, and"},{"line_number":64,"context_line":"\t// expressed in Unix nanoseconds. This attribute is expected to be present in"},{"line_number":65,"context_line":"\t// every packet sample, thus it should never be zero."},{"line_number":66,"context_line":"\tTimestamp uint64"},{"line_number":67,"context_line":"}"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-go","patch_set":10,"id":"78056283_d0f12ed7","line":65,"range":{"start_line":64,"start_character":35,"end_line":65,"end_character":54},"updated":"2023-02-06 12:59:35.000000000","message":"That is actually not true, if you\u0027re running a kernel between 4.10 and 5.13 (a range which contains 4 active LTS versions plus most enterprise distros) this will always be zero as the attribute is not available. Probably best if you leave a comment at Latency indicating that the following attributes are only available on 5.13+.\n\nNot sure how performance-sensitive this code is but I would also consider making this a time.Time which has convenient and known IsZero() method.","commit_id":"03fe004067226d9f3fc5c8e5a45844bfd339294a"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ed9e4548d8d5eca06ca49564b31e2475cb2bf248","unresolved":false,"context_lines":[{"line_number":61,"context_line":"\t// expressed in nanoseconds."},{"line_number":62,"context_line":"\tLatency uint64"},{"line_number":63,"context_line":"\t// Timestamp marks time of the packet\u0027s sampling. It\u0027s set by the kernel, and"},{"line_number":64,"context_line":"\t// expressed in Unix nanoseconds. This attribute is expected to be present in"},{"line_number":65,"context_line":"\t// every packet sample, thus it should never be zero."},{"line_number":66,"context_line":"\tTimestamp uint64"},{"line_number":67,"context_line":"}"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-go","patch_set":10,"id":"fa6acd34_ab823592","line":65,"range":{"start_line":64,"start_character":35,"end_line":65,"end_character":54},"in_reply_to":"78056283_d0f12ed7","updated":"2023-02-07 13:17:16.000000000","message":"Good catch!\n\nThat\u0027s definitely in the hot path, so I\u0027ll refrain from doing so.","commit_id":"03fe004067226d9f3fc5c8e5a45844bfd339294a"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"d651fa75bf8bdc6d264f6dbaa3ab11bad56f231a","unresolved":true,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"// decode converts raw generic netlink message attributes into a Packet. In"},{"line_number":70,"context_line":"// cases where some of the known psample attributes were left unspecified in"},{"line_number":71,"context_line":"// the message, appropriate Packet member variables will be left with their nil"},{"line_number":72,"context_line":"// values."},{"line_number":73,"context_line":"func decode(b []byte) (*Packet, error) {"},{"line_number":74,"context_line":"\tad, err :\u003d netlink.NewAttributeDecoder(b)"}],"source_content_type":"text/x-go","patch_set":10,"id":"0b9262f1_df4e250c","line":71,"range":{"start_line":71,"start_character":76,"end_line":71,"end_character":79},"updated":"2023-02-06 12:59:35.000000000","message":"zero value, nil is only for pointers","commit_id":"03fe004067226d9f3fc5c8e5a45844bfd339294a"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ed9e4548d8d5eca06ca49564b31e2475cb2bf248","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"// decode converts raw generic netlink message attributes into a Packet. In"},{"line_number":70,"context_line":"// cases where some of the known psample attributes were left unspecified in"},{"line_number":71,"context_line":"// the message, appropriate Packet member variables will be left with their nil"},{"line_number":72,"context_line":"// values."},{"line_number":73,"context_line":"func decode(b []byte) (*Packet, error) {"},{"line_number":74,"context_line":"\tad, err :\u003d netlink.NewAttributeDecoder(b)"}],"source_content_type":"text/x-go","patch_set":10,"id":"f81590f9_78d582af","line":71,"range":{"start_line":71,"start_character":76,"end_line":71,"end_character":79},"in_reply_to":"0b9262f1_df4e250c","updated":"2023-02-07 13:17:16.000000000","message":"Done","commit_id":"03fe004067226d9f3fc5c8e5a45844bfd339294a"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"d651fa75bf8bdc6d264f6dbaa3ab11bad56f231a","unresolved":true,"context_lines":[{"line_number":142,"context_line":"}"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"// Receive returns one or more of the sampled packets as soon as they\u0027re"},{"line_number":145,"context_line":"// available. It may return syscall.ENOBUFS, which signals that some of the"},{"line_number":146,"context_line":"// sampled traffic could not have been captured, and had been dropped instead."},{"line_number":147,"context_line":"func Receive(c *genetlink.Conn) ([]Packet, error) {"},{"line_number":148,"context_line":"\t// Wait for the samples to arrive over generic netlink connection c."},{"line_number":149,"context_line":"\tgnms, nms, err :\u003d c.Receive()"}],"source_content_type":"text/x-go","patch_set":10,"id":"5ccffee4_1617c342","line":146,"range":{"start_line":145,"start_character":14,"end_line":146,"end_character":78},"updated":"2023-02-06 12:59:35.000000000","message":"```suggestion\nIt may return a syscall.ENOBUFS error which indicates that the kernel-side buffer of the netlink connection has overflowed and lost packets. This is a transient error, calling Receive again will retrieve future packet samples.\n```","commit_id":"03fe004067226d9f3fc5c8e5a45844bfd339294a"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ed9e4548d8d5eca06ca49564b31e2475cb2bf248","unresolved":false,"context_lines":[{"line_number":142,"context_line":"}"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"// Receive returns one or more of the sampled packets as soon as they\u0027re"},{"line_number":145,"context_line":"// available. It may return syscall.ENOBUFS, which signals that some of the"},{"line_number":146,"context_line":"// sampled traffic could not have been captured, and had been dropped instead."},{"line_number":147,"context_line":"func Receive(c *genetlink.Conn) ([]Packet, error) {"},{"line_number":148,"context_line":"\t// Wait for the samples to arrive over generic netlink connection c."},{"line_number":149,"context_line":"\tgnms, nms, err :\u003d c.Receive()"}],"source_content_type":"text/x-go","patch_set":10,"id":"3633e03e_2d3c2297","line":146,"range":{"start_line":145,"start_character":14,"end_line":146,"end_character":78},"in_reply_to":"5ccffee4_1617c342","updated":"2023-02-07 13:17:16.000000000","message":"Done","commit_id":"03fe004067226d9f3fc5c8e5a45844bfd339294a"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"719c8ae2edda0514201075f611f3996bf25371a9","unresolved":true,"context_lines":[{"line_number":58,"context_line":"\t// Data contains the packet data up to the specified size for truncation."},{"line_number":59,"context_line":"\tData []byte"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"\t// The following attributes are only available on kerne versions 5.13+"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"\t// Latency is the sampled packet\u0027s latency as indicated by psample. It\u0027s"},{"line_number":64,"context_line":"\t// expressed in nanoseconds."}],"source_content_type":"text/x-go","patch_set":11,"id":"a6fbbec4_daf78180","line":61,"range":{"start_line":61,"start_character":51,"end_line":61,"end_character":56},"updated":"2023-02-07 15:27:48.000000000","message":"Typo","commit_id":"754b60138446846b0ecdff6ead7e35294e2d82f2"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f1afea884c4d916a33033e121c37c5c59c686ef1","unresolved":false,"context_lines":[{"line_number":58,"context_line":"\t// Data contains the packet data up to the specified size for truncation."},{"line_number":59,"context_line":"\tData []byte"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"\t// The following attributes are only available on kerne versions 5.13+"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"\t// Latency is the sampled packet\u0027s latency as indicated by psample. It\u0027s"},{"line_number":64,"context_line":"\t// expressed in nanoseconds."}],"source_content_type":"text/x-go","patch_set":11,"id":"7ab0398e_0e9699fa","line":61,"range":{"start_line":61,"start_character":51,"end_line":61,"end_character":56},"in_reply_to":"a6fbbec4_daf78180","updated":"2023-02-08 18:51:21.000000000","message":"Done","commit_id":"754b60138446846b0ecdff6ead7e35294e2d82f2"}],"metropolis/test/ktest/BUILD":[{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"167e88f70d3e17c1fe3e416c310d4de1dcdb1d22","unresolved":true,"context_lines":[{"line_number":15,"context_line":"    embed \u003d [\":ktest_lib\"],"},{"line_number":16,"context_line":"    pure \u003d \"on\","},{"line_number":17,"context_line":"    visibility \u003d ["},{"line_number":18,"context_line":"        \"//go/net/psample:__pkg__\","},{"line_number":19,"context_line":"        \"//metropolis:__subpackages__\","},{"line_number":20,"context_line":"    ],"},{"line_number":21,"context_line":")"}],"source_content_type":"text/x-python","patch_set":4,"id":"da19890c_ad8b3ad4","line":18,"range":{"start_line":18,"start_character":26,"end_line":18,"end_character":33},"updated":"2023-01-31 18:30:33.000000000","message":"You used `__subpackages__` on the linux_image, not sure what the difference is?","commit_id":"8ede252f27e0c47be4fca86f08298f9f0df0cf3f"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"df62639b4ca96c2e3b3229eeb4da9da8a74437fc","unresolved":false,"context_lines":[{"line_number":15,"context_line":"    embed \u003d [\":ktest_lib\"],"},{"line_number":16,"context_line":"    pure \u003d \"on\","},{"line_number":17,"context_line":"    visibility \u003d ["},{"line_number":18,"context_line":"        \"//go/net/psample:__pkg__\","},{"line_number":19,"context_line":"        \"//metropolis:__subpackages__\","},{"line_number":20,"context_line":"    ],"},{"line_number":21,"context_line":")"}],"source_content_type":"text/x-python","patch_set":4,"id":"fdf5ef58_165d3cd0","line":18,"range":{"start_line":18,"start_character":26,"end_line":18,"end_character":33},"in_reply_to":"da19890c_ad8b3ad4","updated":"2023-02-01 09:49:26.000000000","message":"Good catch. In the end I was after a more specific selector. It should be `__pkg__` all over.","commit_id":"8ede252f27e0c47be4fca86f08298f9f0df0cf3f"}]}
