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 --- |