diff --git a/src/tests/kits/net/new_stack/ethernet/ethernet.c b/src/tests/kits/net/new_stack/ethernet/ethernet.c index c5b70f8895..19c016ccea 100644 --- a/src/tests/kits/net/new_stack/ethernet/ethernet.c +++ b/src/tests/kits/net/new_stack/ethernet/ethernet.c @@ -27,6 +27,7 @@ enum { typedef struct ethernet_interface { ifnet_t ifnet; int fd; + int max_frame_size; } ethernet_interface; #define ETHER_ADDR_LEN 6 /* Ethernet address length */ @@ -44,6 +45,7 @@ typedef struct ether_addr { } ether_addr_t; status_t lookup_devices(char *root, void *cookie); +status_t register_device(const char *path, void *cookie); status_t std_ops(int32 op, ...); struct net_interface_module_info nimi; @@ -87,6 +89,7 @@ status_t send(ifnet_t *iface, net_data *data) if (!data) return B_ERROR; + // TODO! return B_OK; } @@ -128,7 +131,18 @@ status_t get_hardware_address(ifnet_t *iface, net_interface_hwaddr *hwaddr) { re status_t get_multicast_addresses(ifnet_t *iface, net_interface_hwaddr **hwaddr, int nb_addresses) { return -1; } status_t set_multicast_addresses(ifnet_t *iface, net_interface_hwaddr *hwaddr, int nb_addresses) { return -1; } -status_t set_mtu(ifnet_t *iface, uint32 mtu) { return -1; } +status_t set_mtu(ifnet_t *iface, uint32 mtu) +{ + ethernet_interface *ei = (ethernet_interface *) iface; + + if (mtu > ei->max_frame_size) + // hardware constraint always win! + mtu = ei->max_frame_size; + + ei->ifnet.if_mtu = mtu; + return B_OK; +} + status_t set_promiscuous(ifnet_t *iface, bool enable) { return -1; } status_t set_media(ifnet_t *iface, uint32 media) { return -1; } @@ -141,7 +155,6 @@ status_t lookup_devices(char *root, void *cookie) struct stat st; char path[1024]; status_t status; - int fd; dir = opendir(root); if (!dir) { @@ -165,76 +178,11 @@ status_t lookup_devices(char *root, void *cookie) if (S_ISDIR(st.st_mode)) status = lookup_devices(path, cookie); else if (S_ISCHR(st.st_mode)) { // char device = driver! - ifnet_t *iface; - ethernet_interface *ei; - int frame_size; - ether_addr_t mac_address; - if (strcmp(de->d_name, "stack") == 0 || // OBOS stack driver strcmp(de->d_name, "api") == 0) // BONE stack driver continue; // skip pseudo-entries - - fd = open(path, O_RDWR); - if (fd < B_OK) { - printf("ethernet: Unable to open(%s) -> %d [%s]. Skipping...\n", path, - fd, strerror(fd)); - status = fd; - continue; - }; - - // Init the network card - status = ioctl(fd, ETHER_INIT, NULL, 0); - if (status < B_OK) { - printf("ethernet: Failed to init %s: %ld [%s]. Skipping...\n", path, - status, strerror(status)); - close(fd); - continue; - }; - - // get the MAC address... - status = ioctl(fd, ETHER_GETADDR, &mac_address, 6); - if (status < B_OK) { - printf("ethernet: Failed to get %s MAC address: %ld [%s]. Skipping...\n", - path, status, strerror(status)); - close(fd); - continue; - }; - - - // Try to determine the MTU to use - status = ioctl(fd, ETHER_GETFRAMESIZE, &frame_size, sizeof(frame_size)); - if (status < B_OK) { - frame_size = ETHERMTU; - printf("ethernet: %s device don't support IF_GETFRAMESIZE; defaulting to %d\n", - path, frame_size); - }; - printf("ethernet: interface '%s':\n" - "\tMAC address: %02x:%02x:%02x:%02x:%02x:%02x\n" - "\tMTU: %d bytes\n", - path, - mac_address.byte[0], mac_address.byte[1], - mac_address.byte[2], mac_address.byte[3], - mac_address.byte[4], mac_address.byte[5], frame_size); - - - - ei = (ethernet_interface *) malloc(sizeof(*ei)); - if (!ei) - break; - - ei->fd = fd; - - iface = &ei->ifnet; - - iface->if_name = strdup(path); - iface->if_flags = (IFF_BROADCAST|IFF_SIMPLEX|IFF_MULTICAST); - iface->if_type = 0x20; - iface->if_mtu = frame_size; - - iface->module = &nimi; - - status = g_stack->register_interface(iface); + status = register_device(path, cookie); }; }; @@ -243,6 +191,78 @@ status_t lookup_devices(char *root, void *cookie) return status; } + +status_t register_device(const char *path, void *cookie) +{ + ifnet_t *iface; + ethernet_interface *ei; + int frame_size; + ether_addr_t mac_address; + int fd; + status_t status; + + fd = open(path, O_RDWR); + if (fd < B_OK) { + printf("ethernet: Unable to open(%s) -> %d [%s]. Skipping...\n", path, + fd, strerror(fd)); + return fd; + }; + + // Init the network card + status = ioctl(fd, ETHER_INIT, NULL, 0); + if (status < B_OK) { + printf("ethernet: Failed to init %s: %ld [%s]. Skipping...\n", path, + status, strerror(status)); + close(fd); + return status; + }; + + // get the MAC address... + status = ioctl(fd, ETHER_GETADDR, &mac_address, 6); + if (status < B_OK) { + printf("ethernet: Failed to get %s MAC address: %ld [%s]. Skipping...\n", + path, status, strerror(status)); + close(fd); + return status; + }; + + // Try to determine the MTU to use + status = ioctl(fd, ETHER_GETFRAMESIZE, &frame_size, sizeof(frame_size)); + if (status < B_OK) { + frame_size = ETHERMTU; + printf("ethernet: %s device don't support IF_GETFRAMESIZE; defaulting to %d\n", + path, frame_size); + }; + + printf("ethernet: interface '%s':\n" + "\tMAC address: %02x:%02x:%02x:%02x:%02x:%02x\n" + "\tMTU: %d bytes\n", + path, + mac_address.byte[0], mac_address.byte[1], + mac_address.byte[2], mac_address.byte[3], + mac_address.byte[4], mac_address.byte[5], frame_size); + + ei = (ethernet_interface *) malloc(sizeof(*ei)); + if (!ei) { + close(fd); + return B_NO_MEMORY; + }; + + ei->fd = fd; + ei->max_frame_size = frame_size; + + iface = &ei->ifnet; + + iface->if_name = strdup(path); + iface->if_flags = (IFF_BROADCAST|IFF_SIMPLEX|IFF_MULTICAST); + iface->if_type = 0x20; // IFT_ETHER; + iface->if_mtu = frame_size; + + iface->module = &nimi; + + return g_stack->register_interface(iface); +} + // #pragma mark - status_t std_ops(int32 op, ...)