📄 support.c
字号:
static voidcyg_netint(cyg_addrword_t param){ cyg_flag_value_t curisr; int lvl, spl; while (true) { curisr = cyg_flag_wait(&netint_flags, NETISR_ANY, CYG_FLAG_WAITMODE_OR|CYG_FLAG_WAITMODE_CLR); spl = splsoftnet(); // Prevent any overlapping "stack" processing for (lvl = NETISR_MIN; lvl <= NETISR_MAX; lvl++) { if (curisr & (1<<lvl)) { CYG_ASSERT(_netisr_handlers[lvl] != 0, "unregistered netisr handler"); (*_netisr_handlers[lvl])(); } } splx(spl); }}// This just sets one of the pseudo-ISR bits used above.voidsetsoftnet(void){ // This is called if we are out of MBUFs - it doesn't do anything, and // that situation is handled OK, so don't bother with the diagnostic: // diag_printf("setsoftnet\n"); // No need to do this because it is ignored anyway: // schednetisr(NETISR_SOFTNET);}/* Update the kernel globel ktime. */static void cyg_ktime_func(cyg_handle_t alarm,cyg_addrword_t data){ cyg_tick_count_t now = cyg_current_time(); ktime.tv_usec = (now % hz) * tick; ktime.tv_sec = 1 + now / hz;}static voidcyg_ktime_init(void){ cyg_handle_t ktime_alarm_handle; static cyg_alarm ktime_alarm; cyg_handle_t counter; // Do not start at 0 - net stack thinks 0 an invalid time; // Have a valid time available from right now: ktime.tv_usec = 0; ktime.tv_sec = 1; cyg_clock_to_counter(cyg_real_time_clock(),&counter); cyg_alarm_create(counter, cyg_ktime_func, 0, &ktime_alarm_handle, &ktime_alarm); /* We want one alarm every 10ms. */ cyg_alarm_initialize(ktime_alarm_handle,cyg_current_time()+1,1); cyg_alarm_enable(ktime_alarm_handle);}intcyg_ticks(void){ cyg_tick_count_t now = cyg_current_time(); return (int)now;}//// Network initialization// This function is called during system initialization to setup the whole// networking environment.// Linker magic to execute this function as 'init'extern void cyg_do_net_init(void);extern void ifinit(void);extern void loopattach(int);extern void bridgeattach(int);// Internal init functions:extern void cyg_alarm_timeout_init(void);extern void cyg_tsleep_init(void);static voidcyg_net_init_devs(void *ignored){ cyg_netdevtab_entry_t *t; // Initialize all network devices for (t = &__NETDEVTAB__[0]; t != &__NETDEVTAB_END__; t++) { log(LOG_INIT, "Init device '%s'\n", t->name); if (t->init(t)) { t->status = CYG_NETDEVTAB_STATUS_AVAIL; } else { // What to do if device init fails? t->status = 0; // Device not [currently] available } }#if 0 // Bridge code not available yet#if NBRIDGE > 0 bridgeattach(0);#endif#endif}SYSINIT(devs, SI_SUB_DEVICES, SI_ORDER_FIRST, cyg_net_init_devs, NULL)voidcyg_net_init(void){ static int _init = false; struct init_tab_entry *init_entry;#ifdef CYGPKG_NET_FORCE_SERIAL_CONSOLE int orig_console = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);#endif if (_init) return;#ifdef CYGPKG_NET_FORCE_SERIAL_CONSOLE // Force default serial console during system initialization // This avoids problems with debug messages occurring while the // networking subsystem is being setup. CYGACC_CALL_IF_SET_CONSOLE_COMM(0);#endif cyg_do_net_init(); // Just forces linking in the initializer/constructor // Initialize interrupt "flags" cyg_flag_init(&netint_flags); // Initialize timeouts and net service thread (pseudo-DSRs) cyg_alarm_timeout_init(); // Initialize tsleep/wakeup support cyg_tsleep_init(); // Initialize network memory system cyg_kmem_init(); // Initialize network time cyg_ktime_init(); // Create network background thread cyg_thread_create(CYGPKG_NET_THREAD_PRIORITY, // Priority cyg_netint, // entry 0, // entry parameter "Network support", // Name &netint_stack[0], // Stack STACK_SIZE, // Size &netint_thread_handle, // Handle &netint_thread_data // Thread data structure ); cyg_thread_resume(netint_thread_handle); // Start it // Run through dynamic initializers for (init_entry = __NET_INIT_TAB__; init_entry != &__NET_INIT_TAB_END__; init_entry++) { log(LOG_INIT, "[%s] Init: %s(%p)\n", __FUNCTION__, init_entry->name, init_entry->data); (*init_entry->fun)(init_entry->data); } log(LOG_INIT, "[%s] Done\n", __FUNCTION__); // Done _init = true;#ifdef CYGPKG_NET_FORCE_SERIAL_CONSOLE // Revert to the original console, which might be a network connection CYGACC_CALL_IF_SET_CONSOLE_COMM(orig_console);#endif}#include <net/if.h>#include <net/netdb.h>#include <net/route.h>externC void if_indextoname(int indx, char *buf, int len);typedef void pr_fun(char *fmt, ...);static void_mask(struct sockaddr *sa, char *buf, int _len){ unsigned char *cp = ((char *)sa) + 4; int len = sa->sa_len - 4; int tot = 0; while (len-- > 0) { if (tot) *buf++ = '.'; buf += diag_sprintf(buf, "%u", *cp++); tot++; } while (tot < 4) { if (tot) *buf++ = '.'; buf += diag_sprintf(buf, "%d", 0); tot++; }}#ifdef CYGPKG_NET_INET6static void_mask6(struct sockaddr *sa, char *buf, int _len){ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa; int addrword = 0; int bits = 0; int index; while (addrword < 4) { if (sin6->sin6_addr.s6_addr32[addrword] == 0) { break; } HAL_LSBIT_INDEX(index, sin6->sin6_addr.s6_addr32[addrword++]); bits += (32-index); if (index != 0) { break; } } diag_sprintf(buf, "%d", bits);}#endifstatic void_show_ifp(struct ifnet *ifp, pr_fun *pr){ struct ifaddr *ifa; char name[64], addr[64], netmask[64], broadcast[64]; if_indextoname(ifp->if_index, name, 64); TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) { if (ifa->ifa_addr->sa_family != AF_LINK) { (*pr)("%-8s", name); getnameinfo (ifa->ifa_addr, ifa->ifa_addr->sa_len, addr, sizeof(addr), 0, 0, NI_NUMERICHOST); if (ifa->ifa_addr->sa_family == AF_INET) { getnameinfo (ifa->ifa_dstaddr, ifa->ifa_dstaddr->sa_len, broadcast, sizeof(broadcast), 0, 0, NI_NUMERICHOST); _mask(ifa->ifa_netmask, netmask, 64); (*pr)("IP: %s, Broadcast: %s, Netmask: %s\n", addr, broadcast, netmask); }#ifdef CYGPKG_NET_INET6 if (ifa->ifa_addr->sa_family == AF_INET6) { struct in6_ifaddr * ifa6 = (struct in6_ifaddr *) ifa; _mask6(ifa->ifa_netmask, netmask, 64); (*pr)("IP: %s/%s ", addr,netmask); if (ifa6->ia6_flags & IN6_IFF_ANYCAST) (*pr) ("Anycast "); if (ifa6->ia6_flags & IN6_IFF_TENTATIVE) (*pr) ("Tentative "); if (ifa6->ia6_flags & IN6_IFF_DUPLICATED) (*pr) ("Duplicate "); if (ifa6->ia6_flags & IN6_IFF_DETACHED) (*pr) ("Detached "); if (ifa6->ia6_flags & IN6_IFF_DEPRECATED) (*pr) ("Deprecated "); if (ifa6->ia6_flags & IN6_IFF_NODAD) (*pr) ("NoDAD "); if (ifa6->ia6_flags & IN6_IFF_AUTOCONF) (*pr) ("AutoConf "); if (ifa6->ia6_flags & IN6_IFF_TEMPORARY) (*pr) ("Tempory "); if (ifa6->ia6_flags & IN6_IFF_HOME) (*pr) ("Home "); (*pr) ("\n"); }#endif (*pr)(" "); if ((ifp->if_flags & IFF_UP)) (*pr)("UP "); if ((ifp->if_flags & IFF_BROADCAST)) (*pr)("BROADCAST "); if ((ifp->if_flags & IFF_LOOPBACK)) (*pr)("LOOPBACK "); if ((ifp->if_flags & IFF_RUNNING)) (*pr)("RUNNING "); if ((ifp->if_flags & IFF_PROMISC)) (*pr)("PROMISC "); if ((ifp->if_flags & IFF_MULTICAST)) (*pr)("MULTICAST "); if ((ifp->if_flags & IFF_ALLMULTI)) (*pr)("ALLMULTI "); (*pr)("MTU: %d, Metric: %d\n", ifp->if_mtu, ifp->if_metric); (*pr)(" Rx - Packets: %d, Bytes: %d", ifa->if_data.ifi_ipackets, ifa->if_data.ifi_ibytes); (*pr)(", Tx - Packets: %d, Bytes: %d\n", ifa->if_data.ifi_opackets, ifa->if_data.ifi_obytes); } }}static int_dumpentry(struct radix_node *rn, void *vw){ struct rtentry *rt = (struct rtentry *)rn; struct sockaddr *dst, *gate, *netmask, *genmask; char addr[64], *cp; pr_fun *pr = (pr_fun *)vw; dst = rt_key(rt); gate = rt->rt_gateway; netmask = rt_mask(rt); genmask = rt->rt_genmask; if ((rt->rt_flags & (RTF_UP | RTF_WASCLONED)) == RTF_UP) { _inet_ntop(dst, addr, sizeof(addr)); (*pr)("%-15s ", addr); if (gate != NULL) { _inet_ntop(gate, addr, sizeof(addr)); (*pr)("%-15s ", addr); } else { (*pr)("%-15s ", " "); } if (netmask != NULL) { if (dst->sa_family == AF_INET) { _mask(netmask, addr, sizeof(addr)); (*pr)("%-15s ", addr); } #ifdef CYGPKG_NET_INET6 if (dst->sa_family == AF_INET6) { _mask6(netmask, addr, sizeof(addr)); (*pr)("/%-14s ", addr); }#endif } else { (*pr)("%-15s ", " "); } cp = addr; if ((rt->rt_flags & RTF_UP)) *cp++ = 'U'; if ((rt->rt_flags & RTF_GATEWAY)) *cp++ = 'G'; if ((rt->rt_flags & RTF_HOST)) *cp++ = 'H'; if ((rt->rt_flags & RTF_REJECT)) *cp++ = '!'; if ((rt->rt_flags & RTF_STATIC)) *cp++ = 'S'; if ((rt->rt_flags & RTF_DYNAMIC)) *cp++ = 'D'; if ((rt->rt_flags & RTF_MODIFIED)) *cp++ = 'M'; *cp = '\0'; (*pr)("%-8s ", addr); // Flags if_indextoname(rt->rt_ifp->if_index, addr, 64); (*pr)("%-8s ", addr); (*pr)("\n"); } return 0;}voidshow_network_tables(pr_fun *pr){ int i, error; struct radix_node_head *rnh; struct ifnet *ifp; cyg_scheduler_lock(); (*pr)("Routing tables\n"); (*pr)("Destination Gateway Mask Flags Interface\n"); for (i = 1; i <= AF_MAX; i++) { if ((rnh = rt_tables[i]) != NULL) { error = rnh->rnh_walktree(rnh, _dumpentry, pr); } } (*pr)("Interface statistics\n"); for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_link.tqe_next) { _show_ifp(ifp, pr); } cyg_scheduler_unlock();}#endif // CYGPKG_NET_DRIVER_FRAMEWORK// EOF support.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -