Protocols/OSCAR/SNAC: Difference between revisions

From NINA Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 37: Line 37:


=== Datatype: SNAC__Header ===
=== Datatype: SNAC__Header ===
The FLAP Header will be immediately followed by the SNAC Header that describes what type of message it is for SNAC messages sent over FLAP. The SNAC Header is a simple 10 byte header that contains the foodgroup, type, any high level flags, and the requestId. The requestId is used to link up requests and replies and can also be used to determine the direction of traffic.
A client should never set the high bit of a requestId or use 0. The server will always set the high bit for its requestId unless it is a reply to a client query, in which case it will use the same requestId as the request. The flags field tells the client if for the same request there will be multiple replies and if there are any SNAC Header TLVs.
{| class="wikitable"
! Name
! Type
! Notes
|-
| id
| [[Protocols/OSCAR/SNAC#Datatype:_SNAC_ID|SNAC__ID]]
| Foodgroup and message type
|-
| flags
| uint16 (word)
| ''[Class: [[Protocols/OSCAR/SNAC#Class:_SNAC_HEADER_FLAGS|SNAC__HEADER_FLAGS]]]'' Flags
|-
| requestId
| uint32 (dword)
| Used to link requests and replies
|}


=== Datatype: SNAC__ID ===
=== Datatype: SNAC__ID ===
Describes the foodgroup and type this SNAC represents
{| class="wikitable"
! Name
! Type
! Notes
|-
| foodgroup
| uint16 (word)
| Numeric value that represents the foodgroup the SNAC is in
|-
| type
| uint16 (word)
| Numeric value that represent the SNAC type
|}


=== Class: SNAC__HEADER_FLAGS ===
=== Class: SNAC__HEADER_FLAGS ===


These are the flags that let the client know details about the SNAC being received.
{| class="wikitable"
! Name
! Value
! Notes
|-
| SNAC_HEADER_FLAGS_MORE_REPLIES_FOLLOW
| 0x0001
| More replies follow this message using the same requestId; the last reply is easily detectable because it will not have this flag set
|-
| SNAC_HEADER_FLAGS_CLIENT_SNAC
| 0x0002
| NOT CURRENTLY DOCUMENTED
|-
| SNAC_HEADER_FLAGS_OPT_TLV_PRESENT
| 0x8000
| A [[Protocols/OSCAR/TLV|tlvLBlock]] immediately follows the SNAC header before the rest of the fields
|}
=== From Aleksandr Shutko: Basic OSCAR information: SNAC ===
<table width=640 cellSpacing=0 cellPadding=0 border=0>
<tr>
<td>
<table width=640 bgcolor=darkblue cellSpacing=0 cellPadding=0 border=0><tr><td>
<table width=100% cellSpacing=2 cellPadding=0 border=0><tr><td  bgcolor=#E9E9E9 >
<table width=100% cellSpacing=0 cellPadding=0 bgcolor="#4040FF" border=0>
<tr>
<td><b><font size=2 color="white">&nbsp;SNAC format description&nbsp;</font></b></td>
</tr>
</table>
</td></tr>
<tr><td  bgcolor=#E9E9E9 >
<table width=100% cellSpacing=0 cellPadding=0 border=0>
<tr><td width=5>&nbsp;</td>
<td><br>
&nbsp;&nbsp;&nbsp;&nbsp;
A SNAC is the basic communication unit that is exchanged between clients and servers.
The SNAC communication layers sits on top of the FLAP layer. SNAC is the normal contents
of the FLAP Data Field for channel 0x02. SNACs are only sent over channel 0x02. Data sent
across other channels are not considered complete SNACs. There can be only one SNAC per
FLAP frame. Here is the format of SNAC:<br><br>
<table width=100% cellSpacing=0 cellPadding=0 align=center border=0>
<tr><td width=20></td>
<td>
<table width=350 bgcolor=darkgreen cellSpacing=0 cellPadding=0 border=0><tr><td>
<table width=100% cellSpacing=2 cellPadding=0 border=0><tr><td  bgcolor=#fafafa >
<table width=350 cellSpacing=0 cellPadding=0 align=center border=0>
<tr>
<td width=25%>&nbsp;xx xx</td>
<td width=5>&nbsp;</td>
<td width=20%>word</td>
<td width=5>&nbsp;</td>
<td width=50%>[[Protocols/OSCAR#Foodgroups|Family]] (service) id number</td>
</tr>
<tr>
<td>&nbsp;xx xx</td>
<td>&nbsp;</td>
<td>word</td>
<td>&nbsp;</td>
<td>[[Protocols/OSCAR#Foodgroups|Family]] subtype id number</td>
</tr>
<tr>
<td>&nbsp;xx xx</td>
<td>&nbsp;</td>
<td>word</td>
<td>&nbsp;</td>
<td>SNAC flags</td>
</tr>
<tr>
<td>&nbsp;xx xx xx xx</td>
<td>&nbsp;</td>
<td>dword</td>
<td>&nbsp;</td>
<td>SNAC request id</td>
</tr>
</table>
</td></tr>
<tr><td  bgcolor=#fafafa >
<table width=350 cellSpacing=0 cellPadding=0 align=center border=0>
<tr><td height=8 colspan=3></td></tr>
<tr><td width=50> </td>
<td>
<table width=300 bgcolor=darkred cellSpacing=0 cellPadding=0 border=0><tr><td>
<table width=100% cellSpacing=2 cellPadding=0 align=center border=0><tr><td  bgcolor=#fafafa >
<table width=300 cellSpacing=0 cellPadding=0 align=center border=0>
<tr>
<td height=40 align=center valign=middle>&nbsp;......</td>
<td valign=middle width=56%>SNAC data</td>
</tr>
</table>
</td></tr>
</table>
</td></tr></table>
</td><td width=5> </td>
</tr>
<tr><td height=5 colspan=3> </td></tr>
</table>
</td></tr>
</table>
</td></tr></table>
</td></tr>
</table>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;
There is no formal declaration of the length of the SNAC data portion (that information
must be assumed from the FLAP headers). Families, identified by the "family ID", constitute
a group of services. Subtypes are a subdivision of the families. Each subtype ID is different
depending on the specific service or information provided in the data section.<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;
Request IDs are 32bit values used to identify non-atomic information. The client can generate
completely random reqid's as long as it remembers what the request was for. Often, though,
the results of the SNAC are irrelevant, and the reqid's can be forgotten. But, in
information-requestion SNACs, it is imperative you remember the reqid you sent because that's
the only way to link it to the response! If this is not done, it will be impossible to have
more than one pending request of the same SNAC subtype (which is unlikely at best). For
server-initiated SNACs, the reqid most significant bit=1, and this num count up to zero from
than from zero.<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;
Flags is a general SNAC properties. There is not enough information about snac flags, but known
that if bit1 of flags=1 there are more SNACs for this request-id was sent. Bit16=1 <b>mean that
SNAC contain some unknown information at the beginning</b> (first come a length of additional data
(word) and then data itself).<br><br>


</td>
<td width=5></td></tr>
</table>
</td></tr>
</table>
</td></tr></table>


</td>
</tr>
</table>
[[Category:With_Contrib]]
[[Category:Stub]]
[[Category:Stub]]
[[Category:AOL]]
[[Category:AOL]]

Latest revision as of 10:34, 14 February 2021

OSCAR Protocol
IntroductionTermsClients
Basic
DatatypesFLAPSNACTLV
UUIDsErrorsTool IDs
Host Interaction
Rate LimitsMigrationMessages
Other Services
ADMINADVERTALERT
BARTBOSBUCPCHAT
CHAT_NAV
Tutorials
Sign OnBARTRendezvous
ICBMLocateBuddies
Foodgroups
OSERVICE (0x0001)
LOCATE (0x0002)
BUDDY (0x0003)
ICBM (0x0004)
ADVERT (0x0005)
INVITE (0x0006)
ADMIN (0x0007)
POPUP (0x0008)
PD (0x0009)
USER_LOOKUP (0x000A)
STATS (0x000B)
TRANSLATE (0x000C)
CHAT_NAV (0x000D)
CHAT (0x000E)
ODIR (0x000F)
BART (0x0010)
FEEDBAG (0x0013)
ICQ (0x0015)
BUCP (0x0017)
ALERT (0x0018)
PLUGIN (0x0022)
UNNAMED_FG_24 (0x0024)
MDIR (0x0025)
ARS (0x044A)

SNAC notes from another

SNACs (Simple Network Atomic Communication) are used to represent the protocol messages that are sent between the client and backend. The messages are separated into different categories, called foodgroups. Within each foodgroup there are different kinds of messages related to the category.

Datatype: SNAC__Header

The FLAP Header will be immediately followed by the SNAC Header that describes what type of message it is for SNAC messages sent over FLAP. The SNAC Header is a simple 10 byte header that contains the foodgroup, type, any high level flags, and the requestId. The requestId is used to link up requests and replies and can also be used to determine the direction of traffic.

A client should never set the high bit of a requestId or use 0. The server will always set the high bit for its requestId unless it is a reply to a client query, in which case it will use the same requestId as the request. The flags field tells the client if for the same request there will be multiple replies and if there are any SNAC Header TLVs.

Name Type Notes
id SNAC__ID Foodgroup and message type
flags uint16 (word) [Class: SNAC__HEADER_FLAGS] Flags
requestId uint32 (dword) Used to link requests and replies

Datatype: SNAC__ID

Describes the foodgroup and type this SNAC represents

Name Type Notes
foodgroup uint16 (word) Numeric value that represents the foodgroup the SNAC is in
type uint16 (word) Numeric value that represent the SNAC type

Class: SNAC__HEADER_FLAGS

These are the flags that let the client know details about the SNAC being received.

Name Value Notes
SNAC_HEADER_FLAGS_MORE_REPLIES_FOLLOW 0x0001 More replies follow this message using the same requestId; the last reply is easily detectable because it will not have this flag set
SNAC_HEADER_FLAGS_CLIENT_SNAC 0x0002 NOT CURRENTLY DOCUMENTED
SNAC_HEADER_FLAGS_OPT_TLV_PRESENT 0x8000 A tlvLBlock immediately follows the SNAC header before the rest of the fields

From Aleksandr Shutko: Basic OSCAR information: SNAC

 SNAC format description 
 

     A SNAC is the basic communication unit that is exchanged between clients and servers. The SNAC communication layers sits on top of the FLAP layer. SNAC is the normal contents of the FLAP Data Field for channel 0x02. SNACs are only sent over channel 0x02. Data sent across other channels are not considered complete SNACs. There can be only one SNAC per FLAP frame. Here is the format of SNAC:

 xx xx   word   Family (service) id number
 xx xx   word   Family subtype id number
 xx xx   word   SNAC flags
 xx xx xx xx   dword   SNAC request id
 ...... SNAC data


     There is no formal declaration of the length of the SNAC data portion (that information must be assumed from the FLAP headers). Families, identified by the "family ID", constitute a group of services. Subtypes are a subdivision of the families. Each subtype ID is different depending on the specific service or information provided in the data section.

     Request IDs are 32bit values used to identify non-atomic information. The client can generate completely random reqid's as long as it remembers what the request was for. Often, though, the results of the SNAC are irrelevant, and the reqid's can be forgotten. But, in information-requestion SNACs, it is imperative you remember the reqid you sent because that's the only way to link it to the response! If this is not done, it will be impossible to have more than one pending request of the same SNAC subtype (which is unlikely at best). For server-initiated SNACs, the reqid most significant bit=1, and this num count up to zero from than from zero.

     Flags is a general SNAC properties. There is not enough information about snac flags, but known that if bit1 of flags=1 there are more SNACs for this request-id was sent. Bit16=1 mean that SNAC contain some unknown information at the beginning (first come a length of additional data (word) and then data itself).