[IPHLPAPI][NETCFGX]
[reactos.git] / reactos / sdk / lib / drivers / ip / transport / tcp / if.c
1
2 #include "precomp.h"
3
4 #include "lwip/pbuf.h"
5 #include "lwip/netifapi.h"
6 #include "lwip/ip.h"
7 #include "lwip/api.h"
8 #include "lwip/tcpip.h"
9
10 err_t
11 TCPSendDataCallback(struct netif *netif, struct pbuf *p, struct ip_addr *dest)
12 {
13 NDIS_STATUS NdisStatus;
14 PNEIGHBOR_CACHE_ENTRY NCE;
15 IP_PACKET Packet;
16 IP_ADDRESS RemoteAddress, LocalAddress;
17 PIPv4_HEADER Header;
18
19 /* The caller frees the pbuf struct */
20
21 if (((*(u8_t*)p->payload) & 0xF0) == 0x40)
22 {
23 Header = p->payload;
24
25 LocalAddress.Type = IP_ADDRESS_V4;
26 LocalAddress.Address.IPv4Address = Header->SrcAddr;
27
28 RemoteAddress.Type = IP_ADDRESS_V4;
29 RemoteAddress.Address.IPv4Address = Header->DstAddr;
30 }
31 else
32 {
33 return ERR_IF;
34 }
35
36 IPInitializePacket(&Packet, LocalAddress.Type);
37
38 if (!(NCE = RouteGetRouteToDestination(&RemoteAddress)))
39 {
40 return ERR_RTE;
41 }
42
43 NdisStatus = AllocatePacketWithBuffer(&Packet.NdisPacket, NULL, p->tot_len);
44 if (NdisStatus != NDIS_STATUS_SUCCESS)
45 {
46 return ERR_MEM;
47 }
48
49 GetDataPtr(Packet.NdisPacket, 0, (PCHAR*)&Packet.Header, &Packet.TotalSize);
50 Packet.MappedHeader = TRUE;
51
52 ASSERT(p->tot_len == p->len);
53 ASSERT(Packet.TotalSize == p->len);
54
55 RtlCopyMemory(Packet.Header, p->payload, p->len);
56
57 Packet.HeaderSize = sizeof(IPv4_HEADER);
58 Packet.TotalSize = p->tot_len;
59 Packet.SrcAddr = LocalAddress;
60 Packet.DstAddr = RemoteAddress;
61
62 NdisStatus = IPSendDatagram(&Packet, NCE);
63 if (!NT_SUCCESS(NdisStatus))
64 return ERR_RTE;
65
66 return 0;
67 }
68
69 VOID
70 TCPUpdateInterfaceLinkStatus(PIP_INTERFACE IF)
71 {
72 #if 0
73 ULONG OperationalStatus;
74
75 GetInterfaceConnectionStatus(IF, &OperationalStatus);
76
77 if (OperationalStatus == MIB_IF_OPER_STATUS_OPERATIONAL)
78 netif_set_link_up(IF->TCPContext);
79 else
80 netif_set_link_down(IF->TCPContext);
81 #endif
82 }
83
84 err_t
85 TCPInterfaceInit(struct netif *netif)
86 {
87 PIP_INTERFACE IF = netif->state;
88
89 netif->hwaddr_len = IF->AddressLength;
90 RtlCopyMemory(netif->hwaddr, IF->Address, netif->hwaddr_len);
91
92 netif->output = TCPSendDataCallback;
93 netif->mtu = IF->MTU;
94
95 netif->name[0] = 'e';
96 netif->name[1] = 'n';
97
98 netif->flags |= NETIF_FLAG_BROADCAST;
99
100 TCPUpdateInterfaceLinkStatus(IF);
101
102 TCPUpdateInterfaceIPInformation(IF);
103
104 return 0;
105 }
106
107 VOID
108 TCPRegisterInterface(PIP_INTERFACE IF)
109 {
110 struct ip_addr ipaddr;
111 struct ip_addr netmask;
112 struct ip_addr gw;
113
114 gw.addr = 0;
115 ipaddr.addr = 0;
116 netmask.addr = 0;
117
118 IF->TCPContext = netif_add(IF->TCPContext,
119 &ipaddr,
120 &netmask,
121 &gw,
122 IF,
123 TCPInterfaceInit,
124 tcpip_input);
125 }
126
127 VOID
128 TCPUnregisterInterface(PIP_INTERFACE IF)
129 {
130 netif_remove(IF->TCPContext);
131 }
132
133 VOID
134 TCPUpdateInterfaceIPInformation(PIP_INTERFACE IF)
135 {
136 struct ip_addr ipaddr;
137 struct ip_addr netmask;
138 struct ip_addr gw;
139
140 gw.addr = 0;
141
142 GetInterfaceIPv4Address(IF,
143 ADE_UNICAST,
144 (PULONG)&ipaddr.addr);
145
146 GetInterfaceIPv4Address(IF,
147 ADE_ADDRMASK,
148 (PULONG)&netmask.addr);
149
150 netif_set_addr(IF->TCPContext, &ipaddr, &netmask, &gw);
151
152 if (ipaddr.addr != 0)
153 {
154 netif_set_up(IF->TCPContext);
155 netif_set_default(IF->TCPContext);
156 }
157 else
158 {
159 netif_set_down(IF->TCPContext);
160 }
161 }