阅读:1648回复:5
问个问题
如果在passthru中对payload进行加密,由于原始数据长度接近MTU,加密后长度超过1500,此时需要对package进行fragment,应该如何处理?
多谢。 |
|
沙发#
发布于:2009-04-18 15:15
自己回答吧,http://bbs.driverdevelop.com/read.php?tid=12522,虽然我对驱动了解不深,但以为构造pmtu,似乎不是那么的稳妥,比如发送pmtu的时机等等,尤须思考。
|
|
板凳#
发布于:2009-04-18 15:16
顺便贴个别人的ipsec的source code,http://blog.csdn.net/Mycro/archive/2006/03/01/613195.aspx
|
|
地板#
发布于:2009-04-18 15:18
|
|
地下室#
发布于:2009-04-20 10:37
I thought that is answer for my problem eventually, copy from yahoo group.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// You need to filter the OID_GEN_MAXIMUM_TOTAL_SIZE and OID_GEN_MAXIMUM_FRAME_SIZE queries in the completion path. There you will see the values returned by the lower-level NIC. Stash these, and remember that they can be greater than 1514 and 1500 for 1Gbe NICs with Jumbo frames. Modify the value returned to higher-level protocols by subtracting the length of your extra header. Verify that you have made this mod correctly using OIDScope. |
|
5楼#
发布于:2009-04-20 10:49
Ohooooooooo, code also givennnnnnnnnnnn.
if (Oid == OID_GEN_MAXIMUM_FRAME_SIZE && ConfigData.LanMTU && !Adapter->bWanAdapter) { if (IMReqBuffer->ReqBuffer.RequestType == NdisRequestQueryInformation) { if (IMReqBuffer->ReqBuffer.DATA.QUERY_INFORMATION.InformationBufferLength == sizeof(INT)) { INT OrgSize = *((PULONG)IMReqBuffer->ReqBuffer.DATA.QUERY_INFORMATION.InformationBuffer); if (OrgSize > ConfigData.LanMTU) { *((PULONG)IMReqBuffer->ReqBuffer.DATA.QUERY_INFORMATION.InformationBuffer) = ConfigData.LanMTU; IMReqBuffer->ReqBuffer.DATA.QUERY_INFORMATION.BytesWritten = sizeof(INT); ImDbgOut(DBG_INFO, DBG_INIT, ("Spoofing FRAME_SIZE for %.08X: %d, %d\n", Adapter, ConfigData.LanMTU, OrgSize)); } else { ImDbgOut(DBG_INFO, DBG_INIT, ("NOT Spoofing FRAME_SIZE for %.08X: %d, %d\n", Adapter, ConfigData.LanMTU, OrgSize)); } } } } if (Oid == OID_GEN_MAXIMUM_TOTAL_SIZE && ConfigData.LanMTU && !Adapter->bWanAdapter) { if (IMReqBuffer->ReqBuffer.RequestType == NdisRequestQueryInformation) { if (IMReqBuffer->ReqBuffer.DATA.QUERY_INFORMATION.InformationBufferLength == sizeof(INT)) { INT OrgSize = *((PULONG)IMReqBuffer->ReqBuffer.DATA.QUERY_INFORMATION.InformationBuffer); INT Size = Adapter->TotalSize ? Adapter->TotalSize : MAXETH8023LEN; if (OrgSize > Size && ConfigData.LanMTU) { Size -= MAXETH8023LEN - ConfigData.LanMTU; *((PULONG)IMReqBuffer->ReqBuffer.DATA.QUERY_INFORMATION.InformationBuffer) = Size; IMReqBuffer->ReqBuffer.DATA.QUERY_INFORMATION.BytesWritten = sizeof(INT); ImDbgOut(DBG_INFO, DBG_INIT, ("Spoofing TOTAL_SIZE for %.08X: %d (%d, %d, %d)\n", Adapter, Size, Adapter->TotalSize, ConfigData.LanMTU, OrgSize)); } else { ImDbgOut(DBG_INFO, DBG_INIT, ("NOT Spoofing TOTAL_SIZE for %.08X: %d (%d, %d, %d)\n", Adapter, Size, Adapter->TotalSize, ConfigData.LanMTU, OrgSize)); } } } } |
|