{"object_kind":"push","event_name":"push","before":"20d648aaad11163b13bdba2f6538c72480c254f9","after":"f5259828b63d17dbe8f1b33d431dfa4df80c65a2","ref":"refs/heads/master","ref_protected":true,"checkout_sha":"f5259828b63d17dbe8f1b33d431dfa4df80c65a2","message":null,"user_id":3060,"user_name":"Wim Taymans","user_username":"wtaymans","user_email":"","user_avatar":"https://secure.gravatar.com/avatar/1ca1bed246cb9b95b7ead6d6be96bb09f0c112953140c8bb38b41aedf4465270?s=80&d=identicon","project_id":4753,"project":{"id":4753,"name":"pipewire","description":"Multimedia processing graphs","web_url":"https://gitlab.freedesktop.org/pipewire/pipewire","avatar_url":"https://gitlab.freedesktop.org/uploads/-/system/project/avatar/4753/pipewire.png","git_ssh_url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","git_http_url":"https://gitlab.freedesktop.org/pipewire/pipewire.git","namespace":"PipeWire","visibility_level":20,"path_with_namespace":"pipewire/pipewire","default_branch":"master","ci_config_path":"","homepage":"https://gitlab.freedesktop.org/pipewire/pipewire","url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","ssh_url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","http_url":"https://gitlab.freedesktop.org/pipewire/pipewire.git"},"commits":[{"id":"bdaecfebb8a222e682e2c0b9365f9cf279c08c32","message":"module-avb: fix heap corruption in server_destroy_descriptors\n\nserver_add_descriptor() allocates the descriptor and its data in a\nsingle calloc (d->ptr = SPA_PTROFF(d, sizeof(struct descriptor))),\nso d->ptr points inside the same allocation as d. Calling free(d->ptr)\nfrees an interior pointer, corrupting the heap. Only free(d) is needed.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"module-avb: fix heap corruption in server_destroy_descriptors","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/bdaecfebb8a222e682e2c0b9365f9cf279c08c32","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["src/modules/module-avb/internal.h"],"removed":[]},{"id":"ef8f820d4a379044fc71329b803e75df32239cb8","message":"module-avb: fix potential NULL pointer dereference in MSRP/MVRP notify\n\nThe msrp_notify() and mvrp_notify() functions call dispatch table\nnotify callbacks without checking for NULL. In MSRP, the\nTALKER_FAILED attribute type has a NULL notify callback, which would\ncrash if a talker-failed attribute received a registrar state change\nnotification (e.g. RX_NEW triggering NOTIFY_NEW).\n\nAdd NULL checks before calling the dispatch notify callbacks, matching\nthe defensive pattern used in the encode path.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"module-avb: fix potential NULL pointer dereference in MSRP/MVRP notify","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/ef8f820d4a379044fc71329b803e75df32239cb8","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["src/modules/module-avb/msrp.c","src/modules/module-avb/mvrp.c"],"removed":[]},{"id":"1d0c51f057536a0eae9366062318a8982f5287af","message":"module-avb: fix MRP NEW messages never being transmitted\n\nAVB_MRP_SEND_NEW was defined as 0, making it indistinguishable from\n\"no pending send\" in the MSRP and MVRP event handlers which check\n`if (!pending_send)`. This meant that when an attribute was first\ndeclared (applicant state VN or AN), the NEW message was silently\ndropped instead of being transmitted on the network.\n\nFix by shifting all AVB_MRP_SEND_* values to start at 1, so that 0\nunambiguously means \"no send pending\". Update the MSRP and MVRP\nencoders to subtract 1 when encoding to the IEEE 802.1Q wire format\n(which uses 0-based event values).\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"module-avb: fix MRP NEW messages never being transmitted","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/1d0c51f057536a0eae9366062318a8982f5287af","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["src/modules/module-avb/mrp.c","src/modules/module-avb/mrp.h","src/modules/module-avb/msrp.c","src/modules/module-avb/mvrp.c"],"removed":[]},{"id":"3f386ecd34b531d9256e2a1e5aed38106179a2d0","message":"module-avb: fix ACMP error responses sent with wrong message type\n\nIn handle_connect_tx_command() and handle_disconnect_tx_command(),\nAVB_PACKET_ACMP_SET_MESSAGE_TYPE() is called after the goto done\ntarget. When find_stream() fails and jumps to done, the response\nis sent with the original command message type (e.g., CONNECT_TX_COMMAND)\ninstead of the correct response type (CONNECT_TX_RESPONSE).\n\nMove the SET_MESSAGE_TYPE call before find_stream() so error responses\nare always sent with the correct response message type.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"module-avb: fix ACMP error responses sent with wrong message type","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/3f386ecd34b531d9256e2a1e5aed38106179a2d0","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["src/modules/module-avb/acmp.c"],"removed":[]},{"id":"4e62826e01eb481cdbd5793020b7ff3b77785c49","message":"module-avb: fix legacy AECP handlers reading payload at wrong offset\n\nhandle_acquire_entity_avb_legacy() and handle_lock_entity_avb_legacy()\nincorrectly treated the full ethernet frame pointer as the AEM packet\npointer, causing p->payload to read descriptor_type and descriptor_id\nfrom the wrong offset. Fix by properly skipping the ethernet header,\nmatching the pattern used by all other AEM command handlers.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"module-avb: fix legacy AECP handlers reading payload at wrong offset","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/4e62826e01eb481cdbd5793020b7ff3b77785c49","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["src/modules/module-avb/aecp-aem.c"],"removed":[]},{"id":"d9821d09c7857b70b8f7c16e77d3b66edfb1068a","message":"module-avb: fix Milan lock entity error response and re-lock timeout\n\nFix two bugs in handle_cmd_lock_entity_milan_v12():\n\n1. When server_find_descriptor() returns NULL, reply_status() was called\n with the AEM packet pointer instead of the full ethernet frame,\n corrupting the response ethernet header.\n\n2. When refreshing an existing lock, the expire timeout was extended by\n raw seconds (60) instead of nanoseconds (60 * SPA_NSEC_PER_SEC),\n causing the lock to expire almost immediately after re-lock.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"module-avb: fix Milan lock entity error response and re-lock timeout","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/d9821d09c7857b70b8f7c16e77d3b66edfb1068a","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["src/modules/module-avb/aecp-aem-cmds-resps/cmd-lock-entity.c"],"removed":[]},{"id":"a73988d38db3b9f14978464fae75149eb693a898","message":"module-avb: add transport abstraction for pluggable network backends\n\nIntroduce struct avb_transport_ops vtable with setup/send_packet/\nmake_socket/destroy callbacks. The existing raw AF_PACKET socket code\nbecomes the default \"raw\" transport. avdecc_server_new() defaults to\navb_transport_raw if no transport is set, and avdecc_server_free()\ndelegates cleanup through the transport ops.\n\nThis enables alternative transports (e.g. loopback for testing) without\nmodifying protocol handler code.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"module-avb: add transport abstraction for pluggable network backends","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/a73988d38db3b9f14978464fae75149eb693a898","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["src/modules/module-avb/avdecc.c","src/modules/module-avb/internal.h"],"removed":[]},{"id":"ef4ff8cfd07df1777739e7265e836b154f33bf29","message":"test: add AVB protocol test suite with loopback transport\n\nAdd a test suite for the AVB (Audio Video Bridging) protocol stack that\nruns entirely in software, requiring no hardware, root privileges, or\nrunning PipeWire daemon.\n\nThe loopback transport (avb-transport-loopback.h) replaces raw AF_PACKET\nsockets with in-memory packet capture, using a synthetic MAC address and\neventfd for protocol handlers that need a valid fd.\n\nTest utilities (test-avb-utils.h) provide helpers for creating test\nservers, injecting packets, advancing time, and building ADP packets.\n\nTests cover:\n- ADP entity available/departing/discover/timeout\n- MRP attribute lifecycle (create, begin, join)\n- Milan v1.2 mode server creation\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"test: add AVB protocol test suite with loopback transport","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/ef4ff8cfd07df1777739e7265e836b154f33bf29","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":["src/modules/module-avb/avb-transport-loopback.h","test/test-avb-utils.h","test/test-avb.c"],"modified":["test/meson.build"],"removed":[]},{"id":"f5c5c9d7a35eea89052da24f4e4cd5327af4b182","message":"test: add MRP state machine, MSRP, and packet parsing tests\n\nExtend the AVB test suite with Phase 3 tests:\n\nMRP state machine tests:\n- Begin/join/TX cycle with NEW attribute\n- Join then leave lifecycle\n- RX_NEW registrar notification callback\n- Registrar leave timer (LV -> MT after timeout)\n- Multiple coexisting attributes\n\nMSRP protocol tests:\n- All four attribute types (talker, talker-failed, listener, domain)\n- Domain and talker transmit via loopback capture\n- Talker-failed notification (validates NULL deref fix)\n\nMRP packet parsing tests:\n- Single domain value parse\n- Leave-all (LVA) flag detection\n- Three-value base-6 event decoding\n\nTotal: 18 tests, all passing.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"test: add MRP state machine, MSRP, and packet parsing tests","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/f5c5c9d7a35eea89052da24f4e4cd5327af4b182","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["test/test-avb.c"],"removed":[]},{"id":"e661c722723331f9c33e1349300450ad16afe87c","message":"test: add ACMP integration tests and bug documentation\n\nAdd Phase 4 ACMP integration tests:\n- NOT_SUPPORTED response for unimplemented commands\n- CONNECT_TX_COMMAND with no streams (error response)\n- Entity ID filtering (wrong GUID ignored)\n- CONNECT_RX_COMMAND forwarding to talker\n- Pending request timeout and retry\n- Packet filtering (wrong EtherType/subtype)\n\nAlso add avb-bugs.md documenting all bugs found by the test suite.\n\nTotal: 24 tests, all passing.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"test: add ACMP integration tests and bug documentation","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/e661c722723331f9c33e1349300450ad16afe87c","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":["test/avb-bugs.md"],"modified":["test/test-avb.c"],"removed":[]},{"id":"fdfede8b9696d4dfead2792dbda9d2bfebc07074","message":"test: add AECP/AEM entity model tests and document new bugs\n\nAdd 12 Phase 5 tests for the AECP/AEM entity model:\n- READ_DESCRIPTOR for existing and non-existent descriptors\n- AECP packet filtering (wrong EtherType, wrong subtype)\n- Unsupported AECP message types (ADDRESS_ACCESS, etc.)\n- Unimplemented AEM commands (REBOOT, etc.)\n- ACQUIRE_ENTITY and LOCK_ENTITY for legacy mode\n- Milan ENTITY_AVAILABLE, LOCK_ENTITY (lock/contention/unlock)\n- Milan LOCK_ENTITY for non-entity descriptors\n- Milan ACQUIRE_ENTITY returns NOT_SUPPORTED\n- Milan READ_DESCRIPTOR\n\nAlso adds Milan test server helper with properly sized entity\ndescriptor for lock state, and AECP/AEM packet builder utility.\n\nUpdates avb-bugs.md with 3 new bugs found (bugs #6-#8).\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"test: add AECP/AEM entity model tests and document new bugs","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/fdfede8b9696d4dfead2792dbda9d2bfebc07074","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["test/avb-bugs.md","test/test-avb-utils.h","test/test-avb.c"],"removed":[]},{"id":"cec53759ddd473a6c76ffae2c164552d1c2f9f09","message":"test: add AVTP audio data path tests\n\nAdd 10 Phase 6 tests for the AVTP audio data path:\n- IEC61883 and AAF packet structure layout validation\n- 802.1Q frame header construction\n- PDU size calculations for various audio configurations\n- Ringbuffer audio data round-trip integrity\n- Ringbuffer wrap-around with multiple PDU-sized writes\n- IEC61883 receive simulation (packet → ringbuffer)\n- IEC61883 transmit PDU construction and field verification\n- Ringbuffer overrun detection\n- Sequence number and DBC counter wrapping\n\nThese tests validate the AVTP packet formats and audio data path\nlogic without requiring hardware, AF_PACKET sockets, or CLOCK_TAI.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"test: add AVTP audio data path tests","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/cec53759ddd473a6c76ffae2c164552d1c2f9f09","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["test/test-avb-utils.h","test/test-avb.c"],"removed":[]},{"id":"ffa855d76e094096848f2224d53ed32934abea19","message":"test: add additional AVB protocol coverage tests (phases 7-8)\n\nAdd 26 new tests covering protocol areas not yet exercised:\n\nPhase 7 (12 tests):\n- MAAP conflict detection: probe/announce conflicts, defend logic\n- ACMP disconnect: RX forwarding, TX without stream, pending timeout\n- AECP GET_AVB_INFO: success path and wrong descriptor type\n- MRP timers: leave-all and periodic timer verification\n- MSRP talker-failed: attribute processing with failure info\n\nPhase 8 (14 tests):\n- MVRP: attribute lifecycle, VID packet encoding\n- MMRP: attribute type verification (MAC + service requirement)\n- ADP: duplicate entity, targeted discover, readvertise, departure\n- Descriptor lookup: edge cases, data integrity after add\n- AECP commands: GET_CONFIGURATION, GET_SAMPLING_RATE, GET_NAME\n\nTotal test count: 72 tests across 8 phases.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"test: add additional AVB protocol coverage tests (phases 7-8)","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/ffa855d76e094096848f2224d53ed32934abea19","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["test/test-avb-utils.h","test/test-avb.c"],"removed":[]},{"id":"14310e66feb4393fb33798a0e6e85507af9050b2","message":"module-avb: extend transport abstraction to stream data path\n\nAdd stream_setup_socket and stream_send ops to avb_transport_ops so the\nstream data plane can use the same pluggable transport backend as the\ncontrol plane. Move the raw AF_PACKET socket setup from stream.c into\navdecc.c as raw_stream_setup_socket(), and add a raw_stream_send()\nwrapper around sendmsg().\n\nAdd a stream list (spa_list) to struct server so streams can be iterated\nafter creation, and add stream_activate_virtual() for lightweight\nactivation without MRP/MAAP network operations.\n\nImplement loopback stream ops: eventfd-based dummy sockets and no-op\nsend that discards audio data. This enables virtual AVB nodes that work\nwithout network hardware or privileges.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"module-avb: extend transport abstraction to stream data path","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/14310e66feb4393fb33798a0e6e85507af9050b2","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":[],"modified":["src/modules/module-avb/avb-transport-loopback.h","src/modules/module-avb/avdecc.c","src/modules/module-avb/internal.h","src/modules/module-avb/stream.c","src/modules/module-avb/stream.h"],"removed":[]},{"id":"f5259828b63d17dbe8f1b33d431dfa4df80c65a2","message":"tools: add pw-avb-virtual for virtual AVB graph nodes\n\nAdd a standalone tool that creates virtual AVB talker/listener endpoints\nvisible in the PipeWire graph (e.g. Helvum). Uses the loopback transport\nso no AVB hardware or network access is needed.\n\nThe sink node consumes audio silently, the source produces silence.\nSupports --milan flag for Milan v1.2 mode and --name for custom node\nname prefix.\n\nCo-Authored-By: Claude Opus 4.6 \n","title":"tools: add pw-avb-virtual for virtual AVB graph nodes","timestamp":"2026-04-09T07:43:19+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/f5259828b63d17dbe8f1b33d431dfa4df80c65a2","author":{"name":"Christian F.K. Schaller","email":"christian.schaller@gmail.com"},"added":["src/tools/pw-avb-virtual.c"],"modified":["src/tools/meson.build"],"removed":[]}],"total_commits_count":15,"push_options":{},"repository":{"name":"pipewire","url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","description":"Multimedia processing graphs","homepage":"https://gitlab.freedesktop.org/pipewire/pipewire","git_http_url":"https://gitlab.freedesktop.org/pipewire/pipewire.git","git_ssh_url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","visibility_level":20}}