static void ebt_log_packet(unsigned int pf, unsigned int hooknum, const struct sk_buff *skb, const struct net_device *in, const struct net_device *out, const struct nf_loginfo *loginfo, const char *prefix) { unsigned int bitmask; spin_lock_bh(&ebt_log_lock); printk("<%c>%s IN=%s OUT=%s MAC source = ", '0' + loginfo->u.log.level, prefix, in ? in->name : "", out ? out->name : ""); print_MAC(eth_hdr(skb)->h_source); printk("MAC dest = "); print_MAC(eth_hdr(skb)->h_dest); printk("proto = 0x%04x", ntohs(eth_hdr(skb)->h_proto)); if (loginfo->type == NF_LOG_TYPE_LOG) bitmask = loginfo->u.log.logflags; else bitmask = NF_LOG_MASK; if ((bitmask & EBT_LOG_IP) && eth_hdr(skb)->h_proto == htons(ETH_P_IP)){ const struct iphdr *ih; struct iphdr _iph; ih = skb_header_pointer(skb, 0, sizeof(_iph), &_iph); if (ih == NULL) { printk(" INCOMPLETE IP header"); goto out; } printk(" IP SRC=%u.%u.%u.%u IP DST=%u.%u.%u.%u, IP " "tos=0x%02X, IP proto=%d", NIPQUAD(ih->saddr), NIPQUAD(ih->daddr), ih->tos, ih->protocol); print_ports(skb, ih->protocol, ih->ihl*4); goto out; } #if defined(CONFIG_BRIDGE_EBT_IP6) || defined(CONFIG_BRIDGE_EBT_IP6_MODULE) if ((bitmask & EBT_LOG_IP6) && eth_hdr(skb)->h_proto == htons(ETH_P_IPV6)) { const struct ipv6hdr *ih; struct ipv6hdr _iph; uint8_t nexthdr; int offset_ph; ih = skb_header_pointer(skb, 0, sizeof(_iph), &_iph); if (ih == NULL) { printk(" INCOMPLETE IPv6 header"); goto out; } printk(" IPv6 SRC=%x:%x:%x:%x:%x:%x:%x:%x " "IPv6 DST=%x:%x:%x:%x:%x:%x:%x:%x, IPv6 " "priority=0x%01X, Next Header=%d", NIP6(ih->saddr), NIP6(ih->daddr), ih->priority, ih->nexthdr); nexthdr = ih->nexthdr; offset_ph = ipv6_skip_exthdr(skb, sizeof(_iph), &nexthdr); if (offset_ph == -1) goto out; print_ports(skb, nexthdr, offset_ph); goto out; } #endif if ((bitmask & EBT_LOG_ARP) && ((eth_hdr(skb)->h_proto == htons(ETH_P_ARP)) || (eth_hdr(skb)->h_proto == htons(ETH_P_RARP)))) { const struct arphdr *ah; struct arphdr _arph; ah = skb_header_pointer(skb, 0, sizeof(_arph), &_arph); if (ah == NULL) { printk(" INCOMPLETE ARP header"); goto out; } printk(" ARP HTYPE=%d, PTYPE=0x%04x, OPCODE=%d", ntohs(ah->ar_hrd), ntohs(ah->ar_pro), ntohs(ah->ar_op)); /* If it's for Ethernet and the lengths are OK, * then log the ARP payload */ if (ah->ar_hrd == htons(1) && ah->ar_hln == ETH_ALEN && ah->ar_pln == sizeof(__be32)) { const struct arppayload *ap; struct arppayload _arpp; ap = skb_header_pointer(skb, sizeof(_arph), sizeof(_arpp), &_arpp); if (ap == NULL) { printk(" INCOMPLETE ARP payload"); goto out; } printk(" ARP MAC SRC="); print_MAC(ap->mac_src); printk(" ARP IP SRC=%u.%u.%u.%u", myNIPQUAD(ap->ip_src)); printk(" ARP MAC DST="); print_MAC(ap->mac_dst); printk(" ARP IP DST=%u.%u.%u.%u", myNIPQUAD(ap->ip_dst)); } } out: printk("\n"); spin_unlock_bh(&ebt_log_lock); }
static void ebt_log(const struct sk_buff *skb, const struct net_device *in, const struct net_device *out, const void *data, unsigned int datalen) { struct ebt_log_info *info = (struct ebt_log_info *)data; char level_string[4] = "< >"; union {struct iphdr iph; struct tcpudphdr ports; struct arphdr arph; struct arppayload arpp;} u; level_string[1] = '0' + info->loglevel; spin_lock_bh(&ebt_log_lock); printk(level_string); printk("%s IN=%s OUT=%s ", info->prefix, in ? in->name : "", out ? out->name : ""); printk("MAC source = "); print_MAC((skb->mac.ethernet)->h_source); printk("MAC dest = "); print_MAC((skb->mac.ethernet)->h_dest); printk("proto = 0x%04x", ntohs(((*skb).mac.ethernet)->h_proto)); if ((info->bitmask & EBT_LOG_IP) && skb->mac.ethernet->h_proto == htons(ETH_P_IP)){ if (skb_copy_bits(skb, 0, &u.iph, sizeof(u.iph))) { printk(" INCOMPLETE IP header"); goto out; } printk(" IP SRC=%u.%u.%u.%u IP DST=%u.%u.%u.%u,", NIPQUAD(u.iph.saddr), NIPQUAD(u.iph.daddr)); printk(" IP tos=0x%02X, IP proto=%d", u.iph.tos, u.iph.protocol); if (u.iph.protocol == IPPROTO_TCP || u.iph.protocol == IPPROTO_UDP) { if (skb_copy_bits(skb, u.iph.ihl*4, &u.ports, sizeof(u.ports))) { printk(" INCOMPLETE TCP/UDP header"); goto out; } printk(" SPT=%u DPT=%u", ntohs(u.ports.src), ntohs(u.ports.dst)); } goto out; } if ((info->bitmask & EBT_LOG_ARP) && ((skb->mac.ethernet->h_proto == __constant_htons(ETH_P_ARP)) || (skb->mac.ethernet->h_proto == __constant_htons(ETH_P_RARP)))) { if (skb_copy_bits(skb, 0, &u.arph, sizeof(u.arph))) { printk(" INCOMPLETE ARP header"); goto out; } printk(" ARP HTYPE=%d, PTYPE=0x%04x, OPCODE=%d", ntohs(u.arph.ar_hrd), ntohs(u.arph.ar_pro), ntohs(u.arph.ar_op)); /* If it's for Ethernet and the lengths are OK, * then log the ARP payload */ if (u.arph.ar_hrd == __constant_htons(1) && u.arph.ar_hln == ETH_ALEN && u.arph.ar_pln == sizeof(uint32_t)) { if (skb_copy_bits(skb, sizeof(u.arph), &u.arpp, sizeof(u.arpp))) { printk(" INCOMPLETE ARP payload"); goto out; } printk(" ARP MAC SRC="); print_MAC(u.arpp.mac_src); printk(" ARP IP SRC=%u.%u.%u.%u", myNIPQUAD(u.arpp.ip_src)); printk(" ARP MAC DST="); print_MAC(u.arpp.mac_dst); printk(" ARP IP DST=%u.%u.%u.%u", myNIPQUAD(u.arpp.ip_dst)); } } out: printk("\n"); spin_unlock_bh(&ebt_log_lock); }
static void ebt_log_packet(unsigned int pf, unsigned int hooknum, const struct sk_buff *skb, const struct net_device *in, const struct net_device *out, const struct nf_loginfo *loginfo, const char *prefix) { unsigned int bitmask; spin_lock_bh(&ebt_log_lock); printk("<%c>%s IN=%s OUT=%s MAC source = ", '0' + loginfo->u.log.level, prefix, in ? in->name : "", out ? out->name : ""); print_MAC(eth_hdr(skb)->h_source); printk("MAC dest = "); print_MAC(eth_hdr(skb)->h_dest); printk("proto = 0x%04x", ntohs(eth_hdr(skb)->h_proto)); if (loginfo->type == NF_LOG_TYPE_LOG) bitmask = loginfo->u.log.logflags; else bitmask = NF_LOG_MASK; if ((bitmask & EBT_LOG_IP) && eth_hdr(skb)->h_proto == htons(ETH_P_IP)){ struct iphdr _iph, *ih; ih = skb_header_pointer(skb, 0, sizeof(_iph), &_iph); if (ih == NULL) { printk(" INCOMPLETE IP header"); goto out; } printk(" IP SRC=%u.%u.%u.%u IP DST=%u.%u.%u.%u, IP " "tos=0x%02X, IP proto=%d", NIPQUAD(ih->saddr), NIPQUAD(ih->daddr), ih->tos, ih->protocol); if (ih->protocol == IPPROTO_TCP || ih->protocol == IPPROTO_UDP || ih->protocol == IPPROTO_UDPLITE || ih->protocol == IPPROTO_SCTP || ih->protocol == IPPROTO_DCCP) { struct tcpudphdr _ports, *pptr; pptr = skb_header_pointer(skb, ih->ihl*4, sizeof(_ports), &_ports); if (pptr == NULL) { printk(" INCOMPLETE TCP/UDP header"); goto out; } printk(" SPT=%u DPT=%u", ntohs(pptr->src), ntohs(pptr->dst)); } goto out; } if ((bitmask & EBT_LOG_ARP) && ((eth_hdr(skb)->h_proto == htons(ETH_P_ARP)) || (eth_hdr(skb)->h_proto == htons(ETH_P_RARP)))) { struct arphdr _arph, *ah; ah = skb_header_pointer(skb, 0, sizeof(_arph), &_arph); if (ah == NULL) { printk(" INCOMPLETE ARP header"); goto out; } printk(" ARP HTYPE=%d, PTYPE=0x%04x, OPCODE=%d", ntohs(ah->ar_hrd), ntohs(ah->ar_pro), ntohs(ah->ar_op)); /* If it's for Ethernet and the lengths are OK, * then log the ARP payload */ if (ah->ar_hrd == htons(1) && ah->ar_hln == ETH_ALEN && ah->ar_pln == sizeof(__be32)) { struct arppayload _arpp, *ap; ap = skb_header_pointer(skb, sizeof(_arph), sizeof(_arpp), &_arpp); if (ap == NULL) { printk(" INCOMPLETE ARP payload"); goto out; } printk(" ARP MAC SRC="); print_MAC(ap->mac_src); printk(" ARP IP SRC=%u.%u.%u.%u", myNIPQUAD(ap->ip_src)); printk(" ARP MAC DST="); print_MAC(ap->mac_dst); printk(" ARP IP DST=%u.%u.%u.%u", myNIPQUAD(ap->ip_dst)); } } out: printk("\n"); spin_unlock_bh(&ebt_log_lock); }
/* \brief easy_connect easy_connect() function to connect the pre-defined network bearer, * config done via mbed_app.json (see README.md for details). * * IN: bool log_messages print out diagnostics or not. */ NetworkInterface* easy_connect(bool log_messages) { NetworkInterface* network_interface = NULL; int connect_success = -1; #if defined (EASY_CONNECT_WIFI) // We check if the _ssid and _password have already been set (via the easy_connect() // that takes thoses parameters or not. // If they have not been set, use the ones we can gain from mbed_app.json. if (_ssid == NULL) { if(strlen(MBED_CONF_APP_WIFI_SSID) > WIFI_SSID_MAX_LEN) { printf("ERROR - MBED_CONF_APP_WIFI_SSID is too long %d vs. %d\n", strlen(MBED_CONF_APP_WIFI_SSID), WIFI_SSID_MAX_LEN); return NULL; } } if (_password == NULL) { if(strlen(MBED_CONF_APP_WIFI_PASSWORD) > WIFI_PASSWORD_MAX_LEN) { printf("ERROR - MBED_CONF_APP_WIFI_PASSWORD is too long %d vs. %d\n", strlen(MBED_CONF_APP_WIFI_PASSWORD), WIFI_PASSWORD_MAX_LEN); return NULL; } } #endif // EASY_CONNECT_WIFI /// This should be removed once mbedOS supports proper dual-stack if (log_messages) { #if defined (EASY_CONNECT_MESH) || (MBED_CONF_LWIP_IPV6_ENABLED==true) printf("[EasyConnect] IPv6 mode\n"); #else printf("[EasyConnect] IPv4 mode\n"); #endif } #if defined (EASY_CONNECT_WIFI) if (log_messages) { printf("[EasyConnect] Using WiFi (%s) \n", EASY_CONNECT_WIFI_TYPE); printf("[EasyConnect] Connecting to WiFi %s\n", ((_ssid == NULL) ? MBED_CONF_APP_WIFI_SSID : _ssid) ); } network_interface = &wifi; if (_ssid == NULL) { connect_success = wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, (strlen(MBED_CONF_APP_WIFI_PASSWORD) > 1) ? NSAPI_SECURITY_WPA_WPA2 : NSAPI_SECURITY_NONE); } else { connect_success = wifi.connect(_ssid, _password, (strlen(_password) > 1) ? NSAPI_SECURITY_WPA_WPA2 : NSAPI_SECURITY_NONE); } #elif MBED_CONF_APP_NETWORK_INTERFACE == CELLULAR_ONBOARD || MBED_CONF_APP_NETWORK_INTERFACE == CELLULAR # ifdef MBED_CONF_APP_CELLULAR_SIM_PIN cellular.set_sim_pin(MBED_CONF_APP_CELLULAR_SIM_PIN); # endif # ifdef MBED_CONF_APP_CELLULAR_APN # ifndef MBED_CONF_APP_CELLULAR_USERNAME # define MBED_CONF_APP_CELLULAR_USERNAME 0 # endif # ifndef MBED_CONF_APP_CELLULAR_PASSWORD # define MBED_CONF_APP_CELLULAR_PASSWORD 0 # endif cellular.set_credentials(MBED_CONF_APP_CELLULAR_APN, MBED_CONF_APP_CELLULAR_USERNAME, MBED_CONF_APP_CELLULAR_PASSWORD); if (log_messages) { printf("[EasyConnect] Connecting using Cellular interface and APN %s\n", MBED_CONF_APP_CELLULAR_APN); } # else if (log_messages) { printf("[EasyConnect] Connecting using Cellular interface and default APN\n"); } # endif connect_success = cellular.connect(); network_interface = &cellular; #elif MBED_CONF_APP_NETWORK_INTERFACE == CELLULAR_WNC14A2A if (log_messages) { printf("[EasyConnect] Using WNC14A2A\n"); } # if MBED_CONF_APP_WNC_DEBUG == true printf("[EasyConnect] With WNC14A2A debug output set to 0x%02X\n",MBED_CONF_APP_WNC_DEBUG_SETTING); wnc.doDebug(MBED_CONF_APP_WNC_DEBUG_SETTING); # endif network_interface = &wnc; connect_success = wnc.connect(); #elif MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET if (log_messages) { printf("[EasyConnect] Using Ethernet\n"); } network_interface = ð #if MBED_CONF_EVENTS_SHARED_DISPATCH_FROM_APPLICATION eth.set_blocking(false); #endif connect_success = eth.connect(); #endif #ifdef EASY_CONNECT_MESH if (log_messages) { printf("[EasyConnect] Using Mesh (%s)\n", EASY_CONNECT_MESH_TYPE); printf("[EasyConnect] Connecting to Mesh...\n"); } network_interface = &mesh; #if MBED_CONF_EVENTS_SHARED_DISPATCH_FROM_APPLICATION mesh.set_blocking(false); #endif mesh.initialize(&rf_phy); connect_success = mesh.connect(); #endif if(connect_success == 0 #if (MBED_CONF_EVENTS_SHARED_DISPATCH_FROM_APPLICATION && (MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET || defined(EASY_CONNECT_MESH))) || connect_success == NSAPI_ERROR_IS_CONNECTED || connect_success == NSAPI_ERROR_ALREADY #endif ) { #if (MBED_CONF_EVENTS_SHARED_DISPATCH_FROM_APPLICATION && (MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET || defined(EASY_CONNECT_MESH))) nsapi_connection_status_t connection_status; for (;;) { // Check current connection status. connection_status = network_interface->get_connection_status(); if (connection_status == NSAPI_STATUS_GLOBAL_UP) { // Connection ready. break; } else if (connection_status == NSAPI_STATUS_ERROR_UNSUPPORTED) { if (log_messages) { print_MAC(network_interface, log_messages); printf("[EasyConnect] Connection to Network Failed %d!\n", connection_status); } return NULL; } // Not ready yet, give some runtime to the network stack. mbed::mbed_event_queue()->dispatch(100); } #endif if (log_messages) { printf("[EasyConnect] Connected to Network successfully\n"); print_MAC(network_interface, log_messages); } } else { if (log_messages) { print_MAC(network_interface, log_messages); printf("[EasyConnect] Connection to Network Failed %d!\n", connect_success); } return NULL; } const char *ip_addr = network_interface->get_ip_address(); if (ip_addr == NULL) { if (log_messages) { printf("[EasyConnect] ERROR - No IP address\n"); } return NULL; } if (log_messages) { printf("[EasyConnect] IP address %s\n", ip_addr); } return network_interface; }