2 * Copyright (c) 1997-1998 University of Utah and the Flux Group.
5 * This file is part of the Flux OSKit. The OSKit is free software, also known
6 * as "open source;" you can redistribute it and/or modify it under the terms
7 * of the GNU General Public License (GPL), version 2, as published by the Free
8 * Software Foundation (FSF). To explore alternate licensing terms, contact
9 * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271.
11 * The OSKit is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GPL for more details. You should have
14 * received a copy of the GPL along with the OSKit; see the file COPYING. If
15 * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA.
21 struct ifaddr
**ifnet_addrs
;
23 int ifqmaxlen
= OSK_IFQ_MAXLEN
;
27 * Network interface utility routines.
29 * Routines with ifa_ifwith* names take sockaddr *'s as
33 PVOID
TCPPrepareInterface( PIP_INTERFACE IF
) {
35 POSK_IFADDR ifaddr
= exAllocatePool
36 ( NonPagedPool
, sizeof(*ifaddr
) + 2 * sizeof( struct sockaddr_in
) );
37 struct sockaddr_in
*addr_in
= (struct sockaddr_in
*)&ifaddr
[1];
38 struct sockaddr_in
*dstaddr_in
= (struct sockaddr_in
*)&addr_in
[1];
39 if( !ifaddr
) return NULL
;
41 TI_DbgPrint(DEBUG_TCPIF
,("Called\n"));
43 ifaddr
->ifa_dstaddr
= (struct sockaddr
*)dstaddr_in
;
44 /* XXX - Point-to-point interfaces not supported yet */
45 memset( &ifaddr
->ifa_dstaddr
, 0, sizeof( struct sockaddr
) );
47 ifaddr
->ifa_addr
= (struct sockaddr
*)addr_in
;
48 Status
= GetInterfaceIPv4Address( IF
,
50 (PULONG
)&addr_in
->sin_addr
.s_addr
);
52 if( !NT_SUCCESS(Status
) )
53 addr_in
->sin_addr
.s_addr
= 0;
55 TI_DbgPrint(DEBUG_TCPIF
,("Prepare interface %x : addr %x\n",
56 IF
, addr_in
->sin_addr
.s_addr
));
58 ifaddr
->ifa_flags
= 0; /* XXX what goes here? */
59 ifaddr
->ifa_refcnt
= 0; /* Anachronistic */
60 ifaddr
->ifa_metric
= 1; /* We can get it like in ninfo.c, if we want */
61 ifaddr
->ifa_mtu
= IF
->MTU
;
63 TI_DbgPrint(DEBUG_TCPIF
,("Leaving\n"));
68 VOID
TCPDisposeInterfaceData( PVOID Ptr
) {
72 POSK_IFADDR
TCPFindInterface( void *ClientData
,
75 OSK_SOCKADDR
*ReqAddr
,
76 OSK_IFADDR
*Interface
) {
77 PNEIGHBOR_CACHE_ENTRY NCE
;
78 IP_ADDRESS Destination
;
79 struct sockaddr_in
*addr_in
= (struct sockaddr_in
*)ReqAddr
;
81 TI_DbgPrint(DEBUG_TCPIF
,("called for type %d\n", FindType
));
84 TI_DbgPrint(DEBUG_TCPIF
,("no addr or no ifaddr (%x)\n", ReqAddr
));
88 Destination
.Type
= IP_ADDRESS_V4
;
89 Destination
.Address
.IPv4Address
= addr_in
->sin_addr
.s_addr
;
91 TI_DbgPrint(DEBUG_TCPIF
,("Address is %x\n", addr_in
->sin_addr
.s_addr
));
93 NCE
= RouteGetRouteToDestination(&Destination
);
95 if( !NCE
|| !NCE
->Interface
) {
96 TI_DbgPrint(DEBUG_TCPIF
,("no neighbor cache or no interface (%x %x)\n",
97 NCE
, NCE
? NCE
->Interface
: 0));
101 TI_DbgPrint(DEBUG_TCPIF
,("NCE: %x\n", NCE
));
102 TI_DbgPrint(DEBUG_TCPIF
,("NCE->Interface: %x\n", NCE
->Interface
));
103 TI_DbgPrint(DEBUG_TCPIF
,("NCE->Interface->TCPContext: %x\n",
104 NCE
->Interface
->TCPContext
));
106 addr_in
= (struct sockaddr_in
*)
107 ((POSK_IFADDR
)NCE
->Interface
->TCPContext
)->ifa_addr
;
108 TI_DbgPrint(DEBUG_TCPIF
,("returning addr %x\n", addr_in
->sin_addr
.s_addr
));
110 return NCE
->Interface
->TCPContext
;