NetBurner 3.5.0
PDF Version
 
ipv6_interface.h
1/*NB_REVISION*/
2
3/*NB_COPYRIGHT*/
4
5#ifndef IPV6_INTERFACE_H
6#define IPV6_INTERFACE_H
7
8#include <basictypes.h>
9#include <buffers.h>
10#include <ipv6/dhcpv6_internal.h>
11#include <ipv6/ipv6_addr.h>
12#include <ipv6/ipv6_frames.h>
13#include <nettimer.h>
14#include <nettypes.h>
15#include <utils.h>
16
17#define ADDR_ALL_NODES_LINK_LOCAL IPADDR6::AsciiToIp6("FF02::1")
18#define ADDR_ALL_ROUTERS_LINK_LOCAL IPADDR6::AsciiToIp6("FF02::2")
19#define ADDR_ALL_NB_LINK_LOCAL IPADDR6::AsciiToIp6("FF02::4e42")
20#define ADDR_UNICAST_LINK_LOCAL_PREFIX IPADDR6::AsciiToIp6("FE80::")
21#define ADDR_MLDV2_REPORTS IPADDR6::AsciiToIp6("FF02::16")
22
23#define IPV6_MULTICAST_NODE_LOCAL 0xFF01
24#define IPV6_MULTICAST_LINK_LOCAL 0xFF02
25#define IPV6_MULTICAST_REALM_LOCAL 0xFF03
26#define IPV6_MULTICAST_ADMIN_LOCAL 0xFF04
27#define IPV6_MULTICAST_SITE_LOCAL 0xFF05
28#define IPV6_MULTICAST_ORG_LOCAL 0xFF08
29#define IPV6_MULTICAST_GLOBAL 0xFF0E
30
31struct IP6FRAME;
32struct ICMP6_ND_ADVERT;
33
34struct IPv6FrameProcessingStruct
35{
36 PoolPtr root_pp;
37 IP6FRAME *pIPf;
38 uint8_t *pData;
39 uint16_t nDataLen;
40 uint8_t *pLargeData; // Used for fragments larger than 1500 bytes.
41
42 void free_proc_struct();
43 void release();
44 uint8_t WalkNextHeader(int *pError_offset = NULL);
45 bool DestOptHasError(puint8_t pData, int *pError_offset);
46 bool HopByHopParseHasError(puint8_t pData, int *pError_offset);
47 bool RouterHeaderParseHasError(puint8_t pData, int *pError_offset);
48 IPv6FrameProcessingStruct(PoolPtr pp);
49 IPv6FrameProcessingStruct()
50 {
51 root_pp = NULL;
52 pIPf = NULL;
53 pData = NULL;
54 nDataLen = 0;
55 pLargeData = 0;
56 }
57 inline puint8_t GetDataPointer()
58 {
59 if (pLargeData) return pLargeData;
60 if (root_pp) return root_pp->pData;
61 return NULL;
62 }
63 inline EFRAME *GetEframe()
64 {
65 if (pLargeData) return (EFRAME *)pLargeData;
66 if (root_pp) return (EFRAME *)root_pp->pData;
67 return NULL;
68 }
69};
70
71// forward
72struct IPV6_ROOT_EL;
73struct IPV6_PREFIX;
74struct IPV6_ROUTER;
75struct IPV6_DNS;
76struct IPV6_NEIGHBOR;
77struct IPV6_DEST;
78struct IPV6_ROOT_EL_CONTAINER;
79class IPv6Interface;
80class UDPPacket;
81class TcpCarrierPacket;
82struct socket_struct;
83typedef socket_struct SOCKET;
84typedef SOCKET *PSOCKET;
85
86enum IPV6_ROOT_EL_TYPE
87{
88 IPV6_ROOT_TYPE_EL = 0,
89 IPV6_ROOT_TYPE_EL_CONTAINER = 1,
90 IPV6_ROOT_TYPE_ROUTER = 2,
91 IPV6_ROOT_TYPE_DHCPD = 3,
92 IPV6_ROOT_TYPE_PREFIX = 4,
93 IPV6_ROOT_TYPE_DNS = 5,
94 IPV6_ROOT_TYPE_NEIGHBOR = 6,
95 IPV6_ROOT_TYPE_DEST = 7,
96};
97
98struct IPV6_ROOT_EL
99{
100 IPV6_ROOT_EL *m_pNext;
101 IPV6_ROOT_EL *m_pPrev;
102 IPV6_ROOT_EL_CONTAINER *m_pContainer;
103
104 IPADDR6 m_IPAddress;
105
106 virtual void ShowItem();
107 virtual bool AgeStillValidTest();
108 virtual void free_element();
109 virtual ~IPV6_ROOT_EL();
110};
111
112struct IPV6_ROOT_EL_CONTAINER
113{
114 const char *m_name;
115 IPV6_ROOT_EL *m_pHead;
116 IPV6_ROOT_EL *m_pTail;
117 IPv6Interface *m_pInterface;
118 int m_nElements;
119
120 void Insert(IPV6_ROOT_EL *pEl);
121 void InsertBack(IPV6_ROOT_EL *pEl);
122 IPV6_ROOT_EL *Find(const IPADDR6 &ip, bool age);
123 IPV6_ROOT_EL *First();
124 IPV6_ROOT_EL_CONTAINER();
125 void Attach(IPv6Interface &Interface, const char *name);
126 void MoveToTop(IPV6_ROOT_EL *pEl);
127 void Remove(IPV6_ROOT_EL *pEl);
128
129 void Show();
130};
131
132struct IPV6_PREFIX;
133
134struct IPV6_DHCPD : public IPV6_ROOT_EL
135{
136 // IPV6_ROOT_EL_CONTAINER addrs;
137 uint8_t m_ServerID[CLIENT_LONG_SERVID]; // Space to contain the ServerID of the leasing server
138 uint32_t m_IAID;
139 uint32_t m_renewTick;
140 uint32_t m_rebindTick;
141
142 void free_element();
143 virtual bool AgeStillValidTest();
144 virtual void ShowItem();
145 IPV6_PREFIX *FindIA_Addr(IPV6_PREFIX *start);
146 inline uint32_t GetDhcpRenewTime() { return m_renewTick; }
147 inline uint32_t GetDhcpRebindTime() { return m_rebindTick; }
148};
149
150struct IPV6_IA_ADDR : public IPV6_ROOT_EL
151{
152 void free_element();
153 virtual bool AgeStillValidTest();
154 virtual void ShowItem();
155};
156
157struct IPV6_ROUTER : public IPV6_ROOT_EL
158{
159 uint16_t m_CheckSumCache;
160 uint32_t m_SecsLastAdvertise;
161 IPV6_NEIGHBOR *m_pNeighbor;
162 uint32_t m_Life_In_Secs;
163 uint16_t m_PathMTU;
164 IPV6_ROUTER *GetNextValid();
165 IPV6_ROUTER *GetNext();
166 void CleanUpAndRemove();
167 void RemoveFromDefault();
168 void free_element();
169 virtual bool AgeStillValidTest();
170
171 virtual void ShowItem();
172};
173
174enum eMY_ADDR_STATE
175{
176 eTenative,
177 eValid_Preferred,
178 eValid_Depricated,
179 eInvalid
180};
181
182enum ePrefixSource
183{
184 eLinkLocal,
185 eRouter,
186 eDHCP,
187 eStatic,
188 eUnknown
189};
190
191// Prefix holds both local addresses and possible router destinations....
192struct IPV6_PREFIX : public IPV6_ROOT_EL
193{
194 eMY_ADDR_STATE m_state;
195 uint32_t time_to_lose_prefered_in_secs_from_establish;
196 uint32_t time_to_lose_valid_in_secs_from_establish;
197 uint32_t time_established_in_secs;
198 uint32_t max_valid_time_seen; // Added to do IOL prefix cleanup if valid time less than 7200
199 IPV6_ROUTER *pRouter; // The router that established me...
200 IPV6_DHCPD *pDHCPD; // Or the DHCP server that established me...
201 uint8_t PrefixLen;
202 bool bValidForInterface;
203 bool bOnLink;
204
205 IPV6_PREFIX *GetNext()
206 {
207 return (IPV6_PREFIX*)m_pNext;
208 }
209 IPV6_PREFIX();
210 void CleanUpAndRemove();
211 void free_element();
212 bool OnLink(const IPADDR6 &ip);
213 bool Prefered();
214 eMY_ADDR_STATE GetState() { return m_state; };
215 virtual void ShowItem();
216
217 inline ePrefixSource Source()
218 {
219 if (pDHCPD) return eDHCP;
220 if (pRouter) return eRouter;
221 if (m_IPAddress.IsLinkLocal()) return eLinkLocal;
222 if ((bValidForInterface) && (bOnLink)) return eStatic;
223 return eUnknown;
224 }
225 inline uint32_t RemainingValidTime()
226 {
227 uint32_t lastt = time_established_in_secs;
228 if (pRouter) lastt = pRouter->m_SecsLastAdvertise;
229 if (time_to_lose_valid_in_secs_from_establish == 0xffffffff) return 0xffffffff;
230 return time_to_lose_valid_in_secs_from_establish - (Secs - lastt);
231 };
232 inline uint32_t GetRemainingDhcpLeaseTime() { return time_to_lose_valid_in_secs_from_establish + time_established_in_secs - Secs; }
233 inline uint32_t GetRemainingDhcpLeasePreferredTime()
234 {
235 return time_to_lose_prefered_in_secs_from_establish + time_established_in_secs - Secs;
236 }
237 virtual bool AgeStillValidTest();
238 bool AgeStillPreferred();
239 void CheckTenative();
240};
241
242struct IPV6_DNS : public IPV6_ROOT_EL
243{
244 uint32_t m_nSecsToBeValid;
245 IPV6_ROUTER *pRouter;
246 IPV6_DHCPD *pDHCPD;
247 IPV6_DNS *GetNext()
248 {
249 return (IPV6_DNS *)m_pNext;
250 }
251 virtual bool AgeStillValidTest();
252 virtual void ShowItem();
253 void CleanUpAndRemove();
254 void free_element();
255};
256
257enum eRouteOutResult
258{
259 eSent,
260 eDoingND,
261 eNoRoute
262};
263enum eMY_NEIGHBOR_STATE
264{
265 eIncomplete,
266 eReachable,
267 eStale,
268 eDelay,
269 eProbe
270};
271
272inline bool ThisCheck(void * p) {return p!=0; }
273
274
275struct IPV6_NEIGHBOR : public IPV6_ROOT_EL
276{
277 MACADR m_Macaddr;
278 eMY_NEIGHBOR_STATE m_NeighborState;
279 uint8_t m_SentNDCount;
280 uint32_t m_TickTimeOfNextAction;
281 bool m_bActiveTimer; // Should we timer service this.
282
283 IPV6_ROUTER *m_pRouter;
284 PoolPtr m_pOutBound1;
285 PoolPtr m_pOutBound2;
286
287 IPV6_NEIGHBOR();
288 IPV6_NEIGHBOR *GetNext()
289 {
290 if (ThisCheck(this))
291 return (IPV6_NEIGHBOR *)m_pNext;
292 else
293 return NULL;
294 }
295
296 void free_element();
297 void Discard();
298 bool ProcessAdvert(IPv6FrameProcessingStruct &p6proc, ICMP6_ND_ADVERT *pRsp);
299 void ProcessTick();
300 void Send_ND_Solicit(bool multicast);
301 eRouteOutResult Send(IPv6FrameProcessingStruct &p6proc, uint16_t mtu);
302 virtual bool AgeStillValidTest();
303 bool StillValidToSend();
304 void SetState(eMY_NEIGHBOR_STATE s);
305 eMY_NEIGHBOR_STATE GetState() { return m_NeighborState; };
306 void CoreSendPend(PoolPtr pp);
307 bool SendPending();
308 virtual void ShowItem();
309};
310
311struct IPV6_DEST : public IPV6_ROOT_EL
312{
313 IPV6_NEIGHBOR *m_pNeighbor;
314 IPV6_DEST *GetNext()
315 {
316 if (ThisCheck(this))
317 return (IPV6_DEST *)m_pNext;
318 else
319 return NULL;
320 }
321 uint16_t m_PathMTU;
322 uint32_t m_nSecsLastUsed;
323 int m_nLockCount; // Used to keep it from being destroyed if some one is using this
324 bool m_bStaticRoute;
325 void free_element();
326 virtual bool AgeStillValidTest();
327 virtual void ShowItem();
328};
329
330// namespace NB {
331// namespace V6 {
332// namespace DHCPv6 {
333// class DHCPClient;
334//}
335//}
336//}
337
338class IPv6Interface : public TimeOutElement
339{
340 int m_ifnum;
341 MACADR m_myMac;
342 uint32_t m_LastFragCheckSec;
343 uint32_t m_LastRouterSolSec;
344 uint32_t m_RouterSolCount;
345 uint32_t m_LastMLDRepSec;
346 bool m_solicitSendLinkLayer;
347 NB::V6::DHCPv6::DHCPClient *m_pDhcpClient;
348
349 OS_CRIT NDCrit;
350 IPV6_ROOT_EL_CONTAINER Prefixes;
351 IPV6_ROOT_EL_CONTAINER Destinations;
352 IPV6_ROOT_EL_CONTAINER Neighbors;
353 IPV6_ROOT_EL_CONTAINER Routers;
354 IPV6_ROOT_EL_CONTAINER DnsList;
355 IPV6_ROOT_EL_CONTAINER DHCPServers;
356
357 volatile PoolPtr m_pp_FragmentParts;
358 virtual void TimeElementEvent();
359 OS_FIFO m_PingFifo;
360
361 IPV6_PREFIX *PrefixAlloc(const IPADDR6 &ip);
362 IPV6_DEST *DestAlloc(const IPADDR6 &ip);
363 IPV6_ROUTER *RouterAlloc(const IPADDR6 &ip);
364 IPV6_NEIGHBOR *NeighborAlloc(const IPADDR6 &ip);
365 IPV6_DNS *DnsAlloc(const IPADDR6 &ip, bool front = false);
366 IPV6_DHCPD *DHCPDAlloc(const IPADDR6 &ip);
367
368 inline IPV6_PREFIX *FindPrefix(const IPADDR6 &ip, bool age = false) { return (IPV6_PREFIX *)Prefixes.Find(ip, age); };
369 inline IPV6_DEST *FindDest(const IPADDR6 &ip, bool age = false) { return (IPV6_DEST *)Destinations.Find(ip, age); };
370 inline IPV6_ROUTER *FindRouter(const IPADDR6 &ip, bool age = false) { return (IPV6_ROUTER *)Routers.Find(ip, age); };
371 inline IPV6_DHCPD *FindDHCPD(const IPADDR6 &ip, bool age = false) { return (IPV6_DHCPD *)DHCPServers.Find(ip, age); };
372 inline IPV6_NEIGHBOR *FindNeighbor(const IPADDR6 &ip, bool age = false) { return (IPV6_NEIGHBOR *)Neighbors.Find(ip, age); };
373 IPV6_NEIGHBOR *FindCreateNeighbor(const IPADDR6 &ip);
374 inline IPV6_PREFIX *FindIA_Addr(IPV6_DHCPD *dhcpd, IPV6_PREFIX *prefix = NULL)
375 {
376 if (prefix == NULL) { prefix = FirstPrefix(); }
377 return dhcpd->FindIA_Addr(prefix);
378 }
379
380 IPV6_DNS *FindDNS(const IPADDR6 &ip, bool age = false, IPV6_DHCPD *pDhcp = NULL); // {return(IPV6_DNS *)DnsList.Find(ip,age);};
381 IPV6_DNS *FindDNSByDHCPD(IPV6_DHCPD *pDhcp, IPV6_DNS *pEl);
382
383 // Interface constants....
384 uint16_t CurHopLimit;
385 uint32_t BaseReachableTime_Ticks; // Base value for random reachable
386 uint32_t ReachableTime_Ticks; // Randomized version of base reachable
387 uint32_t ND_RetranmistTimer_Ticks;
388
389 uint32_t CalcRandomReachable(); // Takes ticks and returns ticks
390
391 IPADDR6 RoundRobinRouterIP;
392 eRouteOutResult RouteOut(IPv6FrameProcessingStruct &p6proc, IPV6_DEST *dest = NULL);
393
394 uint16_t m_MultiCastMtu;
395 uint16_t m_DefMTU;
396 uint8_t m_DefHopCount;
397 volatile bool bHadLink;
398 volatile int m_bStill_Need_To_Process_DupDiscovery_Ticks;
399 volatile bool m_bNeighborTicks;
400
401 /* used to make a walkable list of all ipv6 interfaces */
402 static IPv6Interface *gifList;
403 IPv6Interface *m_pNext;
404 static IPADDR6 NetBurnerMultiCast;
405
406 private:
407 void StartND();
408
409 void SumIcmp(IPv6FrameProcessingStruct &p6proc);
410
411 void RootErrors(uint8_t typev, uint8_t code, uint32_t ptr, IPv6FrameProcessingStruct &p6proc);
412
413 void SendParameterProblem(IPv6FrameProcessingStruct &p6proc, int prob, int offset);
414
415 void SendTimeExceeded(PoolPtr pp);
416
417 void SendUnreachable(IPv6FrameProcessingStruct &p6proc);
418
419 void Tick();
420
421 bool Process_UDP(IPv6FrameProcessingStruct &p6proc);
422
423 bool Process_TCP(IPv6FrameProcessingStruct &p6proc);
424
425 bool Process_Fragment(IPv6FrameProcessingStruct &p6proc);
426
427 bool ProcessND_N_Solicit(IPv6FrameProcessingStruct &p6proc);
428
429 bool ProcessND_N_Advertise(IPv6FrameProcessingStruct &p6proc);
430
431 bool ProcessND_R_Advertise(IPv6FrameProcessingStruct &p6proc);
432
433 bool ProcessRouterOptions(IPV6_ROUTER *pRouter, IPv6FrameProcessingStruct &p6proc, int &rem, uint8_t *&pD);
434
435 bool ProcessND_Redirect(IPv6FrameProcessingStruct &p6proc);
436
437 bool ProcessPingRequest(IPv6FrameProcessingStruct &p6proc);
438
439 bool ProcessPingReply(IPv6FrameProcessingStruct &p6proc);
440
441 // All of the icmp error packets
442 bool ProcessIcmpUnreach(IPv6FrameProcessingStruct &p6proc);
443 bool ProcessTooBig(IPv6FrameProcessingStruct &p6proc);
444 bool ProcessTimeExceeded(IPv6FrameProcessingStruct &p6proc);
445 bool ProcessParamProb(IPv6FrameProcessingStruct &p6proc);
446
447 bool ProcessIcmpV6(IPv6FrameProcessingStruct &p6proc);
448
449 bool ProcessV6(IPv6FrameProcessingStruct &p6proc);
450
451 void AddDefAddress(const IPADDR6 &ip);
452
453 void AddPrefix(const IPADDR6 &ip, int len, int expire);
454
455 bool ValidateIcmpPacket(IPv6FrameProcessingStruct &p6proc);
456
457 void SendRouterSolicit(bool sendLinkLayer);
458
459 void SendDUP_Discover(const IPADDR6 &ip);
460
461 IPADDR6 MyLinkLocalAddress()
462 {
463 if (m_pMyLinkLocal) return m_pMyLinkLocal->m_IPAddress;
464 return IPADDR6::NullIP();
465 };
466
467 friend struct IPV6_PREFIX;
468 friend struct IPV6_DEST;
469 friend struct IPV6_ROUTER;
470 friend struct IPV6_NEIGHBOR;
471 friend struct IPV6_DNS;
472 friend struct IPV6_DHCPD;
473 friend class UDPPacket;
474 friend class NB::V6::DHCPv6::DHCPClient;
475 friend void RetransmitV6Packet(PoolPtr pp, PSOCKET ps);
476 friend void TcpSendwSum6(PSOCKET ps, const IPADDR &IPto, TcpCarrierPacket &pkt, BOOL keep, uint32_t data_sum);
477 friend void TcpSendwSumFrom6(const IPADDR &IPto, const IPADDR &IPfrom, TcpCarrierPacket &pkt, BOOL keep, uint32_t data_sum);
478 friend void InitIPv6(int ifnum);
479 friend int Ping6(const IPADDR6 &to, uint16_t id, uint16_t seq, uint16_t maxwaitticks, int size);
480 friend int Ping6ViaInterface(IPADDR6 &to, uint16_t id, uint16_t seq, uint16_t wait, int interface, int size);
481
482 static void RootProcessV6(PoolPtr pp);
483
484 void MLDTick();
485
486 // Returns true if it used the p6proc, false otherwise.
487 bool ProcessICMPExtension(IPv6FrameProcessingStruct &p6proc);
488 void JoinMulticastGroup(const IPADDR6 &addr);
489 void LeaveMulticastGroup(const IPADDR6 &addr);
490 void ReadyMLDBase(IPv6FrameProcessingStruct &p6proc, const IPADDR6 &recAddr);
491 void LinkLocalIsNowValid();
492
493 void ClearDHCPDInfo(IPV6_DHCPD *pDhcpd = NULL);
494
495 public:
496 inline IPV6_PREFIX *FirstPrefix() { return (IPV6_PREFIX *)Prefixes.First(); };
497 inline IPV6_DEST *FirstDest() { return (IPV6_DEST *)Destinations.First(); };
498 inline IPV6_ROUTER *FirstRouter() { return (IPV6_ROUTER *)Routers.First(); };
499 IPV6_ROUTER *FirstDefRouter();
500 IPV6_DHCPD *FirstDHCPD() { return (IPV6_DHCPD *)DHCPServers.First(); };
501 inline IPV6_NEIGHBOR *FirstNeighbor() { return (IPV6_NEIGHBOR *)Neighbors.First(); };
502 inline IPV6_DNS *FirstDNS() { return (IPV6_DNS *)DnsList.First(); };
503
504 IPV6_PREFIX *m_pMyLinkLocal;
505
506 IPADDR6 m_StaticDNS;
507
508 uint16_t GetDestinationMTU(const IPADDR &ip);
509 static IPv6Interface *GetInterfaceForDestination(const IPADDR6 &ip);
510 static IPv6Interface *GetInterfaceForSource(const IPADDR6 &ip);
511 static IPv6Interface *GetInterfaceN(int n);
512 static IPv6Interface *GetFirst_IP6_Interface();
513 IPv6Interface *GetNext_IP6_Interface();
514
515 IPADDR6 MySourceAddress(const IPADDR6 &ip);
516 int GetInterfaceNumber() { return m_ifnum; };
517
518 IPADDR6 MyDNSAddress();
519 inline bool HadLink() { return bHadLink; }
520
521 IPV6_PREFIX *AddStaticAddress(const IPADDR6 &ip, int PrefixLen);
522 IPV6_ROUTER *AddDefaultGateway(const IPADDR6 &ip);
523 IPV6_DNS *AddStaticDNS(const IPADDR6 &ip);
524
525 // The following functions return true if they have successfully found and removed the indicated address.
526 bool RemoveStaticAddress(const IPADDR6 &ip);
527 bool RemoveDefaultGateway(const IPADDR6 &ip);
528 bool RemoveStaticDNS(const IPADDR6 &ip);
529
530 void SetStaticDNS(IPADDR6 dns) { m_StaticDNS = dns; };
531 inline void StartDHCP_Solicit() { NB::V6::DHCPv6::DHCPClient::ProcessDHCPAvail(this, (uint8_t)RA_FLAG_MANAGED_IP); }
532 inline void StartDHCP_InfoReq() { NB::V6::DHCPv6::DHCPClient::ProcessDHCPAvail(this, (uint8_t)RA_FLAG_OTHER_AVAIL); }
533
534 bool IsMyAddress(const IPADDR6 &ip6, bool bMustBePrefered);
535 bool OnLink(const IPADDR6 &ip6);
536 bool HasRoute(const IPADDR6 &ip6);
537 void NotifyReachable(const IPADDR6 &ip6);
538 void NotifyUnreachable(const IPADDR6 &ip);
539
540 IPADDR6 GetMyFirstAddress()
541 {
542 IPV6_PREFIX *pPrefix = FirstPrefix();
543 if (pPrefix) return pPrefix->m_IPAddress;
544 return IPADDR6::NullIP();
545 };
546
547 IPADDR6 GetMyNextAddress(const IPADDR6 &ip)
548 {
549 IPV6_PREFIX *pPrefix = FindPrefix(ip);
550 if (pPrefix)
551 {
552 pPrefix = pPrefix->GetNext();
553 if (pPrefix) return pPrefix->m_IPAddress;
554 }
555 return IPADDR6::NullIP();
556 };
557
558 IPv6Interface(int ifnum);
559 int ping(const IPADDR6 &ip, uint16_t id, uint16_t seq, uint16_t wait, int siz);
560 int SendMLDRegistration(const IPADDR &regAddr, bool joinNotLeave = true);
561
562 void ShowInfo(); // IP info for a single interface
563 static void ShowAllInfo(); // IP infor for all interfaces
564};
565
566// Dump counters to stdout
567void ShowIP6Counters();
568
569#endif
NetBurner Buffers API.
Used to hold and manipulate IPv4 and IPv6 addresses in dual stack mode.
Definition ipv6_addr.h:41
bool IsLinkLocal() const
Check if the IP address is the link-local address for the interface.
Definition ipv6_addr.h:143
static IPADDR6 NullIP()
Static function to return a null IPADDR6 object.
Used to store and manipulate MAC addresses.
Definition nettypes.h:69
UDP Packet Class.
Definition udp.h:81
void InitIPv6(int ifc=0)
int32_t GetInterfaceNumber(InterfaceBlock *pifb)
Returns the Interface Number of the specified network interface InterfaceBlock.
NetBurner IPADDR6 Class.
NetBurner IPADDR4 Class. See the IPADDR4 Class page for complete documentation.
An OS_CRIT object is used to establish critical sections of code that can only be run by one task at ...
Definition nbrtos.h:1084
Definition nbrtos.h:907