Changeset 49735 in vbox for trunk/src/VBox/NetworkServices/NetLib
- Timestamp:
- Nov 30, 2013 2:08:42 AM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 91032
- Location:
- trunk/src/VBox/NetworkServices/NetLib
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp
r49558 r49735 71 71 * Structures and Typedefs * 72 72 *******************************************************************************/ 73 struct VBoxNetBaseService::Data 74 { 75 Data(const std::string& aName, const std::string& aNetworkName): 76 m_Name(aName), 77 m_Network(aNetworkName), 78 m_enmTrunkType(kIntNetTrunkType_WhateverNone), 79 m_pSession(NIL_RTR0PTR), 80 m_cbSendBuf(128 * _1K), 81 m_cbRecvBuf(256 * _1K), 82 m_hIf(INTNET_HANDLE_INVALID), 83 m_pIfBuf(NULL), 84 m_cVerbosity(0), 85 m_fNeedMain(false) 86 { 87 int rc = RTCritSectInit(&m_csThis); 88 AssertRC(rc); 89 }; 90 91 std::string m_Name; 92 std::string m_Network; 93 std::string m_TrunkName; 94 INTNETTRUNKTYPE m_enmTrunkType; 95 96 RTMAC m_MacAddress; 97 RTNETADDRIPV4 m_Ipv4Address; 98 RTNETADDRIPV4 m_Ipv4Netmask; 99 100 PSUPDRVSESSION m_pSession; 101 uint32_t m_cbSendBuf; 102 uint32_t m_cbRecvBuf; 103 INTNETIFHANDLE m_hIf; /**< The handle to the network interface. */ 104 PINTNETBUF m_pIfBuf; /**< Interface buffer. */ 105 106 std::vector<PRTGETOPTDEF> m_vecOptionDefs; 107 108 int32_t m_cVerbosity; 109 110 /* cs for syncing */ 111 RTCRITSECT m_csThis; 112 113 /* Controls whether service will connect SVC for runtime needs */ 114 bool m_fNeedMain; 115 }; 73 116 74 117 /******************************************************************************* … … 90 133 91 134 92 VBoxNetBaseService::VBoxNetBaseService() 93 { 94 int rc = RTCritSectInit(&m_csThis); 95 AssertRC(rc); 96 /* numbers from DrvIntNet */ 97 m_cbSendBuf = 128 * _1K; 98 m_cbRecvBuf = 256 * _1K; 99 m_hIf = INTNET_HANDLE_INVALID; 100 m_pIfBuf = NULL; 101 102 m_cVerbosity = 0; 103 m_Name = "VBoxNetNAT"; 104 m_Network = "intnet"; 105 m_fNeedMain = false; 135 VBoxNetBaseService::VBoxNetBaseService(const std::string& aName, const std::string& aNetworkName):m(NULL) 136 { 137 m = new VBoxNetBaseService::Data(aName, aNetworkName); 106 138 107 139 for(unsigned int i = 0; i < RT_ELEMENTS(g_aGetOptDef); ++i) 108 m _vecOptionDefs.push_back(&g_aGetOptDef[i]);140 m->m_vecOptionDefs.push_back(&g_aGetOptDef[i]); 109 141 } 110 142 … … 115 147 * Close the interface connection. 116 148 */ 117 if (m_hIf != INTNET_HANDLE_INVALID) 118 { 119 INTNETIFCLOSEREQ CloseReq; 120 CloseReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC; 121 CloseReq.Hdr.cbReq = sizeof(CloseReq); 122 CloseReq.pSession = m_pSession; 123 CloseReq.hIf = m_hIf; 124 m_hIf = INTNET_HANDLE_INVALID; 125 int rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_RTCPUID, VMMR0_DO_INTNET_IF_CLOSE, 0, &CloseReq.Hdr); 126 AssertRC(rc); 127 } 128 129 if (m_pSession) 130 { 131 SUPR3Term(false /*fForced*/); 132 m_pSession = NIL_RTR0PTR; 133 } 134 RTCritSectDelete(&m_csThis); 149 if (m != NULL) 150 { 151 if (m->m_hIf != INTNET_HANDLE_INVALID) 152 { 153 INTNETIFCLOSEREQ CloseReq; 154 CloseReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC; 155 CloseReq.Hdr.cbReq = sizeof(CloseReq); 156 CloseReq.pSession = m->m_pSession; 157 CloseReq.hIf = m->m_hIf; 158 m->m_hIf = INTNET_HANDLE_INVALID; 159 int rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_RTCPUID, VMMR0_DO_INTNET_IF_CLOSE, 0, &CloseReq.Hdr); 160 AssertRC(rc); 161 } 162 163 if (m->m_pSession != NIL_RTR0PTR) 164 { 165 SUPR3Term(false /*fForced*/); 166 m->m_pSession = NIL_RTR0PTR; 167 } 168 169 RTCritSectDelete(&m->m_csThis); 170 171 delete m; 172 m = NULL; 173 } 135 174 } 136 175 … … 150 189 } 151 190 191 192 bool VBoxNetBaseService::isMainNeeded() const 193 { 194 return m->m_fNeedMain; 195 } 152 196 153 197 /** … … 164 208 RTGETOPTSTATE State; 165 209 PRTGETOPTDEF paOptionArray = getOptionsPtr(); 166 int rc = RTGetOptInit(&State, argc, argv, paOptionArray, m _vecOptionDefs.size(), 0, 0 /*fFlags*/);210 int rc = RTGetOptInit(&State, argc, argv, paOptionArray, m->m_vecOptionDefs.size(), 0, 0 /*fFlags*/); 167 211 AssertRCReturn(rc, 49); 168 212 #if 0 … … 181 225 { 182 226 case 'N': // --name 183 m _Name = Val.psz;227 m->m_Name = Val.psz; 184 228 break; 185 229 186 230 case 'n': // --network 187 m _Network = Val.psz;231 m->m_Network = Val.psz; 188 232 break; 189 233 190 234 case 't': //--trunk-name 191 m _TrunkName = Val.psz;235 m->m_TrunkName = Val.psz; 192 236 break; 193 237 194 238 case 'T': //--trunk-type 195 239 if (!strcmp(Val.psz, "none")) 196 m _enmTrunkType = kIntNetTrunkType_None;240 m->m_enmTrunkType = kIntNetTrunkType_None; 197 241 else if (!strcmp(Val.psz, "whatever")) 198 m _enmTrunkType = kIntNetTrunkType_WhateverNone;242 m->m_enmTrunkType = kIntNetTrunkType_WhateverNone; 199 243 else if (!strcmp(Val.psz, "netflt")) 200 m _enmTrunkType = kIntNetTrunkType_NetFlt;244 m->m_enmTrunkType = kIntNetTrunkType_NetFlt; 201 245 else if (!strcmp(Val.psz, "netadp")) 202 m _enmTrunkType = kIntNetTrunkType_NetAdp;246 m->m_enmTrunkType = kIntNetTrunkType_NetAdp; 203 247 else if (!strcmp(Val.psz, "srvnat")) 204 m _enmTrunkType = kIntNetTrunkType_SrvNat;248 m->m_enmTrunkType = kIntNetTrunkType_SrvNat; 205 249 else 206 250 { … … 211 255 212 256 case 'a': // --mac-address 213 m _MacAddress = Val.MacAddr;257 m->m_MacAddress = Val.MacAddr; 214 258 break; 215 259 216 260 case 'i': // --ip-address 217 m _Ipv4Address = Val.IPv4Addr;261 m->m_Ipv4Address = Val.IPv4Addr; 218 262 break; 219 263 220 264 case 'm': // --netmask 221 m _Ipv4Netmask = Val.IPv4Addr;265 m->m_Ipv4Netmask = Val.IPv4Addr; 222 266 break; 223 267 224 268 case 'v': // --verbose 225 m _cVerbosity++;269 m->m_cVerbosity++; 226 270 break; 227 271 … … 231 275 232 276 case 'M': // --need-main 233 m _fNeedMain = true;277 m->m_fNeedMain = true; 234 278 break; 235 279 … … 246 290 RTBldCfgRevision(), 247 291 RTProcShortName()); 248 for (unsigned int i = 0; i < m _vecOptionDefs.size(); i++)249 RTPrintf(" -%c, %s\n", m _vecOptionDefs[i]->iShort,m_vecOptionDefs[i]->pszLong);292 for (unsigned int i = 0; i < m->m_vecOptionDefs.size(); i++) 293 RTPrintf(" -%c, %s\n", m->m_vecOptionDefs[i]->iShort, m->m_vecOptionDefs[i]->pszLong); 250 294 usage(); /* to print Service Specific usage */ 251 295 return 1; … … 272 316 * Open the session, load ring-0 and issue the request. 273 317 */ 274 int rc = SUPR3Init(&m _pSession);318 int rc = SUPR3Init(&m->m_pSession); 275 319 if (RT_FAILURE(rc)) 276 320 { 277 m _pSession = NIL_RTR0PTR;321 m->m_pSession = NIL_RTR0PTR; 278 322 LogRel(("VBoxNetBaseService: SUPR3Init -> %Rrc\n", rc)); 279 323 return rc; … … 302 346 OpenReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC; 303 347 OpenReq.Hdr.cbReq = sizeof(OpenReq); 304 OpenReq.pSession = m _pSession;305 strncpy(OpenReq.szNetwork, m _Network.c_str(), sizeof(OpenReq.szNetwork));348 OpenReq.pSession = m->m_pSession; 349 strncpy(OpenReq.szNetwork, m->m_Network.c_str(), sizeof(OpenReq.szNetwork)); 306 350 OpenReq.szNetwork[sizeof(OpenReq.szNetwork) - 1] = '\0'; 307 strncpy(OpenReq.szTrunk, m _TrunkName.c_str(), sizeof(OpenReq.szTrunk));351 strncpy(OpenReq.szTrunk, m->m_TrunkName.c_str(), sizeof(OpenReq.szTrunk)); 308 352 OpenReq.szTrunk[sizeof(OpenReq.szTrunk) - 1] = '\0'; 309 OpenReq.enmTrunkType = m _enmTrunkType;353 OpenReq.enmTrunkType = m->m_enmTrunkType; 310 354 OpenReq.fFlags = 0; /** @todo check this */ 311 OpenReq.cbSend = m _cbSendBuf;312 OpenReq.cbRecv = m _cbRecvBuf;355 OpenReq.cbSend = m->m_cbSendBuf; 356 OpenReq.cbRecv = m->m_cbRecvBuf; 313 357 OpenReq.hIf = INTNET_HANDLE_INVALID; 314 358 … … 323 367 return rc; 324 368 } 325 m _hIf = OpenReq.hIf;326 Log2(("successfully opened/created \"%s\" - hIf=%#x\n", OpenReq.szNetwork, m _hIf));369 m->m_hIf = OpenReq.hIf; 370 Log2(("successfully opened/created \"%s\" - hIf=%#x\n", OpenReq.szNetwork, m->m_hIf)); 327 371 328 372 /* … … 332 376 GetBufferPtrsReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC; 333 377 GetBufferPtrsReq.Hdr.cbReq = sizeof(GetBufferPtrsReq); 334 GetBufferPtrsReq.pSession = m _pSession;335 GetBufferPtrsReq.hIf = m _hIf;378 GetBufferPtrsReq.pSession = m->m_pSession; 379 GetBufferPtrsReq.hIf = m->m_hIf; 336 380 GetBufferPtrsReq.pRing3Buf = NULL; 337 381 GetBufferPtrsReq.pRing0Buf = NIL_RTR0PTR; … … 345 389 Log2(("pBuf=%p cbBuf=%d cbSend=%d cbRecv=%d\n", 346 390 pBuf, pBuf->cbBuf, pBuf->cbSend, pBuf->cbRecv)); 347 m _pIfBuf = pBuf;391 m->m_pIfBuf = pBuf; 348 392 349 393 /* … … 353 397 ActiveReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC; 354 398 ActiveReq.Hdr.cbReq = sizeof(ActiveReq); 355 ActiveReq.pSession = m _pSession;356 ActiveReq.hIf = m _hIf;399 ActiveReq.pSession = m->m_pSession; 400 ActiveReq.hIf = m->m_hIf; 357 401 ActiveReq.fActive = true; 358 402 rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_SET_ACTIVE, 0, &ActiveReq.Hdr); … … 370 414 void VBoxNetBaseService::shutdown(void) 371 415 { 416 } 417 418 419 int VBoxNetBaseService::syncEnter() 420 { 421 return RTCritSectEnter(&m->m_csThis); 422 } 423 424 425 int VBoxNetBaseService::syncLeave() 426 { 427 return RTCritSectLeave(&m->m_csThis); 372 428 } 373 429 … … 380 436 WaitReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC; 381 437 WaitReq.Hdr.cbReq = sizeof(WaitReq); 382 WaitReq.pSession = m _pSession;383 WaitReq.hIf = m _hIf;438 WaitReq.pSession = m->m_pSession; 439 WaitReq.hIf = m->m_hIf; 384 440 WaitReq.cMillies = cMillis; 385 441 … … 392 448 int VBoxNetBaseService::sendBufferOnWire(PCINTNETSEG pcSg, int cSg, size_t cbFrame) 393 449 { 394 int rc = VINF_SUCCESS;395 450 PINTNETHDR pHdr = NULL; 396 451 uint8_t *pu8Frame = NULL; 452 453 /* Allocate frame */ 454 int rc = IntNetRingAllocateFrame(&m->m_pIfBuf->Send, cbFrame, &pHdr, (void **)&pu8Frame); 455 AssertRCReturn(rc, rc); 456 457 /* Now we fill pvFrame with S/G above */ 397 458 int offFrame = 0; 398 int idxSg = 0; 399 /* Allocate frame */ 400 rc = IntNetRingAllocateFrame(&m_pIfBuf->Send, cbFrame, &pHdr, (void **)&pu8Frame); 401 AssertRCReturn(rc, rc); 402 /* Now we fill pvFrame with S/G above */ 403 for (idxSg = 0; idxSg < cSg; ++idxSg) 459 for (int idxSg = 0; idxSg < cSg; ++idxSg) 404 460 { 405 461 memcpy(&pu8Frame[offFrame], pcSg[idxSg].pv, pcSg[idxSg].cb); 406 462 offFrame+=pcSg[idxSg].cb; 407 463 } 464 408 465 /* Commit */ 409 IntNetRingCommitFrame (&m_pIfBuf->Send, pHdr);466 IntNetRingCommitFrameEx(&m->m_pIfBuf->Send, pHdr, cbFrame); 410 467 411 468 LogFlowFuncLeaveRC(rc); 412 469 return rc; 413 470 } 471 414 472 /** 415 473 * forcible ask for send packet on the "wire" … … 421 479 SendReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC; 422 480 SendReq.Hdr.cbReq = sizeof(SendReq); 423 SendReq.pSession = m _pSession;424 SendReq.hIf = m _hIf;481 SendReq.pSession = m->m_pSession; 482 SendReq.hIf = m->m_hIf; 425 483 rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_SEND, 0, &SendReq.Hdr); 426 484 AssertRCReturnVoid(rc); 427 485 LogFlowFuncLeave(); 428 486 487 } 488 489 490 int VBoxNetBaseService::hlpUDPBroadcast(unsigned uSrcPort, unsigned uDstPort, 491 void const *pvData, size_t cbData) const 492 { 493 return VBoxNetUDPBroadcast(m->m_pSession, m->m_hIf, m->m_pIfBuf, 494 m->m_Ipv4Address, &m->m_MacAddress, uSrcPort, 495 uDstPort, pvData, cbData); 496 497 } 498 499 500 const std::string VBoxNetBaseService::getName() const 501 { 502 return m->m_Name; 503 } 504 505 506 void VBoxNetBaseService::setName(const std::string& aName) 507 { 508 m->m_Name = aName; 509 } 510 511 512 const std::string VBoxNetBaseService::getNetwork() const 513 { 514 return m->m_Network; 515 } 516 517 518 void VBoxNetBaseService::setNetwork(const std::string& aNetwork) 519 { 520 m->m_Network = aNetwork; 521 } 522 523 524 const RTMAC VBoxNetBaseService::getMacAddress() const 525 { 526 return m->m_MacAddress; 527 } 528 529 530 void VBoxNetBaseService::setMacAddress(const RTMAC& aMac) 531 { 532 m->m_MacAddress = aMac; 533 } 534 535 536 const RTNETADDRIPV4 VBoxNetBaseService::getIpv4Address() const 537 { 538 return m->m_Ipv4Address; 539 } 540 541 542 void VBoxNetBaseService::setIpv4Address(const RTNETADDRIPV4& aAddress) 543 { 544 m->m_Ipv4Address = aAddress; 545 } 546 547 548 const RTNETADDRIPV4 VBoxNetBaseService::getIpv4Netmask() const 549 { 550 return m->m_Ipv4Netmask; 551 } 552 553 554 void VBoxNetBaseService::setIpv4Netmask(const RTNETADDRIPV4& aNetmask) 555 { 556 m->m_Ipv4Netmask = aNetmask; 557 } 558 559 560 uint32_t VBoxNetBaseService::getSendBufSize() const 561 { 562 return m->m_cbSendBuf; 563 } 564 565 566 void VBoxNetBaseService::setSendBufSize(uint32_t cbBuf) 567 { 568 m->m_cbSendBuf = cbBuf; 569 } 570 571 572 uint32_t VBoxNetBaseService::getRecvBufSize() const 573 { 574 return m->m_cbRecvBuf; 575 } 576 577 578 void VBoxNetBaseService::setRecvBufSize(uint32_t cbBuf) 579 { 580 m->m_cbRecvBuf = cbBuf; 581 } 582 583 584 int32_t VBoxNetBaseService::getVerbosityLevel() const 585 { 586 return m->m_cVerbosity; 587 } 588 589 590 void VBoxNetBaseService::setVerbosityLevel(int32_t aVerbosity) 591 { 592 m->m_cVerbosity = aVerbosity; 593 } 594 595 596 void VBoxNetBaseService::addCommandLineOption(const PRTGETOPTDEF optDef) 597 { 598 m->m_vecOptionDefs.push_back(optDef); 599 } 600 601 602 void VBoxNetBaseService::doReceiveLoop() 603 { 604 int rc; 605 /* Well we're ready */ 606 PINTNETRINGBUF pRingBuf = &m->m_pIfBuf->Recv; 607 608 for (;;) 609 { 610 /* 611 * Wait for a packet to become available. 612 */ 613 /* 2. waiting for request for */ 614 rc = waitForIntNetEvent(2000); 615 if (RT_FAILURE(rc)) 616 { 617 if (rc == VERR_TIMEOUT || rc == VERR_INTERRUPTED) 618 { 619 /* do we want interrupt anyone ??? */ 620 continue; 621 } 622 LogRel(("VBoxNetNAT: waitForIntNetEvent returned %Rrc\n", rc)); 623 AssertRCReturnVoid(rc); 624 } 625 626 /* 627 * Process the receive buffer. 628 */ 629 PCINTNETHDR pHdr; 630 631 while ((pHdr = IntNetRingGetNextFrameToRead(pRingBuf)) != NULL) 632 { 633 uint8_t const u8Type = pHdr->u8Type; 634 size_t cbFrame = pHdr->cbFrame; 635 switch (u8Type) 636 { 637 638 case INTNETHDR_TYPE_FRAME: 639 { 640 void *pvFrame = IntNetHdrGetFramePtr(pHdr, m->m_pIfBuf); 641 rc = processFrame(pvFrame, cbFrame); 642 if (RT_FAILURE(rc) && rc == VERR_IGNORED) 643 { 644 /* XXX: UDP + ARP for DHCP */ 645 VBOXNETUDPHDRS Hdrs; 646 size_t cb; 647 void *pv = VBoxNetUDPMatch(m->m_pIfBuf, RTNETIPV4_PORT_BOOTPS, &m->m_MacAddress, 648 VBOXNETUDP_MATCH_UNICAST | VBOXNETUDP_MATCH_BROADCAST 649 | VBOXNETUDP_MATCH_CHECKSUM 650 | (m->m_cVerbosity > 2 ? VBOXNETUDP_MATCH_PRINT_STDERR : 0), 651 &Hdrs, &cb); 652 if (pv && cb) 653 processUDP(pv, cb); 654 else 655 VBoxNetArpHandleIt(m->m_pSession, m->m_hIf, m->m_pIfBuf, &m->m_MacAddress, m->m_Ipv4Address); 656 } 657 } 658 break; 659 case INTNETHDR_TYPE_GSO: 660 { 661 PCPDMNETWORKGSO pGso = IntNetHdrGetGsoContext(pHdr, m->m_pIfBuf); 662 rc = processGSO(pGso, cbFrame); 663 if (RT_FAILURE(rc) && rc == VERR_IGNORED) 664 break; 665 } 666 break; 667 case INTNETHDR_TYPE_PADDING: 668 break; 669 default: 670 break; 671 } 672 IntNetRingSkipFrame(&m->m_pIfBuf->Recv); 673 674 } /* loop */ 675 } 676 677 } 678 679 680 void VBoxNetBaseService::debugPrint(int32_t iMinLevel, bool fMsg, const char *pszFmt, ...) const 681 { 682 if (iMinLevel <= m->m_cVerbosity) 683 { 684 va_list va; 685 va_start(va, pszFmt); 686 debugPrintV(iMinLevel, fMsg, pszFmt, va); 687 va_end(va); 688 } 429 689 } 430 690 … … 440 700 void VBoxNetBaseService::debugPrintV(int iMinLevel, bool fMsg, const char *pszFmt, va_list va) const 441 701 { 442 if (iMinLevel <= m _cVerbosity)702 if (iMinLevel <= m->m_cVerbosity) 443 703 { 444 704 va_list vaCopy; /* This dude is *very* special, thus the copy. */ … … 458 718 { 459 719 PRTGETOPTDEF pOptArray = NULL; 460 pOptArray = (PRTGETOPTDEF)RTMemAlloc(sizeof(RTGETOPTDEF) * m _vecOptionDefs.size());720 pOptArray = (PRTGETOPTDEF)RTMemAlloc(sizeof(RTGETOPTDEF) * m->m_vecOptionDefs.size()); 461 721 if (!pOptArray) 462 722 return NULL; 463 for (unsigned int i = 0; i < m _vecOptionDefs.size(); ++i)464 { 465 PRTGETOPTDEF pOpt = m _vecOptionDefs[i];466 memcpy(&pOptArray[i], m _vecOptionDefs[i], sizeof(RTGETOPTDEF));723 for (unsigned int i = 0; i < m->m_vecOptionDefs.size(); ++i) 724 { 725 PRTGETOPTDEF pOpt = m->m_vecOptionDefs[i]; 726 memcpy(&pOptArray[i], m->m_vecOptionDefs[i], sizeof(RTGETOPTDEF)); 467 727 } 468 728 return pOptArray; -
trunk/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.h
r49560 r49735 20 20 21 21 #include <iprt/critsect.h> 22 class VBoxNetBaseService 22 23 24 class VBoxNetHlpUDPService 23 25 { 24 26 public: 25 VBoxNetBaseService(); 27 virtual int hlpUDPBroadcast(unsigned uSrcPort, unsigned uDstPort, 28 void const *pvData, size_t cbData) const = 0; 29 }; 30 31 32 # ifndef BASE_SERVICES_ONLY 33 class VBoxNetBaseService: public VBoxNetHlpUDPService 34 { 35 public: 36 VBoxNetBaseService(const std::string& aName, const std::string& aNetworkName); 26 37 virtual ~VBoxNetBaseService(); 27 38 int parseArgs(int argc, char **argv); 28 39 int tryGoOnline(void); 29 40 void shutdown(void); 30 int syncEnter() { return RTCritSectEnter(&this->m_csThis);}31 int syncLeave() { return RTCritSectLeave(&this->m_csThis);}41 int syncEnter(); 42 int syncLeave(); 32 43 int waitForIntNetEvent(int cMillis); 33 44 int sendBufferOnWire(PCINTNETSEG pSg, int cSg, size_t cbBuffer); 34 45 void flushWire(); 35 46 47 virtual int hlpUDPBroadcast(unsigned uSrcPort, unsigned uDstPort, 48 void const *pvData, size_t cbData) const; 36 49 virtual void usage(void) = 0; 37 50 virtual int run(void) = 0; 38 51 virtual int parseOpt(int rc, const RTGETOPTUNION& getOptVal) = 0; 52 virtual int processFrame(void *, size_t) = 0; 53 virtual int processGSO(PCPDMNETWORKGSO, size_t) = 0; 54 virtual int processUDP(void *, size_t) = 0; 55 39 56 40 57 virtual int init(void); 41 virtual bool isMainNeeded() const { return m_fNeedMain; } 42 /* VirtualBox instance */ 43 ComPtr<IVirtualBox> virtualbox; 58 virtual bool isMainNeeded() const; 44 59 45 60 protected: 61 const std::string getName() const; 62 void setName(const std::string&); 63 64 const std::string getNetwork() const; 65 void setNetwork(const std::string&); 66 67 const RTMAC getMacAddress() const; 68 void setMacAddress(const RTMAC&); 69 70 const RTNETADDRIPV4 getIpv4Address() const; 71 void setIpv4Address(const RTNETADDRIPV4&); 72 73 const RTNETADDRIPV4 getIpv4Netmask() const; 74 void setIpv4Netmask(const RTNETADDRIPV4&); 75 76 uint32_t getSendBufSize() const; 77 void setSendBufSize(uint32_t); 78 79 uint32_t getRecvBufSize() const; 80 void setRecvBufSize(uint32_t); 81 82 int32_t getVerbosityLevel() const; 83 void setVerbosityLevel(int32_t); 84 85 void addCommandLineOption(const PRTGETOPTDEF); 86 46 87 /** 47 88 * Print debug message depending on the m_cVerbosity level. … … 52 93 * @param ... Optional arguments. 53 94 */ 54 void debugPrint(int32_t iMinLevel, bool fMsg, const char *pszFmt, ...) const 55 { 56 if (iMinLevel <= m_cVerbosity) 57 { 58 va_list va; 59 va_start(va, pszFmt); 60 debugPrintV(iMinLevel, fMsg, pszFmt, va); 61 va_end(va); 62 } 63 } 64 95 void debugPrint(int32_t iMinLevel, bool fMsg, const char *pszFmt, ...) const; 65 96 virtual void debugPrintV(int32_t iMinLevel, bool fMsg, const char *pszFmt, va_list va) const; 66 97 67 /** @name The server configuration data members. 68 * @{ */ 69 std::string m_Name; 70 std::string m_Network; 71 std::string m_TrunkName; 72 INTNETTRUNKTYPE m_enmTrunkType; 73 RTMAC m_MacAddress; 74 RTNETADDRIPV4 m_Ipv4Address; 75 RTNETADDRIPV4 m_Ipv4Netmask; 76 /** @} */ 77 /** @name The network interface 78 * @{ */ 79 PSUPDRVSESSION m_pSession; 80 uint32_t m_cbSendBuf; 81 uint32_t m_cbRecvBuf; 82 INTNETIFHANDLE m_hIf; /**< The handle to the network interface. */ 83 PINTNETBUF m_pIfBuf; /**< Interface buffer. */ 84 std::vector<PRTGETOPTDEF> m_vecOptionDefs; 85 /** @} */ 86 /** @name Debug stuff 87 * @{ */ 88 int32_t m_cVerbosity; 98 void doReceiveLoop(); 99 100 101 protected: 102 /* VirtualBox instance */ 103 ComPtr<IVirtualBox> virtualbox; 104 105 private: 106 struct Data; 107 Data *m; 108 89 109 private: 90 110 PRTGETOPTDEF getOptionsPtr(); 91 92 /* cs for syncing */93 RTCRITSECT m_csThis;94 /* Controls whether service will connect SVC for runtime needs */95 bool m_fNeedMain;96 97 /** @} */98 111 }; 112 # endif 99 113 #endif
Note:
See TracChangeset
for help on using the changeset viewer.