2
* Copyright (C) 1998-2001 Luca Deri <deri@ntop.org>
3
* Portions by Stefano Suin <stefano@ntop.org>
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25
extern char *version, *osName, *author, *buildDate;
26
extern char *program_name;
27
extern char domainName[MAXHOSTNAMELEN], *shortDomainName;
28
extern HostTraffic *broadcastEntry, *otherHostEntry;
30
extern char **ntop_argv;
32
/* command line options */
33
extern u_short traceLevel, debugMode, useSyslog, accuracyLevel;
34
extern u_char stickyHosts, enableSuspiciousPacketDump;
35
extern char dbPath[200];
36
extern char accessLogPath[200]; /* Apache-like access log */
37
extern char mapperURL[256]; /* URL of the mapper CGI */
38
extern u_int maxHashSize, topHashSize;
39
extern u_int enableNetFlowSupport;
40
extern short usePersistentStorage, grabSessionInformation;
41
extern char *rFileName, *pcapLog;
42
extern int numericFlag, logTimeout, daemonMode, mergeInterfaces;
45
extern char *dataFileDirs[], *pluginDirs[], *configFileDirs[];
48
extern size_t allocatedMemory;
51
extern time_t nextLogTime;
54
extern int isLsofPresent, isNepedPresent, isNmapPresent, filterExpressionInExtraFrame;
55
extern short capturePackets, endNtop;
60
extern unsigned short numThreads;
61
extern PthreadMutex packetQueueMutex, hostsHashMutex, graphMutex;
62
extern PthreadMutex lsofMutex, addressResolutionMutex, hashResizeMutex;
63
extern pthread_t dequeueThreadId, handleWebConnectionsThreadId;
64
extern pthread_t thptUpdateThreadId, scanIdleThreadId, scanIdleSessionsThreadId;
65
extern pthread_t hostTrafficStatsThreadId, dbUpdateThreadId, lsofThreadId;
66
extern pthread_t purgeAddressThreadId;
68
extern PthreadMutex gdbmMutex;
72
extern sem_t queueSem;
73
#ifdef ASYNC_ADDRESS_RESOLUTION
74
extern sem_t queueAddressSem;
77
extern ConditionalVariable queueCondvar;
78
#ifdef ASYNC_ADDRESS_RESOLUTION
79
extern ConditionalVariable queueAddressCondvar;
82
#ifdef ASYNC_ADDRESS_RESOLUTION
83
extern pthread_t dequeueAddressThreadId;
84
extern TrafficCounter droppedAddresses;
85
extern PthreadMutex addressQueueMutex;
88
extern u_long numResolvedWithDNSAddresses, numKeptNumericAddresses,
89
numResolvedOnCacheAddresses;
93
extern GDBM_FILE gdbm_file, pwFile, eventFile, hostsInfoFile;
97
extern u_short updateLsof;
98
extern ProcessInfo **processes;
99
extern u_short numProcesses;
100
extern ProcessInfoList *localPorts[TOP_IP_PORT];
104
extern int allow_severity, deny_severity;
105
#endif /* HAVE_LIBWRAP */
109
extern u_short handleRules;
110
extern FlowFilterList *flowsList;
111
extern FilterRuleChain *tcpChain, *udpChain, *icmpChain;
112
extern u_short ruleSerialIdentifier;
113
extern FilterRule* filterRulesList[MAX_NUM_RULES];
115
/* Address Resolution */
116
#if defined(ASYNC_ADDRESS_RESOLUTION)
117
extern u_int addressQueueLen, maxAddressQueueLen;
118
extern u_int addressQueueHead, addressQueueTail;
119
extern struct in_addr addressQueue[ADDRESS_QUEUE_LENGTH+1];
123
extern char *separator;
124
extern int32_t thisZone; /* seconds offset from gmt to local time */
125
extern u_long numPurgedHosts, numTerminatedSessions;
128
extern time_t actTime, initialSniffTime, lastRefreshTime;
129
extern time_t nextSessionTimeoutScan;
130
extern struct timeval lastPktTime;
133
/* CHECK ME: if multiple Interfaces are handled by multiple
134
threads deviceId is a bad idea */
135
extern int deviceId; /* Set by processPacket() */
136
extern int numDevices, actualDeviceId;
137
extern NtopInterface *device;
139
/* Monitored Protocols */
140
extern char **protoIPTrafficInfos;
141
extern u_short numIpProtosToMonitor, numIpPortsToHandle;
142
extern PortMapper *ipPortMapper;
143
extern int numActServices, numIpPortMapperSlots;
144
extern unsigned long numHandledHTTPrequests;
145
extern ServiceEntry **udpSvc, **tcpSvc;
148
#if defined(MULTITHREADED)
149
extern PacketInformation packetQueue[PACKET_QUEUE_LENGTH+1];
150
extern unsigned int packetQueueLen, maxPacketQueueLen, packetQueueHead, packetQueueTail;
153
extern TransactionTime transTimeHash[NUM_TRANSACTION_ENTRIES];
154
extern u_int broadcastEntryIdx, otherHostEntryIdx;
155
extern u_char dummyEthAddress[ETHERNET_ADDRESS_LEN];
156
extern u_short mtuSize[], headerSize[];
157
extern char *currentFilterExpression;
159
/* function declaration ***************************************************** */
163
extern void cleanupAddressQueue(void);
164
extern void* dequeueAddress(void* notUsed);
165
extern char* _intoa(struct in_addr addr, char* buf, u_short bufLen);
166
extern char* intoa(struct in_addr addr);
167
extern void ipaddr2str(struct in_addr hostIpAddress);
168
extern char* etheraddr_string(const u_char *ep);
169
extern char* llcsap_string(u_char sap);
170
extern void extract_fddi_addrs(struct fddi_header *fddip, char *fsrc,
172
extern u_int16_t handleDNSpacket(const u_char *ipPtr,
173
DNSHostInfo *hostPtr, short length,
174
short *isRequest, short *positiveReply);
175
extern void checkSpoofing(u_int idxToCheck);
176
extern void cleanupHostEntries();
179
extern void showUsers(void);
180
extern void addUser(char* user);
181
extern void deleteUser(char* user);
182
extern void doAddUser(int _len);
183
extern void showURLs(void);
184
extern void addURL(char* url);
185
extern void deleteURL(char* user);
186
extern void doAddURL(int _len);
187
extern int doChangeFilter(int len);
188
extern void changeFilter(void);
189
extern void addDefaultAdminUser(void);
192
extern char* formatKBytes(float numKBytes);
193
extern char* formatBytes(TrafficCounter numBytes, short encodeString);
194
extern char* formatLatency(struct timeval tv, u_short sessionState);
195
extern char* formatSeconds(unsigned long sec);
196
extern char* formatMicroSeconds(unsigned long microsec);
197
extern char* formatThroughput(float numBytes);
198
extern char* formatTimeStamp(unsigned int ndays, unsigned int nhours,
199
unsigned int nminutes);
200
extern char* formatPkts(TrafficCounter pktNr);
203
extern void dumpNtopHashes(char* options);
204
extern void dumpNtopTrafficInfo(char* options);
207
extern void emitEvent(FilterRule *rule, HostTraffic *srcHost,
208
u_int srcHostIdx, HostTraffic *dstHost,
209
u_int dstHostIdx, short icmpType,
210
u_short sport, u_short dport);
211
extern void scanAllTcpExpiredRules(void);
212
extern void fireEvent(FilterRule *rule, HostTraffic *srcHost,
213
u_int srcHostIdx, HostTraffic *dstHost,
214
u_int dstHostIdx, short icmpType,
215
u_short sport, u_short dport,
217
extern void smurfAlert(u_int srcHostIdx, u_int dstHostIdx);
220
extern void hostTrafficDistrib(HostTraffic *theHost, short dataSent);
221
extern void hostIPTrafficDistrib(HostTraffic *theHost, short dataSent);
222
extern void hostFragmentDistrib(HostTraffic *theHost, short dataSent);
223
extern void hostTotalFragmentDistrib(HostTraffic *theHost, short dataSent);
224
extern void pktSizeDistribPie(void);
225
extern void ipProtoDistribPie(void);
226
extern void interfaceTrafficPie(void);
227
extern void pktCastDistribPie(void);
228
extern void drawTrafficPie(void);
229
extern void drawThptGraph(int sortedColumn);
230
extern void drawGlobalProtoDistribution(void);
231
extern void drawGlobalIpProtoDistribution(void);
234
extern u_int computeInitialHashIdx(struct in_addr *hostIpAddress,
236
short* useIPAddressForSearching);
237
extern void resizeHostHash(int deviceToExtend, short action);
238
extern void freeHostInfo(int theDevice, u_int hostIdx, u_short refreshHash);
239
extern void freeHostInstances(void);
240
extern void purgeIdleHosts(int ignoreIdleTime, int devId);
241
extern int extendTcpSessionsHash();
244
extern void sendStringLen(char *theString, unsigned int len);
245
extern void sendString(char *theString);
246
extern void printHTTPheader(void);
247
extern void printHTTPtrailer(void);
248
extern void initAccessLog(void);
249
extern void termAccessLog(void);
250
extern void sendHTTPHeaderType(void);
251
extern void sendGIFHeaderType(void);
252
extern void sendHTTPProtoHeader(void);
253
extern void handleHTTPrequest(struct in_addr from);
254
extern void printHTMLheader(char *title, int headerFlags);
257
extern void initIPServices(void);
258
extern void initCounters(int _mergeInterfaces);
259
extern void resetStats(void);
260
extern int initGlobalValues(void);
261
extern void postCommandLineArgumentsInitialization(time_t *lastTime);
262
extern void initGdbm(void);
263
extern void initThreads(int enableThUpdate, int enableIdleHosts, int enableDBsupport);
264
extern void initApps(void);
265
extern void initDevices(char* devices);
266
extern void initLibpcap(char* rulesFile, int numDevices);
267
extern void initDeviceDatalink(void);
268
extern void parseTrafficFilter(char *argv[], int optind);
269
extern void initSignals(void);
270
extern void startSniffer(void);
271
extern void deviceSanityCheck(char* string);
274
extern void initLeaks(void);
275
extern void termLeaks(void);
276
extern void resetLeaks(void);
278
#define malloc(a) ntop_malloc((unsigned int)a, __FILE__, __LINE__)
279
#define calloc(a, b) ntop_calloc((unsigned int)a, (unsigned int)b, __FILE__, __LINE__)
280
#define realloc(p, a) ntop_realloc((void*)p, (unsigned int)a, __FILE__, __LINE__)
281
#define strdup(a) ntop_strdup((char*)a, __FILE__, __LINE__)
282
#define free(a) ntop_free((void*)&(a), __FILE__, __LINE__)
283
extern void* ntop_malloc(unsigned int sz, char* file, int line);
284
extern void* ntop_calloc(unsigned int c, unsigned int sz, char* file, int line);
285
extern void* ntop_realloc(void* ptr, unsigned int sz, char* file, int line);
286
extern char* ntop_strdup(char *str, char* file, int line);
287
extern void ntop_free(void **ptr, char* file, int line);
289
#define free(a) ntop_safefree((void*)&(a), __FILE__, __LINE__)
290
extern void ntop_safefree(void **ptr, char* file, int line);
291
#define malloc(sz) ntop_safemalloc(sz, __FILE__, __LINE__)
292
extern void* ntop_safemalloc(unsigned int sz, char* file, int line);
293
#define calloc(c,sz) ntop_safecalloc(c, sz, __FILE__, __LINE__)
294
extern void* ntop_safecalloc(unsigned int c, unsigned int sz, char* file, int line);
295
#define realloc(p,sz) ntop_saferealloc(p, sz, __FILE__, __LINE__)
296
extern void* ntop_saferealloc(void* ptr, unsigned int sz, char* file, int line);
301
extern void initLogger(void);
302
extern void termLogger(void);
303
extern void logMessage(char* message, u_short severity);
304
extern void LogStatsToFile(void);
305
extern void* logFileLoop(void* notUsed);
309
extern int numChildren;
310
extern void handleSigHup(int signalId);
311
extern void *pcapDispatch(void *_i);
312
extern RETSIGTYPE handleDiedChild(int signal);
313
extern RETSIGTYPE dontFreeze(int signo);
314
extern void daemonize(void);
315
extern void detachFromTerminal(void);
316
extern void handleProtocols(char *protos);
317
extern void addDefaultProtocols(void);
318
extern int mapGlobalToLocalIdx(int port);
319
extern void *updateThptLoop(void *notUsed);
320
extern void* updateHostTrafficStatsThptLoop(void* notUsed);
321
extern void *updateDBHostsTrafficLoop(void* notUsed);
322
extern void *scanIdleLoop(void *notUsed);
323
extern void *scanIdleSessionsLoop(void *notUsed);
324
extern void *periodicLsofLoop(void *notUsed);
325
extern void packetCaptureLoop(time_t *lastTime, int refreshRate);
326
extern RETSIGTYPE cleanup(int signo);
327
extern void* cleanupExpiredHostEntriesLoop(void*);
330
#define checkSessionIdx(a) _checkSessionIdx(a, __FILE__, __LINE__)
331
extern u_int _checkSessionIdx(u_int idx, char* file, int line);
332
extern u_int findHostIdxByNumIP(struct in_addr hostIpAddress);
333
extern u_int findHostInfo(struct in_addr *hostIpAddress);
334
extern u_int getHostInfo(struct in_addr *hostIpAddress, u_char *ether_addr,
335
u_char checkForMultihoming,
336
u_char forceUsingIPaddress);
337
extern char *getNamedPort(int port);
338
extern void scanTimedoutTCPSessions(void);
339
extern void deleteFragment(IpFragment *fragment);
340
extern void purgeOldFragmentEntries(void);
341
extern void queuePacket(u_char * _deviceId, const struct pcap_pkthdr *h,
343
extern void cleanupPacketQueue(void);
344
extern void *dequeuePacket(void* notUsed);
345
extern void dumpSuspiciousPacket();
346
extern void processPacket(u_char *_deviceId, const struct pcap_pkthdr *h,
348
extern void updateOSName(HostTraffic *el);
349
extern void updateHostName(HostTraffic *el);
350
extern void _incrementUsageCounter(UsageCounter *counter,
351
u_int peerIdx, int deviceId,
352
char* file, int line);
355
extern void handleBootp(HostTraffic *srcHost, HostTraffic *dstHost,
356
u_short sport, u_short dport,
357
u_int packetDataLength, u_char* packetData);
358
extern u_int16_t processDNSPacket(const u_char *bp, u_int length,
359
short *isRequest, short *positiveReply);
360
#ifdef ENABLE_NAPSTER
361
extern void handleNapster(HostTraffic *srcHost, HostTraffic *dstHost,
362
u_short sport, u_short dport,
363
u_int packetDataLength, u_char* packetData,
364
IPSession *theSession);
366
extern void handleNetbios(HostTraffic *srcHost, HostTraffic *dstHost,
367
u_short sport, u_short dport,
368
u_int packetDataLength, const u_char* bp,
369
u_int length, u_int hlen);
372
/* CHECK ME: THIS IS NOT CALLED YET! */
373
extern void notifyPluginsHashResize(int oldSize, int newSize,
375
extern int handlePluginHTTPRequest(char* url);
376
extern void loadPlugins(void);
377
extern void startPlugins(void);
378
extern void unloadPlugins(void);
381
/* typedef int (*compare_function_t) (const void *p1, const void *p2); */
382
extern void quicksort(void *a, size_t n, size_t es,
383
int (*compare_function) (const void *p1, const void *p2));
386
extern void parseRules(char* path);
387
extern void checkFilterChain(HostTraffic *srcHost, u_int srcHostIdx,
388
HostTraffic *dstHost, u_int dstHostIdx,
389
u_short sport, u_short dport,
390
u_int length, u_int hlen, u_int8_t flags,
391
u_char protocol, u_char isFragment,
392
const u_char* bp, FilterRuleChain *selectedChain,
396
extern void handleDbSupport(char* addr /* host:port */, int* enableDBsupport);
397
extern void closeSQLsocket(void);
398
extern void updateHostNameInfo(unsigned long numeric, char* symbolic);
399
extern void updateHostTraffic(HostTraffic *el);
400
extern void notifyHostCreation(HostTraffic *el);
401
extern void notifyTCPSession(IPSession *session);
402
extern void updateDBOSname(HostTraffic *el);
406
extern int sslInitialized, sslPort;
407
extern int init_ssl(void);
408
extern int accept_ssl_connection(int fd);
409
extern SSL *getSSLsocket(int fd);
410
extern void term_ssl_connection(int fd);
411
/* CHECK ME: THIS IS NOT CALLED YET! */
412
extern void term_ssl(void);
416
extern void termIPServices(void);
417
extern void termIPSessions(void);
420
extern void updateThpt(void);
421
extern void updateTrafficMatrix(HostTraffic *srcHost, HostTraffic *dstHost,
422
TrafficCounter length);
423
extern void updateDbHostsTraffic(int deviceToUpdate);
424
extern void updateHostTrafficStatsThpt(int hourId);
425
extern int isInitialHttpData(char* packetData);
426
extern int isInitialSshData(char* packetData);
427
extern int isInitialFtpData(char* packetData);
430
extern FILE *sec_popen(char *cmd, const char *type);
431
extern HostTraffic* findHostByNumIP(char* numIPaddr);
432
extern HostTraffic* findHostByMAC(char* macAddr);
433
extern char* copy_argv(register char **argv);
434
extern unsigned short isPrivateAddress(struct in_addr *addr);
435
extern unsigned short isBroadcastAddress(struct in_addr *addr);
436
extern unsigned short isMulticastAddress(struct in_addr *addr);
437
extern unsigned short isLocalAddress(struct in_addr *addr);
438
extern int dotted2bits(char *mask);
439
extern void handleLocalAddresses(char* addresses);
440
extern unsigned short isPseudoLocalAddress(struct in_addr *addr);
441
extern unsigned short isPseudoBroadcastAddress(struct in_addr *addr);
442
extern void printLogTime(void);
443
extern int32_t gmt2local(time_t t);
444
extern void handleFlowsSpecs(char* flows);
445
extern int getLocalHostAddress(struct in_addr *hostAddress, char* device);
446
extern void fillDomainName(HostTraffic *el);
448
extern int createThread(pthread_t *threadId, void *(*__start_routine) (void *),
450
extern void killThread(pthread_t *threadId);
451
extern int _createMutex(PthreadMutex *mutexId, char* fileName, int fileLine);
452
extern int _accessMutex(PthreadMutex *mutexId, char* where,
453
char* fileName, int fileLine);
454
extern void _deleteMutex(PthreadMutex *mutexId, char* fileName, int fileLine);
455
extern int _tryLockMutex(PthreadMutex *mutexId, char* where,
456
char* fileName, int fileLine);
457
extern int _isMutexLocked(PthreadMutex *mutexId,
458
char* fileName, int fileLine);
459
extern int _releaseMutex(PthreadMutex *mutexId,
460
char* fileName, int fileLine);
461
extern int createCondvar(ConditionalVariable *condvarId);
462
extern void deleteCondvar(ConditionalVariable *condvarId);
463
extern int waitCondvar(ConditionalVariable *condvarId);
464
extern int signalCondvar(ConditionalVariable *condvarId);
465
#define createMutex(a) _createMutex(a, __FILE__, __LINE__)
466
#define accessMutex(a, b) _accessMutex(a, b, __FILE__, __LINE__)
467
#define deleteMutex(a) _deleteMutex(a, __FILE__, __LINE__)
468
#define tryLockMutex(a, b) _tryLockMutex(a, b, __FILE__, __LINE__)
469
#define isMutexLocked(a) _isMutexLocked(a, __FILE__, __LINE__)
470
#define releaseMutex(a) _releaseMutex(a, __FILE__, __LINE__)
471
#ifdef HAVE_SEMAPHORE_H
472
extern int createSem(sem_t *semId, int initialValue);
473
extern void waitSem(sem_t *semId);
474
extern int incrementSem(sem_t *semId);
475
extern int decrementSem(sem_t *semId);
476
extern int deleteSem(sem_t *semId);
477
#endif /* HAVE_SEMAPHORE_H */
478
#endif /* MULTITHREADED */
479
extern void setNBnodeNameType(HostTraffic *theHost, char nodeType, char* nbName);
480
extern void trimString(char*);
481
extern FILE* getNewRandomFile(char* fileName, int len);
482
extern void stringSanityCheck(char* string);
483
extern int checkCommand(char* commandName);
484
extern void readLsofInfo(void);
485
extern void readNepedInfo(void);
486
extern char *getHostOS(char* ipAddr, int port, char* additionalInfo);
487
extern char* decodeNBstring(char* theString, char *theBuffer);
488
extern void closeNwSocket(int *sockId);
489
extern char *savestr(const char *str);
490
extern int name_interpret(char *in, char *out, int in_len);
492
extern char *getNwInterfaceType(int i);
493
extern char *formatTime(time_t *theTime, short encodeString);
494
extern int getActualInterface(void);
495
extern void storeHostTrafficInstance(HostTraffic *el);
496
extern void resetHostsVariables(HostTraffic* el);
497
extern HostTraffic *resurrectHostTrafficInstance(char *key);
498
extern u_short in_cksum(const u_short *addr, int len, u_short csum);
499
extern void addTimeMapping(u_int16_t transactionId, struct timeval theTime);
500
extern long delta_time (struct timeval * now, struct timeval * before);
501
extern time_t getTimeMapping(u_int16_t transactionId,
502
struct timeval theTime);
503
extern void traceEvent(int eventTraceLevel, char* file,
504
int line, char * format, ...)
505
__attribute__ ((format (printf, 4, 5)));
506
extern char *_strncpy(char *dest, const char *src, size_t n);
507
#ifndef HAVE_LOCALTIME_R
508
extern struct tm *localtime_r(const time_t *t, struct tm *tp);
510
#ifndef HAVE_STRTOK_R
511
extern char *strtok_r(char *s, const char *delim, char **save_ptr);
513
extern int getSniffedDNSName(char *hostNumIpAddress, char *name, int maxNameLen);
514
extern int strOnlyDigits(const char *s);
515
extern void addPassiveSessionInfo(u_long theHost, u_short thePort);
516
extern int isPassiveSession(u_long theHost, u_short thePort);
517
extern void initPassiveSessions();
518
extern void termPassiveSessions();
519
extern int getPortByName(ServiceEntry **theSvc, char* portName);
520
extern char *getPortByNumber(ServiceEntry **theSvc, int port);
521
extern char *getPortByNum(int port, int type);
522
extern char *getAllPortByNum(int port);
523
extern int getAllPortByName(char* portName);
524
extern void addPortHashEntry(ServiceEntry **theSvc, int port, char* name);
525
extern void resetUsageCounter(UsageCounter *counter);
526
extern void resetSecurityHostTraffic(HostTraffic *el);
527
extern char* mapIcmpType(int icmpType);
530
extern char* getVendorInfo(u_char* ethAddress, short encodeString);
531
extern char* getSAPInfo(u_int16_t sapInfo, short encodeString);
532
extern char* getSpecialMacInfo(HostTraffic* el, short encodeString);
533
extern void createVendorTable(void);
535
#if defined(AIX) || defined(WIN32)
536
extern int snprintf(char *str, size_t n, const char *fmt, ...);
542
extern void handlemySQLSupport(char* addr /* host:port */, int* enableDBsupport);
543
extern void closemySQLsocket(void);
544
extern void mySQLupdateHostNameInfo(unsigned long numeric, char* symbolic);
545
extern void mySQLupdateHostTraffic(HostTraffic *el);
546
extern void mySQLnotifyHostCreation(HostTraffic *el);
547
extern void mySQLnotifyTCPSession(IPSession *session);
548
extern void mySQLupdateDBOSname(HostTraffic *el);
549
#endif /* HAVE_MYSQL */
551
#ifdef ENABLE_NAPSTER
552
extern NapsterServer napsterSvr[MAX_NUM_NAPSTER_SERVER];
556
extern int handleNetFlowSupport(char* addr /* host:port */);
557
extern void termNetFlowExporter();
558
extern void sendICMPflow(HostTraffic *srcHost, HostTraffic *dstHost, u_int length);
559
extern void sendUDPflow(HostTraffic *srcHost, HostTraffic *dstHost,
560
u_int sport, u_int dport, u_int length);
561
extern void sendTCPSessionFlow(IPSession *theSession);