Skip to content

Commit a01663b

Browse files
Merge pull request #16 from microsoft/20210903_TDSHeaderCheck
IPV6 formatting fixes
2 parents e291e81 + 5ea5a77 commit a01663b

File tree

9 files changed

+47
-18
lines changed

9 files changed

+47
-18
lines changed
3.5 KB
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

SQL_Network_Analyzer/SQLNA/NetworkTrace.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ public SQLServer GetSQLServer(uint IP, ulong IPHi, ulong IPLo, ushort Port, bool
124124

125125
// not found - create new SQLServer and return it
126126
SQLServer s2 = new SQLServer();
127+
s2.isIPV6 = isIPV6;
127128
s2.sqlIP = IP;
128129
s2.sqlIPHi = IPHi;
129130
s2.sqlIPLo = IPLo;
@@ -173,6 +174,7 @@ public SSRPData GetSSRPRequest(uint IP, ulong IPHi, ulong IPLo, bool isIPV6)
173174

174175
// not found - create new SSRPRequestr and return it
175176
SSRPData s2 = new SSRPData();
177+
s2.isIPV6 = isIPV6;
176178
s2.sqlIP = IP;
177179
s2.sqlIPHi = IPHi;
178180
s2.sqlIPLo = IPLo;

SQL_Network_Analyzer/SQLNA/OutputText.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ private static void DisplaySQLServerSummary(NetworkTrace Trace)
205205
ulong totalBytes = 0;
206206
int totalFrames = 0, totalResets = 0, totalRetransmits = 0;
207207
ArrayList clientIPs = new ArrayList();
208-
string IPAddress = null; // client IP address
208+
string IPAddress = null; // client IP address or Server IP address
209209
string sqlIP = (s.isIPV6) ? utility.FormatIPV6Address(s.sqlIPHi, s.sqlIPLo) : utility.FormatIPV4Address(s.sqlIP);
210210
int firstFile = 0;
211211
if (s.conversations.Count > 0) firstFile = Trace.files.IndexOf(((FrameData)(((ConversationData)s.conversations[0]).frames[0])).file);
@@ -245,6 +245,11 @@ private static void DisplaySQLServerSummary(NetworkTrace Trace)
245245

246246
if (totalResets > 0) s.hasResets = true;
247247

248+
if (s.isIPV6)
249+
IPAddress = utility.FormatIPV6Address(s.sqlIPHi, s.sqlIPLo);
250+
else
251+
IPAddress = utility.FormatIPV4Address(s.sqlIP);
252+
248253
rf.SetcolumnData(sqlIP,
249254
s.sqlHostName,
250255
s.sqlPort.ToString(),

SQL_Network_Analyzer/SQLNA/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@
3232
// You can specify all the values or you can default the Build and Revision Numbers
3333
// by using the '*' as shown below:
3434
// [assembly: AssemblyVersion("1.0.*")]
35-
[assembly: AssemblyVersion("1.5.1852.0")]
36-
[assembly: AssemblyFileVersion("1.5.1852.0")]
35+
[assembly: AssemblyVersion("1.5.1862.0")]
36+
[assembly: AssemblyFileVersion("1.5.1862.0")]

SQL_Network_Analyzer/SQLNA/TDSParser.cs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -237,18 +237,39 @@ public static void ProcessTDS(NetworkTrace trace)
237237
(firstByte != (int)TDSPacketType.DTC) && // 14 0x0E
238238
(firstByte != (int)TDSPacketType.SSPI) && // 17 0x11
239239
(firstByte != (int)TDSPacketType.PRELOGIN) && // 18 0x12
240-
(firstByte != (int)TDSPacketType.APPDATA)) // 23 0x17
240+
(firstByte != (int)TDSPacketType.APPDATA)) // 23 0x17 - next 2 bytes give TLS version 0200, 0300 to 0303
241241
{
242242
continue;
243243
}
244244

245-
// read header parts that we are interested in
246-
bool tdsEOM = (fd.payload[1] & 0x1) == 1;
247-
ushort tdsLength = utility.B2UInt16(fd.payload, 2);
245+
// define TDS header fields
246+
byte status = 0;
247+
bool tdsEOM = false;
248+
bool tdsResetConnection = false;
249+
ushort tdsLength = 0; // length of current packet data (includes 8 bytes for the header)
250+
ushort SPID = 0;
251+
byte PacketID = 0;
252+
byte Window = 0;
248253

249254
// APPDATA does not have a TDS payload, but a TLS payload, so skip these tests if APPDATA
250-
if (firstByte != (int)TDSPacketType.APPDATA)
255+
if (firstByte == (int)TDSPacketType.APPDATA) // TLS version 0200, 0300 to 0303
251256
{
257+
byte sslMajor = fd.payload[1];
258+
byte sslMinor = fd.payload[2];
259+
bool validPayload = (sslMajor == 2 && sslMinor == 0) || (sslMajor == 3 && sslMinor < 4);
260+
// do something here - ignore if validPayload == false??? TODO
261+
}
262+
else // (firstByte != (int)TDSPacketType.APPDATA)
263+
{
264+
// get header values
265+
status = fd.payload[1];
266+
tdsEOM = (status & 0x1) == 1;
267+
tdsResetConnection = (status & 0x18) != 0;
268+
tdsLength = utility.B2UInt16(fd.payload, 2); // length of current packet data (includes 8 bytes for the header)
269+
SPID = utility.B2UInt16(fd.payload, 4);
270+
PacketID = fd.payload[6];
271+
Window = fd.payload[7];
272+
252273
// TDS header Length argument needs to be non-zero and also >= payload length
253274
if (tdsLength == 0 || tdsLength < fd.payloadLength) continue;
254275

SQL_Network_Analyzer/SQLNA/utility.cs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -164,25 +164,25 @@ public static String FormatIPV4Address(uint IP)
164164

165165
public static String FormatIPV6Address(ulong Hi, ulong Lo)
166166
{
167-
string s = "";
167+
string sHi = "", sLo = "";
168168

169-
s = (Hi & 0xffff).ToString("X");
169+
sHi = (Hi & 0xffff).ToString("X");
170170
Hi >>= 16;
171-
s = (Hi & 0xffff).ToString("X") + ":" + s;
171+
sHi = (Hi & 0xffff).ToString("X") + ":" + sHi;
172172
Hi >>= 16;
173-
s = (Hi & 0xffff).ToString("X") + ":" + s;
173+
sHi = (Hi & 0xffff).ToString("X") + ":" + sHi;
174174
Hi >>= 16;
175-
s = (Hi & 0xffff).ToString("X") + ":" + s;
175+
sHi = (Hi & 0xffff).ToString("X") + ":" + sHi;
176176

177-
s = (Lo & 0xffff).ToString("X") + ":" + s;
177+
sLo = (Lo & 0xffff).ToString("X");
178178
Lo >>= 16;
179-
s = (Lo & 0xffff).ToString("X") + ":" + s;
179+
sLo = (Lo & 0xffff).ToString("X") + ":" + sLo;
180180
Lo >>= 16;
181-
s = (Lo & 0xffff).ToString("X") + ":" + s;
181+
sLo = (Lo & 0xffff).ToString("X") + ":" + sLo;
182182
Lo >>= 16;
183-
s = (Lo & 0xffff).ToString("X") + ":" + s;
183+
sLo = (Lo & 0xffff).ToString("X") + ":" + sLo;
184184

185-
return s;
185+
return sHi + ":" + sLo;
186186
}
187187

188188
public static void ParseIPPortString(string value, ref bool isIPV6, ref ushort port, ref uint ipv4, ref ulong ipv6hi, ref ulong ipv6lo)
@@ -195,6 +195,7 @@ public static void ParseIPPortString(string value, ref bool isIPV6, ref ushort p
195195
addr = System.Net.IPAddress.Parse(words[0]);
196196
if (addr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
197197
{
198+
isIPV6 = false;
198199
ipv4 = B2UInt32(addr.GetAddressBytes(),0);
199200
}
200201
else if (addr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)

0 commit comments

Comments
 (0)