Deleted Added
full compact
mibII.c (163800) mibII.c (186119)
1/*
2 * Copyright (c) 2001-2003
3 * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4 * All rights reserved.
5 *
6 * Author: Harti Brandt <harti@freebsd.org>
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 34 unchanged lines hidden (view full) ---

43
44/* routing socket */
45static int route;
46static void *route_fd;
47
48/* if-index allocator */
49static uint32_t next_if_index = 1;
50
1/*
2 * Copyright (c) 2001-2003
3 * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4 * All rights reserved.
5 *
6 * Author: Harti Brandt <harti@freebsd.org>
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 34 unchanged lines hidden (view full) ---

43
44/* routing socket */
45static int route;
46static void *route_fd;
47
48/* if-index allocator */
49static uint32_t next_if_index = 1;
50
51/* re-fetch arp table */
52static int update_arp;
51/* currently fetching the arp table */
53static int in_update_arp;
54
55/* OR registrations */
56static u_int ifmib_reg;
57static u_int ipmib_reg;
58static u_int tcpmib_reg;
59static u_int udpmib_reg;
60static u_int ipForward_reg;

--- 845 unchanged lines hidden (view full) ---

906
907 TAILQ_FOREACH(ifa, &mibifa_list, link)
908 if (ifa->inaddr.s_addr == addr.s_addr)
909 return (ifa);
910 return (NULL);
911}
912
913/*
52static int in_update_arp;
53
54/* OR registrations */
55static u_int ifmib_reg;
56static u_int ipmib_reg;
57static u_int tcpmib_reg;
58static u_int udpmib_reg;
59static u_int ipForward_reg;

--- 845 unchanged lines hidden (view full) ---

905
906 TAILQ_FOREACH(ifa, &mibifa_list, link)
907 if (ifa->inaddr.s_addr == addr.s_addr)
908 return (ifa);
909 return (NULL);
910}
911
912/*
914 * Process a new ARP entry
915 */
916static void
917process_arp(const struct rt_msghdr *rtm, const struct sockaddr_dl *sdl,
918 const struct sockaddr_in *sa)
919{
920 struct mibif *ifp;
921 struct mibarp *at;
922
923 /* IP arp table entry */
924 if (sdl->sdl_alen == 0) {
925 update_arp = 1;
926 return;
927 }
928 if ((ifp = mib_find_if_sys(sdl->sdl_index)) == NULL)
929 return;
930 /* have a valid entry */
931 if ((at = mib_find_arp(ifp, sa->sin_addr)) == NULL &&
932 (at = mib_arp_create(ifp, sa->sin_addr,
933 sdl->sdl_data + sdl->sdl_nlen, sdl->sdl_alen)) == NULL)
934 return;
935
936 if (rtm->rtm_rmx.rmx_expire == 0)
937 at->flags |= MIBARP_PERM;
938 else
939 at->flags &= ~MIBARP_PERM;
940 at->flags |= MIBARP_FOUND;
941}
942
943/*
944 * Handle a routing socket message.
945 */
946static void
947handle_rtmsg(struct rt_msghdr *rtm)
948{
949 struct sockaddr *addrs[RTAX_MAX];
950 struct if_msghdr *ifm;
951 struct ifa_msghdr *ifam;

--- 123 unchanged lines hidden (view full) ---

1075
1076 case IFAN_DEPARTURE:
1077 if (ifp != NULL)
1078 mibif_free(ifp);
1079 break;
1080 }
1081 break;
1082#endif
913 * Handle a routing socket message.
914 */
915static void
916handle_rtmsg(struct rt_msghdr *rtm)
917{
918 struct sockaddr *addrs[RTAX_MAX];
919 struct if_msghdr *ifm;
920 struct ifa_msghdr *ifam;

--- 123 unchanged lines hidden (view full) ---

1044
1045 case IFAN_DEPARTURE:
1046 if (ifp != NULL)
1047 mibif_free(ifp);
1048 break;
1049 }
1050 break;
1051#endif
1083
1084 case RTM_GET:
1052 case RTM_GET:
1085 mib_extract_addrs(rtm->rtm_addrs, (u_char *)(rtm + 1), addrs);
1086 if (rtm->rtm_flags & RTF_LLINFO) {
1087 if (addrs[RTAX_DST] == NULL ||
1088 addrs[RTAX_GATEWAY] == NULL ||
1089 addrs[RTAX_DST]->sa_family != AF_INET ||
1090 addrs[RTAX_GATEWAY]->sa_family != AF_LINK)
1091 break;
1092 process_arp(rtm,
1093 (struct sockaddr_dl *)(void *)addrs[RTAX_GATEWAY],
1094 (struct sockaddr_in *)(void *)addrs[RTAX_DST]);
1095 } else {
1096 if (rtm->rtm_errno == 0 && (rtm->rtm_flags & RTF_UP))
1097 mib_sroute_process(rtm, addrs[RTAX_GATEWAY],
1098 addrs[RTAX_DST], addrs[RTAX_NETMASK]);
1099 }
1100 break;
1101
1102 case RTM_ADD:
1053 case RTM_ADD:
1103 mib_extract_addrs(rtm->rtm_addrs, (u_char *)(rtm + 1), addrs);
1104 if (rtm->rtm_flags & RTF_LLINFO) {
1105 if (addrs[RTAX_DST] == NULL ||
1106 addrs[RTAX_GATEWAY] == NULL ||
1107 addrs[RTAX_DST]->sa_family != AF_INET ||
1108 addrs[RTAX_GATEWAY]->sa_family != AF_LINK)
1109 break;
1110 process_arp(rtm,
1111 (struct sockaddr_dl *)(void *)addrs[RTAX_GATEWAY],
1112 (struct sockaddr_in *)(void *)addrs[RTAX_DST]);
1113 } else {
1114 if (rtm->rtm_errno == 0 && (rtm->rtm_flags & RTF_UP))
1115 mib_sroute_process(rtm, addrs[RTAX_GATEWAY],
1116 addrs[RTAX_DST], addrs[RTAX_NETMASK]);
1117 }
1118 break;
1119
1120 case RTM_DELETE:
1121 mib_extract_addrs(rtm->rtm_addrs, (u_char *)(rtm + 1), addrs);
1054 case RTM_DELETE:
1055 mib_extract_addrs(rtm->rtm_addrs, (u_char *)(rtm + 1), addrs);
1122 if (rtm->rtm_errno == 0 && !(rtm->rtm_flags & RTF_LLINFO))
1056
1057 if (rtm->rtm_errno == 0 && (rtm->rtm_flags & RTF_UP))
1123 mib_sroute_process(rtm, addrs[RTAX_GATEWAY],
1124 addrs[RTAX_DST], addrs[RTAX_NETMASK]);
1125 break;
1126 }
1127}
1128
1129/*
1130 * send a routing message

--- 153 unchanged lines hidden (view full) ---

1284 MIBRCVADDR_HW)))
1285 mib_rcvaddr_delete(rcv);
1286 rcv = rcv1;
1287 }
1288}
1289
1290/*
1291 * Update arp table
1058 mib_sroute_process(rtm, addrs[RTAX_GATEWAY],
1059 addrs[RTAX_DST], addrs[RTAX_NETMASK]);
1060 break;
1061 }
1062}
1063
1064/*
1065 * send a routing message

--- 153 unchanged lines hidden (view full) ---

1219 MIBRCVADDR_HW)))
1220 mib_rcvaddr_delete(rcv);
1221 rcv = rcv1;
1222 }
1223}
1224
1225/*
1226 * Update arp table
1292 */
1227 *
1228*/
1293void
1294mib_arp_update(void)
1295{
1296 struct mibarp *at, *at1;
1297 size_t needed;
1298 u_char *buf, *next;
1299 struct rt_msghdr *rtm;
1300
1301 if (in_update_arp)
1302 return; /* Aaargh */
1303 in_update_arp = 1;
1304
1305 TAILQ_FOREACH(at, &mibarp_list, link)
1306 at->flags &= ~MIBARP_FOUND;
1307
1229void
1230mib_arp_update(void)
1231{
1232 struct mibarp *at, *at1;
1233 size_t needed;
1234 u_char *buf, *next;
1235 struct rt_msghdr *rtm;
1236
1237 if (in_update_arp)
1238 return; /* Aaargh */
1239 in_update_arp = 1;
1240
1241 TAILQ_FOREACH(at, &mibarp_list, link)
1242 at->flags &= ~MIBARP_FOUND;
1243
1308 if ((buf = mib_fetch_rtab(AF_INET, NET_RT_FLAGS, RTF_LLINFO, &needed)) == NULL) {
1244 if ((buf = mib_fetch_rtab(AF_INET, NET_RT_FLAGS, 0, &needed)) == NULL) {
1309 in_update_arp = 0;
1310 return;
1311 }
1245 in_update_arp = 0;
1246 return;
1247 }
1312
1248
1313 next = buf;
1314 while (next < buf + needed) {
1315 rtm = (struct rt_msghdr *)(void *)next;
1316 next += rtm->rtm_msglen;
1317 handle_rtmsg(rtm);
1318 }
1319 free(buf);
1320
1321 at = TAILQ_FIRST(&mibarp_list);
1322 while (at != NULL) {
1323 at1 = TAILQ_NEXT(at, link);
1324 if (!(at->flags & MIBARP_FOUND))
1325 mib_arp_delete(at);
1326 at = at1;
1327 }
1328 mibarpticks = get_ticks();
1249 next = buf;
1250 while (next < buf + needed) {
1251 rtm = (struct rt_msghdr *)(void *)next;
1252 next += rtm->rtm_msglen;
1253 handle_rtmsg(rtm);
1254 }
1255 free(buf);
1256
1257 at = TAILQ_FIRST(&mibarp_list);
1258 while (at != NULL) {
1259 at1 = TAILQ_NEXT(at, link);
1260 if (!(at->flags & MIBARP_FOUND))
1261 mib_arp_delete(at);
1262 at = at1;
1263 }
1264 mibarpticks = get_ticks();
1329 update_arp = 0;
1330 in_update_arp = 0;
1331}
1332
1333
1334/*
1335 * Intput on the routing socket.
1336 */
1337static void

--- 291 unchanged lines hidden (view full) ---

1629 /* assume, that all cloning interfaces are dynamic */
1630 get_cloners();
1631
1632 mib_refresh_iflist();
1633 update_ifa_info();
1634 mib_arp_update();
1635 mib_iflist_bad = 0;
1636 }
1265 in_update_arp = 0;
1266}
1267
1268
1269/*
1270 * Intput on the routing socket.
1271 */
1272static void

--- 291 unchanged lines hidden (view full) ---

1564 /* assume, that all cloning interfaces are dynamic */
1565 get_cloners();
1566
1567 mib_refresh_iflist();
1568 update_ifa_info();
1569 mib_arp_update();
1570 mib_iflist_bad = 0;
1571 }
1637 if (update_arp)
1638 mib_arp_update();
1572
1573 mib_arp_update();
1639}
1640
1641
1642/*
1643 * Start the module
1644 */
1645static void
1646mibII_start(void)

--- 144 unchanged lines hidden ---
1574}
1575
1576
1577/*
1578 * Start the module
1579 */
1580static void
1581mibII_start(void)

--- 144 unchanged lines hidden ---