Blame


1 1237836a 2005-12-31 devnull #include <u.h>
2 1237836a 2005-12-31 devnull /* #include <everything_but_the_kitchen_sink.h> */
3 1237836a 2005-12-31 devnull #include <sys/socket.h>
4 1237836a 2005-12-31 devnull #include <netinet/in.h>
5 1237836a 2005-12-31 devnull #include <net/if.h>
6 1237836a 2005-12-31 devnull #include <sys/ioctl.h>
7 1237836a 2005-12-31 devnull #include <sys/sysctl.h>
8 1237836a 2005-12-31 devnull #include <net/ethernet.h>
9 1237836a 2005-12-31 devnull #include <net/if.h>
10 1237836a 2005-12-31 devnull #include <net/if_var.h>
11 1237836a 2005-12-31 devnull #include <net/if_dl.h>
12 1237836a 2005-12-31 devnull #include <net/if_types.h>
13 1237836a 2005-12-31 devnull #include <net/route.h>
14 1237836a 2005-12-31 devnull #include <netinet/in.h>
15 1237836a 2005-12-31 devnull #include <netinet/in_var.h>
16 1237836a 2005-12-31 devnull #include <arpa/inet.h>
17 1237836a 2005-12-31 devnull #include <netdb.h>
18 1237836a 2005-12-31 devnull #include <libc.h>
19 1237836a 2005-12-31 devnull #include <ip.h>
20 1237836a 2005-12-31 devnull
21 1237836a 2005-12-31 devnull static void
22 1237836a 2005-12-31 devnull sockaddr2ip(uchar *ip, struct sockaddr *sa)
23 1237836a 2005-12-31 devnull {
24 1237836a 2005-12-31 devnull struct sockaddr_in *sin;
25 fa325e9b 2020-01-10 cross
26 1237836a 2005-12-31 devnull sin = (struct sockaddr_in*)sa;
27 1237836a 2005-12-31 devnull memmove(ip, v4prefix, IPaddrlen);
28 1237836a 2005-12-31 devnull memmove(ip+IPv4off, &sin->sin_addr, 4);
29 1237836a 2005-12-31 devnull }
30 1237836a 2005-12-31 devnull
31 1237836a 2005-12-31 devnull Ipifc*
32 1237836a 2005-12-31 devnull readipifc(char *net, Ipifc *ifc, int index)
33 1237836a 2005-12-31 devnull {
34 1237836a 2005-12-31 devnull char *p, *ep, *q, *bp;
35 1237836a 2005-12-31 devnull int i, mib[6];
36 1237836a 2005-12-31 devnull size_t n;
37 1237836a 2005-12-31 devnull Ipifc *list, **last;
38 1237836a 2005-12-31 devnull Iplifc *lifc, **lastlifc;
39 1237836a 2005-12-31 devnull struct if_msghdr *mh, *nmh;
40 1237836a 2005-12-31 devnull struct ifa_msghdr *ah;
41 1237836a 2005-12-31 devnull struct sockaddr *sa;
42 1237836a 2005-12-31 devnull struct sockaddr_dl *sdl;
43 1237836a 2005-12-31 devnull uchar ip[IPaddrlen];
44 1237836a 2005-12-31 devnull
45 1237836a 2005-12-31 devnull USED(net);
46 1237836a 2005-12-31 devnull
47 1237836a 2005-12-31 devnull free(ifc);
48 1237836a 2005-12-31 devnull ifc = nil;
49 1237836a 2005-12-31 devnull list = nil;
50 1237836a 2005-12-31 devnull last = &list;
51 1237836a 2005-12-31 devnull
52 1237836a 2005-12-31 devnull /*
53 1237836a 2005-12-31 devnull * Does not handle IPv6 yet.
54 1237836a 2005-12-31 devnull */
55 1237836a 2005-12-31 devnull
56 1237836a 2005-12-31 devnull mib[0] = CTL_NET;
57 1237836a 2005-12-31 devnull mib[1] = PF_ROUTE;
58 1237836a 2005-12-31 devnull mib[2] = 0;
59 1237836a 2005-12-31 devnull mib[3] = 0;
60 1237836a 2005-12-31 devnull mib[4] = NET_RT_IFLIST;
61 1237836a 2005-12-31 devnull mib[5] = 0;
62 fa325e9b 2020-01-10 cross
63 1237836a 2005-12-31 devnull n = 0;
64 1237836a 2005-12-31 devnull if(sysctl(mib, 6, nil, &n, nil, 0) < 0)
65 1237836a 2005-12-31 devnull return nil;
66 1237836a 2005-12-31 devnull bp = mallocz(n, 1);
67 1237836a 2005-12-31 devnull if(bp == nil)
68 1237836a 2005-12-31 devnull return nil;
69 1237836a 2005-12-31 devnull if(sysctl(mib, 6, bp, &n, nil, 0) < 0){
70 1237836a 2005-12-31 devnull free(bp);
71 1237836a 2005-12-31 devnull return nil;
72 1237836a 2005-12-31 devnull }
73 1237836a 2005-12-31 devnull
74 1237836a 2005-12-31 devnull p = bp;
75 1237836a 2005-12-31 devnull ep = p+n;
76 1237836a 2005-12-31 devnull while(p < ep){
77 1237836a 2005-12-31 devnull mh = (struct if_msghdr*)p;
78 1237836a 2005-12-31 devnull p += mh->ifm_msglen;
79 1237836a 2005-12-31 devnull if(mh->ifm_type != RTM_IFINFO)
80 1237836a 2005-12-31 devnull continue;
81 1237836a 2005-12-31 devnull ifc = mallocz(sizeof *ifc, 1);
82 1237836a 2005-12-31 devnull if(ifc == nil)
83 1237836a 2005-12-31 devnull break;
84 1237836a 2005-12-31 devnull *last = ifc;
85 1237836a 2005-12-31 devnull last = &ifc->next;
86 1237836a 2005-12-31 devnull sdl = (struct sockaddr_dl*)(mh+1);
87 1237836a 2005-12-31 devnull n = sdl->sdl_nlen;
88 1237836a 2005-12-31 devnull if(n >= sizeof ifc->dev)
89 1237836a 2005-12-31 devnull n = sizeof ifc->dev - 1;
90 1237836a 2005-12-31 devnull memmove(ifc->dev, sdl->sdl_data, n);
91 1237836a 2005-12-31 devnull ifc->dev[n] = 0;
92 1237836a 2005-12-31 devnull ifc->rp.linkmtu = mh->ifm_data.ifi_mtu;
93 1237836a 2005-12-31 devnull lastlifc = &ifc->lifc;
94 1237836a 2005-12-31 devnull
95 1237836a 2005-12-31 devnull if(sdl->sdl_type == IFT_ETHER && sdl->sdl_alen == 6)
96 1237836a 2005-12-31 devnull memmove(ifc->ether, LLADDR(sdl), 6);
97 1237836a 2005-12-31 devnull
98 1237836a 2005-12-31 devnull while(p < ep){
99 1237836a 2005-12-31 devnull ah = (struct ifa_msghdr*)p;
100 1237836a 2005-12-31 devnull nmh = (struct if_msghdr*)p;
101 1237836a 2005-12-31 devnull if(nmh->ifm_type != RTM_NEWADDR)
102 1237836a 2005-12-31 devnull break;
103 1237836a 2005-12-31 devnull p += nmh->ifm_msglen;
104 1237836a 2005-12-31 devnull lifc = nil;
105 1237836a 2005-12-31 devnull for(i=0, q=(char*)(ah+1); i<RTAX_MAX && q<p; i++){
106 1237836a 2005-12-31 devnull if(!(ah->ifam_addrs & (1<<i)))
107 1237836a 2005-12-31 devnull continue;
108 1237836a 2005-12-31 devnull sa = (struct sockaddr*)q;
109 1237836a 2005-12-31 devnull q += (sa->sa_len+sizeof(long)-1) & ~(sizeof(long)-1);
110 1237836a 2005-12-31 devnull if(sa->sa_family != AF_INET)
111 1237836a 2005-12-31 devnull continue;
112 1237836a 2005-12-31 devnull if(lifc == nil){
113 1237836a 2005-12-31 devnull lifc = mallocz(sizeof *lifc, 1);
114 1237836a 2005-12-31 devnull if(lifc == nil)
115 1237836a 2005-12-31 devnull continue;
116 1237836a 2005-12-31 devnull *lastlifc = lifc;
117 1237836a 2005-12-31 devnull lastlifc = &lifc->next;
118 fa325e9b 2020-01-10 cross }
119 1237836a 2005-12-31 devnull sockaddr2ip(ip, sa);
120 1237836a 2005-12-31 devnull switch(i){
121 1237836a 2005-12-31 devnull case RTAX_IFA:
122 1237836a 2005-12-31 devnull ipmove(lifc->ip, ip);
123 1237836a 2005-12-31 devnull break;
124 1237836a 2005-12-31 devnull case RTAX_NETMASK:
125 1237836a 2005-12-31 devnull memset(ip, 0xFF, IPv4off);
126 1237836a 2005-12-31 devnull ipmove(lifc->mask, ip);
127 1237836a 2005-12-31 devnull break;
128 1237836a 2005-12-31 devnull case RTAX_BRD:
129 1237836a 2005-12-31 devnull if(mh->ifm_flags & IFF_POINTOPOINT)
130 1237836a 2005-12-31 devnull /* ipmove(lifc->remote, ip) */ ;
131 1237836a 2005-12-31 devnull if(mh->ifm_flags & IFF_BROADCAST)
132 1237836a 2005-12-31 devnull /* ipmove(lifc->bcast, ip) */ ;
133 1237836a 2005-12-31 devnull break;
134 1237836a 2005-12-31 devnull case RTAX_GATEWAY:
135 1237836a 2005-12-31 devnull break;
136 1237836a 2005-12-31 devnull case RTAX_DST:
137 1237836a 2005-12-31 devnull break;
138 1237836a 2005-12-31 devnull }
139 1237836a 2005-12-31 devnull }
140 1237836a 2005-12-31 devnull if(lifc)
141 1237836a 2005-12-31 devnull maskip(lifc->ip, lifc->mask, lifc->net);
142 1237836a 2005-12-31 devnull }
143 1237836a 2005-12-31 devnull }
144 1237836a 2005-12-31 devnull free(bp);
145 1237836a 2005-12-31 devnull return list;
146 1237836a 2005-12-31 devnull }