CNA-GAP-074: Guests cannot take part in PlayerMatch or Ranked sessions
Evidence basis: source-verified at the pinned commit; tests exist (not executed for this page). Claims on this page were checked by reading the CNA source at commit b0e97bb1; unless a sentence says otherwise, nothing here was built or executed. Nothing on this page was executed unless the Evidence section says so.
Guests of a signed-in account can play in Local, LocalWithLeaderboards and SystemLink sessions, but PlayerMatch and Ranked refuse them (GamerServicesNotAvailableException, or GamerPrivilegeException from AddLocalGamer): a guest has no service identity.
- Identifier
CNA-GAP-074- Category
- Functional gap
- Subsystem
- Networking & gamer services
- Status
- Open
- Verified against
- CNA
b0e97bb1(b0e97bb1bb876f9b3edd6f4ff1ef3067908ae8ac) - Evidence basis
- Source-verified: read at TARGET, not executed
- Tests touching this area
- Yes: see Current tests
- Affected contract
- NetworkSession Create, Find and Join (and their Begin/End forms) and AddLocalGamer for PlayerMatch and Ranked sessions whose local gamers include a guest SignedInGamer
Expected behaviour
XNA 4.0's managed NetworkSession (decompiled; read, not executed) applies no guest check when creating, finding, joining or adding local gamers; a guest's state travels in the session roster (NetworkGamerState.IsGuest, NetworkGamer.IsGuest). CNA's own limitations register records XNA's guests of a signed-in LIVE profile (Guide.ShowSignIn(paneCount, onlineOnly: true)).
Actual behaviour at TARGET
ServiceLocalGamers in NetworkSession.cpp, used by PlayerMatch and Ranked create, find and join, skips guests when it picks the local gamers itself and throws GamerServicesNotAvailableException ("A local gamer is not authorized for CNA online sessions.") for a guest in an explicit list; AddLocalGamer on an online session refuses a gamer without a service identity with GamerPrivilegeException (OnlineSessionBinding.cpp). Local, LocalWithLeaderboards and SystemLink sessions accept guests. CNA records the gap itself in section 16 of gamer-services-known-limitations.md: a guest has no credential of its own, and online guests would need a service-side guest identity bound to its host account.
Source locations
modules/net/src/Xna/NetworkSession.cpp— ServiceLocalGamers: guests skipped or refused for PlayerMatch and Rankedmodules/net/src/Internal/OnlineSessionBinding.cpp— OnlineSessionBinding::addLocal: GamerPrivilegeException without a service identitydocs/gamer-services-known-limitations.md— section 16: guests, by session type
Evidence
Read at b0e97bb1 and compared with the decompiled XNA 4.0 Microsoft.Xna.Framework.Net assembly; nothing was built or executed. The refusal is deliberate and documented by CNA ("Observable impact: online guests are refused").
Focused reproduction
No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.
Current tests
The guest rules of the other session types are tested (for example TwoProcessLoopbackTest.GuestsAreGuestsOnEveryMachineAcrossRealProcesses); no test admits a guest to a PlayerMatch or Ranked session.
Regression test
Once a service-side guest identity exists, create and join a PlayerMatch session with an account and its guest and expect both in the session with IsGuest set on the guest.
Blast radius
Online split-screen titles that bring a guest into PlayerMatch or Ranked sessions. Local, LocalWithLeaderboards and SystemLink play with guests is unaffected.
Workaround
Sign each online player in with an account of their own, or use SystemLink for split-screen play with guests.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.