5 #include "lwip/netifapi.h"
8 #include "lwip/tcpip.h"
11 TCPSendDataCallback(struct netif
*netif
, struct pbuf
*p
, struct ip_addr
*dest
)
13 NDIS_STATUS NdisStatus
;
14 PNEIGHBOR_CACHE_ENTRY NCE
;
16 IP_ADDRESS RemoteAddress
, LocalAddress
;
21 /* The caller frees the pbuf struct */
23 if (((*(u8_t
*)p
->payload
) & 0xF0) == 0x40)
27 LocalAddress
.Type
= IP_ADDRESS_V4
;
28 LocalAddress
.Address
.IPv4Address
= Header
->SrcAddr
;
30 RemoteAddress
.Type
= IP_ADDRESS_V4
;
31 RemoteAddress
.Address
.IPv4Address
= Header
->DstAddr
;
38 IPInitializePacket(&Packet
, LocalAddress
.Type
);
40 if (!(NCE
= RouteGetRouteToDestination(&RemoteAddress
)))
45 NdisStatus
= AllocatePacketWithBuffer(&Packet
.NdisPacket
, NULL
, p
->tot_len
);
46 if (NdisStatus
!= NDIS_STATUS_SUCCESS
)
51 GetDataPtr(Packet
.NdisPacket
, 0, (PCHAR
*)&Packet
.Header
, &Packet
.TotalSize
);
52 Packet
.MappedHeader
= TRUE
;
54 ASSERT(Packet
.TotalSize
== p
->tot_len
);
56 TotalLength
= p
->tot_len
;
58 while (Length
< TotalLength
)
60 ASSERT(p
->len
<= TotalLength
- Length
);
61 ASSERT(p
->tot_len
== TotalLength
- Length
);
62 RtlCopyMemory((PCHAR
)Packet
.Header
+ Length
, p
->payload
, p
->len
);
66 ASSERT(Length
== TotalLength
);
68 Packet
.HeaderSize
= sizeof(IPv4_HEADER
);
69 Packet
.TotalSize
= TotalLength
;
70 Packet
.SrcAddr
= LocalAddress
;
71 Packet
.DstAddr
= RemoteAddress
;
73 NdisStatus
= IPSendDatagram(&Packet
, NCE
);
74 if (!NT_SUCCESS(NdisStatus
))
81 TCPUpdateInterfaceLinkStatus(PIP_INTERFACE IF
)
84 ULONG OperationalStatus
;
86 GetInterfaceConnectionStatus(IF
, &OperationalStatus
);
88 if (OperationalStatus
== MIB_IF_OPER_STATUS_OPERATIONAL
)
89 netif_set_link_up(IF
->TCPContext
);
91 netif_set_link_down(IF
->TCPContext
);
96 TCPInterfaceInit(struct netif
*netif
)
98 PIP_INTERFACE IF
= netif
->state
;
100 netif
->hwaddr_len
= IF
->AddressLength
;
101 RtlCopyMemory(netif
->hwaddr
, IF
->Address
, netif
->hwaddr_len
);
103 netif
->output
= TCPSendDataCallback
;
104 netif
->mtu
= IF
->MTU
;
106 netif
->name
[0] = 'e';
107 netif
->name
[1] = 'n';
109 netif
->flags
|= NETIF_FLAG_BROADCAST
;
111 TCPUpdateInterfaceLinkStatus(IF
);
113 TCPUpdateInterfaceIPInformation(IF
);
119 TCPRegisterInterface(PIP_INTERFACE IF
)
121 struct ip_addr ipaddr
;
122 struct ip_addr netmask
;
129 IF
->TCPContext
= netif_add(IF
->TCPContext
,
139 TCPUnregisterInterface(PIP_INTERFACE IF
)
141 netif_remove(IF
->TCPContext
);
145 TCPUpdateInterfaceIPInformation(PIP_INTERFACE IF
)
147 struct ip_addr ipaddr
;
148 struct ip_addr netmask
;
153 GetInterfaceIPv4Address(IF
,
155 (PULONG
)&ipaddr
.addr
);
157 GetInterfaceIPv4Address(IF
,
159 (PULONG
)&netmask
.addr
);
161 netif_set_addr(IF
->TCPContext
, &ipaddr
, &netmask
, &gw
);
163 if (ipaddr
.addr
!= 0)
165 netif_set_up(IF
->TCPContext
);
166 netif_set_default(IF
->TCPContext
);
170 netif_set_down(IF
->TCPContext
);