Lines Matching refs:ia

90 static void	ipx_ifscrub(struct ifnet *ifp, struct ipx_ifaddr *ia);
91 static int ipx_ifinit(struct ifnet *ifp, struct ipx_ifaddr *ia,
103 struct ipx_ifaddr *ia;
115 TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
116 if (ia->ia_ifp == ifp)
119 if (ia != NULL)
120 ifa_ref(&ia->ia_ifa);
126 if (ia == NULL) {
130 *(struct sockaddr_ipx *)&ifr->ifr_addr = ia->ia_addr;
134 if (ia == NULL) {
142 *(struct sockaddr_ipx *)&ifr->ifr_dstaddr = ia->ia_broadaddr;
146 if (ia == NULL) {
154 *(struct sockaddr_ipx *)&ifr->ifr_dstaddr = ia->ia_dstaddr;
170 for (oia = ia; ia; ia = TAILQ_NEXT(ia, ia_link)) {
171 if (ia->ia_ifp == ifp &&
172 ipx_neteq(ia->ia_addr.sipx_addr,
176 if (oia != NULL && oia != ia)
178 if (ia != NULL && oia != ia)
179 ifa_ref(&ia->ia_ifa);
182 if (cmd == SIOCDIFADDR && ia == NULL) {
192 if (ia == NULL) {
193 ia = malloc(sizeof(*ia), M_IFADDR, M_NOWAIT | M_ZERO);
194 if (ia == NULL) {
198 ifa = (struct ifaddr *)ia;
200 ia->ia_ifp = ifp;
201 ifa->ifa_addr = (struct sockaddr *)&ia->ia_addr;
203 ifa->ifa_dstaddr = (struct sockaddr *)&ia->ia_dstaddr;
205 ia->ia_broadaddr.sipx_family = AF_IPX;
206 ia->ia_broadaddr.sipx_len =
207 sizeof(ia->ia_addr);
208 ia->ia_broadaddr.sipx_addr.x_host =
211 ifa_ref(&ia->ia_ifa); /* ipx_ifaddrhead */
213 TAILQ_INSERT_TAIL(&ipx_ifaddrhead, ia, ia_link);
216 ifa_ref(&ia->ia_ifa); /* if_addrhead */
234 if (ia->ia_flags & IFA_ROUTE) {
235 rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
236 ia->ia_flags &= ~IFA_ROUTE;
240 (void *)ia);
244 *(struct sockaddr *)&ia->ia_dstaddr = ifr->ifr_dstaddr;
248 error = ipx_ifinit(ifp, ia,
253 ipx_ifscrub(ifp, ia);
254 ifa = (struct ifaddr *)ia;
262 TAILQ_REMOVE(&ipx_ifaddrhead, ia, ia_link);
264 ifa_free(&ia->ia_ifa); /* ipx_ifaddrhead */
270 if (ia->ia_addr.sipx_family == AF_IPX) {
272 ifra->ifra_addr = ia->ia_addr;
275 ia->ia_addr.sipx_addr))
281 ipx_ifscrub(ifp, ia);
282 ia->ia_dstaddr = ifra->ifra_dstaddr;
287 error = ipx_ifinit(ifp, ia, &ifra->ifra_addr, 0);
299 if (ia != NULL)
300 ifa_free(&ia->ia_ifa);
308 ipx_ifscrub(struct ifnet *ifp, struct ipx_ifaddr *ia)
311 if (ia->ia_flags & IFA_ROUTE) {
313 rtinit(&(ia->ia_ifa), (int)RTM_DELETE, RTF_HOST);
315 rtinit(&(ia->ia_ifa), (int)RTM_DELETE, 0);
316 ia->ia_flags &= ~IFA_ROUTE;
324 ipx_ifinit(struct ifnet *ifp, struct ipx_ifaddr *ia,
333 oldaddr = ia->ia_addr;
334 ia->ia_addr = *sipx;
346 (error = (*ifp->if_ioctl)(ifp, SIOCSIFADDR, (void *)ia))) {
347 ia->ia_addr = oldaddr;
352 ia->ia_ifa.ifa_metric = ifp->if_metric;
358 ia->ia_ifa.ifa_addr = (struct sockaddr *)&oldaddr;
359 ipx_ifscrub(ifp, ia);
360 ia->ia_ifa.ifa_addr = (struct sockaddr *)&ia->ia_addr;
363 rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_HOST|RTF_UP);
365 ia->ia_broadaddr.sipx_addr.x_net = ia->ia_addr.sipx_addr.x_net;
366 rtinit(&(ia->ia_ifa), (int)RTM_ADD, RTF_UP);
368 ia->ia_flags |= IFA_ROUTE;
378 struct ipx_ifaddr *ia;
386 TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
387 if ((ifp = ia->ia_ifp) != NULL) {
389 compare = &satoipx_addr(ia->ia_dstaddr);
391 return (ia);
393 ia->ia_addr.sipx_addr.x_net))
394 ia_maybe = ia;
397 ia->ia_addr.sipx_addr.x_net))
398 return (ia);