当前位置: 首页 > news >正文

搭建一个网站的基本流程建设银行官方网站个人系统板块修改

搭建一个网站的基本流程,建设银行官方网站个人系统板块修改,学校网站建设风险分析,旅游最适合的城市UDP4 UDP4协议说明 UDP的全称是User Datagram Protocol#xff0c;它不提供复杂的控制机制#xff0c;仅利用IP提供面向无连接的通信服务。它将上层应用程序发来的数据在收到的那一刻#xff0c;立即按照原样发送到网络。 UDP报文格式#xff1a; 各个参数说明如下…UDP4 UDP4协议说明 UDP的全称是User Datagram Protocol它不提供复杂的控制机制仅利用IP提供面向无连接的通信服务。它将上层应用程序发来的数据在收到的那一刻立即按照原样发送到网络。 UDP报文格式 各个参数说明如下 字段长度字节描述Source Port2发送端口标识哪个应用程序发送发送进程。Destination Port2目标端口标识哪个应用程序接收接收进程。Length2UDP首部加上UDP数据的字节数最小为8。Checksum2覆盖UDP首部和UDP数据是可选的。data octets变长UDP负载可选的。 前面的四个参数对应到UEFI代码中就是UDP头部 // // UDP header definition // typedef struct {UINT16 SrcPort;UINT16 DstPort;UINT16 Length;UINT16 Checksum; } EFI_UDP_HEADER;UDP4代码综述 UDP4也是一个通用的网络协议其实现在NetworkPkg\Udp4Dxe\Udp4Dxe.inf这里首先需要看下它的入口 EFI_STATUS EFIAPI Udp4DriverEntryPoint (IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable) {//// Install the Udp4DriverBinding and Udp4ComponentName protocols.//Status EfiLibInstallDriverBindingComponentName2 (ImageHandle,SystemTable,gUdp4DriverBinding,ImageHandle,gUdp4ComponentName,gUdp4ComponentName2);if (!EFI_ERROR (Status)) {//// Initialize the UDP random port.//mUdp4RandomPort (UINT16)(((UINT16)NetRandomInitSeed ()) % UDP4_PORT_KNOWN UDP4_PORT_KNOWN); // 宏的值是1024} }因为UDP4也是一个UEFI Driver Model所以第一步是安装gUdp4DriverBinding其实现 EFI_DRIVER_BINDING_PROTOCOL gUdp4DriverBinding {Udp4DriverBindingSupported,Udp4DriverBindingStart,Udp4DriverBindingStop,0xa,NULL,NULL };而第二步是初始化一个随机的UDP端口根据通用网络协议的做法UDP的端口占两个字节即16位只要不是0-1023里面的公认端口都可以且跟TCP端口的一致也没有关系。 UDP4在UEFI网络协议栈中的关系图 #mermaid-svg-QingpuH7WDUuL4pX {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QingpuH7WDUuL4pX .error-icon{fill:#552222;}#mermaid-svg-QingpuH7WDUuL4pX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QingpuH7WDUuL4pX .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-QingpuH7WDUuL4pX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QingpuH7WDUuL4pX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QingpuH7WDUuL4pX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QingpuH7WDUuL4pX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QingpuH7WDUuL4pX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QingpuH7WDUuL4pX .marker.cross{stroke:#333333;}#mermaid-svg-QingpuH7WDUuL4pX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QingpuH7WDUuL4pX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-QingpuH7WDUuL4pX .cluster-label text{fill:#333;}#mermaid-svg-QingpuH7WDUuL4pX .cluster-label span{color:#333;}#mermaid-svg-QingpuH7WDUuL4pX .label text,#mermaid-svg-QingpuH7WDUuL4pX span{fill:#333;color:#333;}#mermaid-svg-QingpuH7WDUuL4pX .node rect,#mermaid-svg-QingpuH7WDUuL4pX .node circle,#mermaid-svg-QingpuH7WDUuL4pX .node ellipse,#mermaid-svg-QingpuH7WDUuL4pX .node polygon,#mermaid-svg-QingpuH7WDUuL4pX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-QingpuH7WDUuL4pX .node .label{text-align:center;}#mermaid-svg-QingpuH7WDUuL4pX .node.clickable{cursor:pointer;}#mermaid-svg-QingpuH7WDUuL4pX .arrowheadPath{fill:#333333;}#mermaid-svg-QingpuH7WDUuL4pX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-QingpuH7WDUuL4pX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-QingpuH7WDUuL4pX .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-QingpuH7WDUuL4pX .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-QingpuH7WDUuL4pX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-QingpuH7WDUuL4pX .cluster text{fill:#333;}#mermaid-svg-QingpuH7WDUuL4pX .cluster span{color:#333;}#mermaid-svg-QingpuH7WDUuL4pX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-QingpuH7WDUuL4pX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-QingpuH7WDUuL4pX .default*{fill:#bbb!important;stroke:#333!important;stroke-width:2px!important;}#mermaid-svg-QingpuH7WDUuL4pX .default span{fill:#bbb!important;stroke:#333!important;stroke-width:2px!important;} 支持 提供 支持 支持 提供 支持 提供 提供 提供 支持 提供 提供 支持 支持 提供 提供 提供 支持 提供 提供 gEfiPciIoProtocolGuid UNDI gEfiNetworkInterfaceIdentifierProtocolGuid_31 gEfiDevicePathProtocolGuid SNP gEfiSimpleNetworkProtocolGuid MNP gEfiVlanConfigProtocolGuid gEfiManagedNetworkServiceBindingProtocolGuid gEfiManagedNetworkProtocolGuid ARP gEfiArpServiceBindingProtocolGuid gEfiArpProtocolGuid IP4 gEfiIp4ServiceBindingProtocolGuid gEfiIp4Config2ProtocolGuid gEfiIp4ProtocolGuid UDP4 gEfiUdp4ServiceBindingProtocolGuid gEfiUdp4ProtocolGuid Udp4DriverBindingSupported UDP4依赖于IP4 EFI_STATUS EFIAPI Udp4DriverBindingSupported (IN EFI_DRIVER_BINDING_PROTOCOL *This,IN EFI_HANDLE ControllerHandle,IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL) {//// Test for the Ip4 Protocol//Status gBS-OpenProtocol (ControllerHandle,gEfiIp4ServiceBindingProtocolGuid,NULL,This-DriverBindingHandle,ControllerHandle,EFI_OPEN_PROTOCOL_TEST_PROTOCOL); }Udp4DriverBindingStart Start函数的流程大致如下 初始化UDP4_SERVICE_DATA。安装gEfiUdp4ServiceBindingProtocolGuid。 同其它驱动一样重点也是结构体这里就是UDP4_SERVICE_DATA。 UDP4_SERVICE_DATA UDP4_SERVICE_DATA在Start函数中创建 EFI_STATUS EFIAPI Udp4DriverBindingStart (IN EFI_DRIVER_BINDING_PROTOCOL *This,IN EFI_HANDLE ControllerHandle,IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL) {Status Udp4CreateService (Udp4Service, This-DriverBindingHandle, ControllerHandle); }其结构体定义如下 typedef struct _UDP4_SERVICE_DATA_ {UINT32 Signature;EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;EFI_HANDLE ImageHandle;EFI_HANDLE ControllerHandle;LIST_ENTRY ChildrenList;UINTN ChildrenNumber;IP_IO *IpIo;EFI_EVENT TimeoutEvent; } UDP4_SERVICE_DATA;相比之前的服务数据这个结构体相当得简单其中比较重要的成员有 ServiceBinding对应mUdp4ServiceBinding EFI_SERVICE_BINDING_PROTOCOL mUdp4ServiceBinding {Udp4ServiceBindingCreateChild,Udp4ServiceBindingDestroyChild };用于创建UDP4子项。 ChildrenListChildrenNumber对应UDP4_INSTANCE_DATA结构体由Udp4ServiceBindingCreateChild()创建是表示子项的结构体在UDP4_INSTANCE_DATA会进一步介绍。IpIo它是对IP4实例的一个包装UDP4通过它来进行通信在IP_IO已经介绍过。在UDP4以及TCP4中会进场看到类似IP_IO这样的结构体它们仅仅是对IP层的保证之所以要有这样的包装是因为存在IPv4和IPv6两个版本而这里只关注IPv4。TimeoutEvent一个定时事件创建的位置是在Udp4CreateService()函数中 EFI_STATUS Udp4CreateService (IN OUT UDP4_SERVICE_DATA *Udp4Service,IN EFI_HANDLE ImageHandle,IN EFI_HANDLE ControllerHandle) {//// Create the event for Udp timeout checking.//Status gBS-CreateEvent (EVT_TIMER | EVT_NOTIFY_SIGNAL,TPL_CALLBACK,Udp4CheckTimeout,Udp4Service,Udp4Service-TimeoutEvent);//// Start the timeout timer event.//Status gBS-SetTimer (Udp4Service-TimeoutEvent,TimerPeriodic,UDP4_TIMEOUT_INTERVAL // 50 milliseconds);对应的回调函数Udp4CheckTimeout()它用来检测接收到的报文是否过期其主体代码 VOID EFIAPI Udp4CheckTimeout (IN EFI_EVENT Event,IN VOID *Context) {NET_LIST_FOR_EACH (Entry, Udp4Service-ChildrenList) {//// Iterate all the instances belonging to this service context.//Instance NET_LIST_USER_STRUCT (Entry, UDP4_INSTANCE_DATA, Link);NET_CHECK_SIGNATURE (Instance, UDP4_INSTANCE_DATA_SIGNATURE);if (!Instance-Configured || (Instance-ConfigData.ReceiveTimeout 0)) {//// Skip this instance if its not configured or no receive timeout.//continue;}NET_LIST_FOR_EACH_SAFE (WrapEntry, NextEntry, Instance-RcvdDgramQue) {//// Iterate all the rxdatas belonging to this udp instance.//Wrap NET_LIST_USER_STRUCT (WrapEntry, UDP4_RXDATA_WRAP, Link);//// TimeoutTick unit is microsecond, MNP_TIMEOUT_CHECK_INTERVAL unit is 100ns.//if (Wrap-TimeoutTick (UDP4_TIMEOUT_INTERVAL / 10)) {//// Remove this RxData if it timeouts.//Udp4RecycleRxDataWrap (NULL, (VOID *)Wrap);} else {Wrap-TimeoutTick - (UDP4_TIMEOUT_INTERVAL / 10);}}} }这里的Wrap对应结构体UDP4_RXDATA_WRAP typedef struct _UDP4_RXDATA_WRAP_ {LIST_ENTRY Link;NET_BUF *Packet;UINT32 TimeoutTick;EFI_UDP4_RECEIVE_DATA RxData; } UDP4_RXDATA_WRAP;它通过Udp4WrapRxData()创建然后放到一个队列中供UDP驱动处理如果来不及处理就会过期而过期时间也由这里的成员TimeoutTick指定而该成员由另外的一个值指定 Wrap-TimeoutTick Instance-ConfigData.ReceiveTimeout;Instance是后面会介绍的UDP4_INSTANCE_DATA中的配置参数ConfigDataConfigData.ReceiveTimeout的值在创建时是-1表示不会过期 //// use the -1 magic number to disable the receiving process of the ip instance.//Ip4ConfigData-ReceiveTimeout (UINT32)(-1);不过在UDP4的配置中可以修改 EFI_STATUS EFIAPI Udp4Configure (IN EFI_UDP4_PROTOCOL *This,IN EFI_UDP4_CONFIG_DATA *UdpConfigData OPTIONAL) {if (UdpConfigData ! NULL) {if (Instance-Configured) {//// Save the reconfigurable parameters.//Instance-ConfigData.TransmitTimeout UdpConfigData-TransmitTimeout;}} }UDP4_INSTANCE_DATA UDP4_INSTANCE_DATA表示一个UDP4子项其它位于NetworkPkg\Udp4Dxe\Udp4Impl.h typedef struct _UDP4_INSTANCE_DATA_ {UINT32 Signature;LIST_ENTRY Link;UDP4_SERVICE_DATA *Udp4Service;EFI_UDP4_PROTOCOL Udp4Proto;EFI_UDP4_CONFIG_DATA ConfigData;EFI_HANDLE ChildHandle;BOOLEAN Configured;BOOLEAN IsNoMapping;NET_MAP TxTokens;NET_MAP RxTokens;NET_MAP McastIps;LIST_ENTRY RcvdDgramQue;LIST_ENTRY DeliveredDgramQue;UINT16 HeadSum;EFI_STATUS IcmpError;IP_IO_IP_INFO *IpInfo;BOOLEAN InDestroy; } UDP4_INSTANCE_DATA;下面介绍其中比较重要的成员 Udp4Service指向UDP4服务的结构体。 Udp4Proto对应EFI_UDP4_PROTOCOL后面会进一步介绍。 ConfigDataUDP配置数据 typedef struct {//// Receiving Filters//BOOLEAN AcceptBroadcast;BOOLEAN AcceptPromiscuous;BOOLEAN AcceptAnyPort;BOOLEAN AllowDuplicatePort;//// I/O parameters//UINT8 TypeOfService;UINT8 TimeToLive;BOOLEAN DoNotFragment;UINT32 ReceiveTimeout;UINT32 TransmitTimeout;//// Access Point//BOOLEAN UseDefaultAddress;EFI_IPv4_ADDRESS StationAddress;EFI_IPv4_ADDRESS SubnetMask;UINT16 StationPort;EFI_IPv4_ADDRESS RemoteAddress;UINT16 RemotePort; } EFI_UDP4_CONFIG_DATA;TxTokens、RxTokens描述收发数据的映射 typedef struct {LIST_ENTRY Used;LIST_ENTRY Recycled;UINTN Count; } NET_MAP;真正的Token是EFI_UDP4_COMPLETION_TOKEN typedef struct {EFI_EVENT Event;EFI_STATUS Status;union {EFI_UDP4_RECEIVE_DATA *RxData;EFI_UDP4_TRANSMIT_DATA *TxData;} Packet; } EFI_UDP4_COMPLETION_TOKEN;RcvdDgramQue、DeliveredDgramQue处理收发数据的队列。IpInfo底层IP4实例需要使用到的结构体 /// /// The IP_IO_IP_INFO is used in IpIoSend() to override the default IP instance /// in IP_IO. /// typedef struct _IP_IO_IP_INFO {EFI_IP_ADDRESS Addr;IP_IO_IP_MASK PreMask;LIST_ENTRY Entry;EFI_HANDLE ChildHandle;IP_IO_IP_PROTOCOL Ip;IP_IO_IP_COMPLETION_TOKEN DummyRcvToken;INTN RefCnt;UINT8 IpVersion; } IP_IO_IP_INFO;从注释中可以看到发送数据时会使用到。 EFI_UDP4_PROTOCOL UDP4通信的接口该Protocol的结构体如下 /// /// The EFI_UDP4_PROTOCOL defines an EFI UDPv4 Protocol session that can be used /// by any network drivers, applications, or daemons to transmit or receive UDP packets. /// This protocol instance can either be bound to a specified port as a service or /// connected to some remote peer as an active client. Each instance has its own settings, /// such as the routing table and group table, which are independent from each other. /// struct _EFI_UDP4_PROTOCOL {EFI_UDP4_GET_MODE_DATA GetModeData;EFI_UDP4_CONFIGURE Configure;EFI_UDP4_GROUPS Groups;EFI_UDP4_ROUTES Routes;EFI_UDP4_TRANSMIT Transmit;EFI_UDP4_RECEIVE Receive;EFI_UDP4_CANCEL Cancel;EFI_UDP4_POLL Poll; };对应的实现 EFI_UDP4_PROTOCOL mUdp4Protocol {Udp4GetModeData,Udp4Configure,Udp4Groups,Udp4Routes,Udp4Transmit,Udp4Receive,Udp4Cancel,Udp4Poll };后面会介绍这些函数的实现。 Udp4.GetModeData 对应的实现是Udp4GetModeData()其代码实现 EFI_STATUS EFIAPI Udp4GetModeData (IN EFI_UDP4_PROTOCOL *This,OUT EFI_UDP4_CONFIG_DATA *Udp4ConfigData OPTIONAL,OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL,OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL) {if (Udp4ConfigData ! NULL) {//// Set the Udp4ConfigData.//CopyMem (Udp4ConfigData, Instance-ConfigData, sizeof (*Udp4ConfigData));}Ip Instance-IpInfo-Ip.Ip4;//// Get the underlying Ip4ModeData, MnpConfigData and SnpModeData.//Status Ip-GetModeData (Ip, Ip4ModeData, MnpConfigData, SnpModeData);}从这里可以看出上层的网络协议可以获取到下层所有的模式数据。 对于UDP4来说数据在UDP4_INSTANCE_DATA的ConfigData成员中。 Udp4.Configure 对应的实现是Udp4Configure()其代码实现 EFI_STATUS EFIAPI Udp4Configure (IN EFI_UDP4_PROTOCOL *This,IN EFI_UDP4_CONFIG_DATA *UdpConfigData OPTIONAL) {// 根据是否有配置存在两种情况没有数据相当于重置if (UdpConfigData ! NULL) {if (Instance-Configured) {//// The instance is already configured, try to do the re-configuration.//if (!Udp4IsReconfigurable (Instance-ConfigData, UdpConfigData)) {//// If the new configuration data wants to change some unreconfigurable// settings, return EFI_ALREADY_STARTED.//Status EFI_ALREADY_STARTED;goto ON_EXIT;}//// Save the reconfigurable parameters.//Instance-ConfigData.TypeOfService UdpConfigData-TypeOfService;Instance-ConfigData.TimeToLive UdpConfigData-TimeToLive;Instance-ConfigData.DoNotFragment UdpConfigData-DoNotFragment;Instance-ConfigData.ReceiveTimeout UdpConfigData-ReceiveTimeout;Instance-ConfigData.TransmitTimeout UdpConfigData-TransmitTimeout;} else {//// Construct the Ip configuration data from the UdpConfigData.//Udp4BuildIp4ConfigData (UdpConfigData, Ip4ConfigData);//// Configure the Ip instance wrapped in the IpInfo.//Status IpIoConfigIp (Instance-IpInfo, Ip4ConfigData);if (EFI_ERROR (Status)) {if (Status EFI_NO_MAPPING) {Instance-IsNoMapping TRUE;}goto ON_EXIT;}Instance-IsNoMapping FALSE;//// Save the configuration data.//CopyMem (Instance-ConfigData, UdpConfigData, sizeof (Instance-ConfigData));IP4_COPY_ADDRESS (Instance-ConfigData.StationAddress, Ip4ConfigData.StationAddress);IP4_COPY_ADDRESS (Instance-ConfigData.SubnetMask, Ip4ConfigData.SubnetMask);//// Try to allocate the required port resource.//Status Udp4Bind (Udp4Service-ChildrenList, Instance-ConfigData);if (EFI_ERROR (Status)) {//// Reset the ip instance if bind fails.//IpIoConfigIp (Instance-IpInfo, NULL);goto ON_EXIT;}//// Pre calculate the checksum for the pseudo head, ignore the UDP length first.//CopyMem (LocalAddr, Instance-ConfigData.StationAddress, sizeof (IP4_ADDR));CopyMem (RemoteAddr, Instance-ConfigData.RemoteAddress, sizeof (IP4_ADDR));Instance-HeadSum NetPseudoHeadChecksum (LocalAddr,RemoteAddr,EFI_IP_PROTO_UDP,0);Instance-Configured TRUE;}} else {//// UdpConfigData is NULL, reset the instance.//Instance-Configured FALSE;Instance-IsNoMapping FALSE;//// Reset the Ip instance wrapped in the IpInfo.//IpIoConfigIp (Instance-IpInfo, NULL);//// Cancel all the user tokens.//Instance-Udp4Proto.Cancel (Instance-Udp4Proto, NULL);//// Remove the buffered RxData for this instance.//Udp4FlushRcvdDgram (Instance);} }根据输入参数的不同以及是否已经配置过会走到不同的流程此外UDP4还会配置进一步调用IP4的接口进行配置。 Udp4.Transmit 对应的实现是Udp4Transmit()其代码实现 EFI_STATUS EFIAPI Udp4Transmit (IN EFI_UDP4_PROTOCOL *This,IN EFI_UDP4_COMPLETION_TOKEN *Token) {//// Validate the Token, if the token is invalid return the error code.//Status Udp4ValidateTxToken (Instance, Token);if (EFI_ERROR (Status)) {goto ON_EXIT;}if (EFI_ERROR (NetMapIterate (Instance-TxTokens, Udp4TokenExist, Token)) ||EFI_ERROR (NetMapIterate (Instance-RxTokens, Udp4TokenExist, Token))){//// Try to find a duplicate token in the two token maps, if found, return// EFI_ACCESS_DENIED.//Status EFI_ACCESS_DENIED;goto ON_EXIT;}TxData Token-Packet.TxData;//// Create a net buffer to hold the user buffer and the udp header.//Packet NetbufFromExt ((NET_FRAGMENT *)TxData-FragmentTable,TxData-FragmentCount,UDP4_HEADER_SIZE,0,Udp4NetVectorExtFree,NULL);if (Packet NULL) {Status EFI_OUT_OF_RESOURCES;goto ON_EXIT;}//// Store the IpIo in ProtoData.//Udp4Service Instance-Udp4Service;*((UINTN *)Packet-ProtoData[0]) (UINTN)(Udp4Service-IpIo);Udp4Header (EFI_UDP_HEADER *)NetbufAllocSpace (Packet, UDP4_HEADER_SIZE, TRUE);ASSERT (Udp4Header ! NULL);ConfigData Instance-ConfigData;//// Fill the udp header.//Udp4Header-SrcPort HTONS (ConfigData-StationPort);Udp4Header-DstPort HTONS (ConfigData-RemotePort);Udp4Header-Length HTONS ((UINT16)Packet-TotalSize);Udp4Header-Checksum 0;UdpSessionData TxData-UdpSessionData;IP4_COPY_ADDRESS (Override.Ip4OverrideData.SourceAddress, ConfigData-StationAddress);if (UdpSessionData ! NULL) {//// Set the SourceAddress, SrcPort and Destination according to the specified// UdpSessionData.//if (!EFI_IP4_EQUAL (UdpSessionData-SourceAddress, mZeroIp4Addr)) {IP4_COPY_ADDRESS (Override.Ip4OverrideData.SourceAddress, UdpSessionData-SourceAddress);}if (UdpSessionData-SourcePort ! 0) {Udp4Header-SrcPort HTONS (UdpSessionData-SourcePort);}if (UdpSessionData-DestinationPort ! 0) {Udp4Header-DstPort HTONS (UdpSessionData-DestinationPort);}CopyMem (Source, Override.Ip4OverrideData.SourceAddress, sizeof (IP4_ADDR));CopyMem (Destination, UdpSessionData-DestinationAddress, sizeof (IP4_ADDR));//// calculate the pseudo head checksum using the overridden parameters.//HeadSum NetPseudoHeadChecksum (Source,Destination,EFI_IP_PROTO_UDP,0);} else {//// UdpSessionData is NULL, use the address and port information previously configured.//CopyMem (Destination, ConfigData-RemoteAddress, sizeof (IP4_ADDR));HeadSum Instance-HeadSum;}//// calculate the checksum.//Udp4Header-Checksum Udp4Checksum (Packet, HeadSum);if (Udp4Header-Checksum 0) {//// If the calculated checksum is 0, fill the Checksum field with all ones.//Udp4Header-Checksum 0xffff;}//// Fill the IpIo Override data.//if (TxData-GatewayAddress ! NULL) {IP4_COPY_ADDRESS (Override.Ip4OverrideData.GatewayAddress, TxData-GatewayAddress);} else {ZeroMem (Override.Ip4OverrideData.GatewayAddress, sizeof (EFI_IPv4_ADDRESS));}Override.Ip4OverrideData.Protocol EFI_IP_PROTO_UDP;Override.Ip4OverrideData.TypeOfService ConfigData-TypeOfService;Override.Ip4OverrideData.TimeToLive ConfigData-TimeToLive;Override.Ip4OverrideData.DoNotFragment ConfigData-DoNotFragment;//// Save the token into the TxToken map.//Status NetMapInsertTail (Instance-TxTokens, Token, Packet);//// Send out this datagram through IpIo.//IpDestAddr.Addr[0] Destination;Status IpIoSend (Udp4Service-IpIo,Packet,Instance-IpInfo,Instance,Token,IpDestAddr,Override); }Udp4.Receive 对应的实现是Udp4Receive()其代码实现 EFI_STATUS EFIAPI Udp4Receive (IN EFI_UDP4_PROTOCOL *This,IN EFI_UDP4_COMPLETION_TOKEN *Token) {if (EFI_ERROR (NetMapIterate (Instance-RxTokens, Udp4TokenExist, Token)) ||EFI_ERROR (NetMapIterate (Instance-TxTokens, Udp4TokenExist, Token))){//// Return EFI_ACCESS_DENIED if the specified token is already in the TxTokens or// RxTokens map.//Status EFI_ACCESS_DENIED;goto ON_EXIT;}Token-Packet.RxData NULL;//// Save the token into the RxTokens map.//Status NetMapInsertTail (Instance-RxTokens, Token, NULL);if (EFI_ERROR (Status)) {Status EFI_NOT_READY;goto ON_EXIT;}//// If there is an icmp error, report it.//Udp4ReportIcmpError (Instance);//// Try to deliver the received datagrams.//Udp4InstanceDeliverDgram (Instance);//// Dispatch the DPC queued by the NotifyFunction of Token-Event.//DispatchDpc (); }同其它的网络协议中的Receive一样重点是注册Token。 Udp4.Poll 对应的实现是Udp4Poll()其代码实现就是调用下一层的Poll EFI_STATUS EFIAPI Udp4Poll (IN EFI_UDP4_PROTOCOL *This) {Ip Instance-IpInfo-Ip.Ip4;//// Invode the Ip instance consumed by the udp instance to do the poll operation.//return Ip-Poll (Ip); }代码示例 DHCP和DNS等都是使用UDP的后面会进一步说明。
http://www.zqtcl.cn/news/271601/

相关文章:

  • 90设计网站怎么绑定手机号淘宝搜索排名
  • 无锡自助做网站哪些编程语言适合网站开发
  • 蒲城网站建设wzjseo北京专业推广公司
  • 阳春做网站外贸建站推广公司
  • 哪个网站的课件做的好源码之家关闭了
  • 各大网站热搜榜排名嵊州网站
  • 在哪找做网站的镇江网页设计工作室
  • 做网站的是干嘛的百度推广的几种方式
  • 临沧网站建设用eclipse做jsp网站
  • 做物流运输网站电话做网站看
  • 山东公司网站推广优化什么网站做宣传好
  • 企业网站模板设计外网vp(永久免费)加速器下载
  • 消费者联盟网站怎么做中山网站建设案例
  • 郑州市多商家网站制作公司网站建设要学多少课程
  • 现在网站开发模式淄博网站建设设计公司
  • 瑶海合肥网站建设东莞网站优化多少钱
  • pc蛋蛋游戏体验网站建设大型门户网站建设效果好吗
  • 昆明网站建设制作汽车之家官网网页版入口
  • 诸城建设局网站免费的创建个人网站
  • 网站建设工作下步打算上海搬家公司电话查询
  • 如何将自己做的网站推广出去大型网站方案
  • 深圳做网站排名哪家好贵阳景观设计公司
  • 做图片网站中英网站搭建报价表
  • 酒类网站该怎么做网站建设协议
  • 怎么打帮人 做网站开发的广告双语言网站模版
  • 企业网站建设的实验报告广告公司网站建设方案
  • 安徽茶叶商城网站建设贵阳市花溪区建设局网站
  • 广西网站建设制作推广普通话倡议书
  • 最新网站建设的模板下载小制作作文400字
  • 海南省城乡建设部网站首页央视新闻