// Create a SSTP server SSTP_SERVER *NewSstpServer(CEDAR *cedar, IP *client_ip, UINT client_port, IP *server_ip, UINT server_port, SOCK_EVENT *se, char *client_host_name, char *crypt_name) { SSTP_SERVER *s = ZeroMalloc(sizeof(SSTP_SERVER)); s->LastRecvTick = Tick64(); StrCpy(s->ClientHostName, sizeof(s->ClientHostName), client_host_name); StrCpy(s->ClientCipherName, sizeof(s->ClientCipherName), crypt_name); s->Cedar = cedar; AddRef(s->Cedar->ref); NewTubePair(&s->TubeSend, &s->TubeRecv, 0); SetTubeSockEvent(s->TubeSend, se); s->Now = Tick64(); Copy(&s->ClientIp, client_ip, sizeof(IP)); s->ClientPort = client_port; Copy(&s->ServerIp, server_ip, sizeof(IP)); s->ServerPort = server_port; s->SockEvent = se; AddRef(s->SockEvent->ref); s->RecvQueue = NewQueueFast(); s->SendQueue = NewQueueFast(); s->Interrupt = NewInterruptManager(); return s; }
// IPv6 パケットヘッダ部のビルド BUF *BuildIPv6PacketHeader(IPV6_HEADER_PACKET_INFO *info, UINT *bytes_before_payload) { BUF *b; QUEUE *q; UINT bbp = 0; // 引数チェック if (info == NULL) { return NULL; } b = NewBuf(); q = NewQueueFast(); // オプションヘッダの一覧を作成 if (info->HopHeader != NULL) { InsertQueueInt(q, IPV6_HEADER_HOP); } if (info->EndPointHeader != NULL) { InsertQueueInt(q, IPV6_HEADER_ENDPOINT); } if (info->RoutingHeader != NULL) { InsertQueueInt(q, IPV6_HEADER_ROUTING); } if (info->FragmentHeader != NULL) { InsertQueueInt(q, IPV6_HEADER_FRAGMENT); } InsertQueueInt(q, info->Protocol); // IPv6 ヘッダ info->IPv6Header->NextHeader = IPv6GetNextHeaderFromQueue(q); WriteBuf(b, info->IPv6Header, sizeof(IPV6_HEADER)); // ホップバイホップオプションヘッダ if (info->HopHeader != NULL) { BuildAndAddIPv6PacketOptionHeader(b, info->HopHeader, IPv6GetNextHeaderFromQueue(q), info->HopHeaderSize); } // 終点オプションヘッダ if (info->EndPointHeader != NULL) { BuildAndAddIPv6PacketOptionHeader(b, info->EndPointHeader, IPv6GetNextHeaderFromQueue(q), info->EndPointHeaderSize); } // ルーティングヘッダ if (info->RoutingHeader != NULL) { BuildAndAddIPv6PacketOptionHeader(b, info->RoutingHeader, IPv6GetNextHeaderFromQueue(q), info->RoutingHeaderSize); } // フラグメントヘッダ if (info->FragmentHeader != NULL) { info->FragmentHeader->NextHeader = IPv6GetNextHeaderFromQueue(q); WriteBuf(b, info->FragmentHeader, sizeof(IPV6_FRAGMENT_HEADER)); } bbp = b->Size; if (info->FragmentHeader == NULL) { bbp += sizeof(IPV6_FRAGMENT_HEADER); } // ペイロード if (info->Protocol != IPV6_HEADER_NONE) { WriteBuf(b, info->Payload, info->PayloadSize); } ReleaseQueue(q); SeekBuf(b, 0, 0); // ペイロード長さ ((IPV6_HEADER *)b->Buf)->PayloadLength = Endian16(b->Size - (USHORT)sizeof(IPV6_HEADER)); if (bytes_before_payload != NULL) { // ペイロードの直前までの長さ (ただしフラグメントヘッダは必ず含まれると仮定) // を計算する *bytes_before_payload = bbp; } return b; }