static void low_level_init(struct netif *netif) { // struct ethernetif *ethernetif = netif->state; int if_type; /* set MAC hardware address length */ netif->hwaddr_len = ETHARP_HWADDR_LEN; /* set MAC hardware address */ if_type = get_if_type(p_ad); if(if_type == INT_APCLI){ memcpy(netif->hwaddr, p_ad->ApCfg.ApCliTab[0].CurrentAddress, MAC_ADDR_LEN); }else if(if_type == INT_MAIN){ memcpy(netif->hwaddr, p_ad->CurrentAddress, MAC_ADDR_LEN); } /* maximum transfer unit */ netif->mtu = 1500; /* device capabilities */ /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP; // pool_alloc_sem = OSSemCreate(0); // tx_skb = alloc_skb(2048, 0); /* Do whatever else is needed to initialize interface. */ }
void mac_data_xmit(struct pbuf *skb) { #ifdef DEBUG static int first_pkg = 1; #endif struct pbuf *q; char *p802x_hdr; int if_type; if(!is_hw_ok()) return; tx_skb = alloc_skb(skb->tot_len, 0); if(tx_skb == 0) return; p802x_hdr = (char*)tx_skb->data; for(q = skb; q != NULL; q = q->next) { memcpy(p802x_hdr, q->payload, q->len); p802x_hdr += q->len; } tx_skb->len = skb->tot_len; p802x_hdr = (char*)tx_skb->data; //dump_hex("s", tx_skb->data, tx_skb->len); if_type = get_if_type(p_ad); INC_MONITOR_ITEM_VALUE(send_packets_cnt); if(if_type == INT_APCLI){ tx_skb->dev = p_ad->ApCfg.ApCliTab[0].dev; ApCli_VirtualIF_PacketSend(tx_skb, tx_skb->dev); }else if(if_type == INT_MAIN){ tx_skb->dev = p_ad->net_dev; rt28xx_send_packets(tx_skb, tx_skb->dev); } return; }
static int handle_interface_type(struct nl80211_state *state, struct nl_cb *cb, struct nl_msg *msg, int argc, char **argv, enum id_input id) { enum nl80211_iftype type; int tpset; tpset = get_if_type(&argc, &argv, &type, false); if (tpset) return tpset; if (argc) return 1; NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, type); return 0; nla_put_failure: return -ENOBUFS; }
static int handle_interface_add(struct nl802154_state *state, struct nl_cb *cb, struct nl_msg *msg, int argc, char **argv, enum id_input id) { char *name; enum nl802154_iftype type; uint64_t eui64 = 0; int tpset; if (argc < 1) return 1; name = argv[0]; argc--; argv++; tpset = get_if_type(&argc, &argv, &type, true); if (tpset) return tpset; tpset = get_eui64(&argc, &argv, &eui64); if (tpset) return tpset; if (argc) return 1; NLA_PUT_STRING(msg, NL802154_ATTR_IFNAME, name); NLA_PUT_U32(msg, NL802154_ATTR_IFTYPE, type); NLA_PUT_U64(msg, NL802154_ATTR_EXTENDED_ADDR, eui64); return 0; nla_put_failure: return -ENOBUFS; }
static int handle_interface_add(struct nl80211_state *state, struct nl_cb *cb, struct nl_msg *msg, int argc, char **argv, enum id_input id) { char *name; char *mesh_id = NULL; enum nl80211_iftype type; int tpset; if (argc < 1) return 1; name = argv[0]; argc--; argv++; tpset = get_if_type(&argc, &argv, &type, true); if (tpset) return tpset; if (argc) { if (strcmp(argv[0], "mesh_id") == 0) { argc--; argv++; if (!argc) return 1; mesh_id = argv[0]; argc--; argv++; } else if (strcmp(argv[0], "4addr") == 0) { argc--; argv++; if (parse_4addr_flag(argv[0], msg)) { fprintf(stderr, "4addr error\n"); return 2; } argc--; argv++; } else if (strcmp(argv[0], "flags") == 0) { argc--; argv++; if (parse_mntr_flags(&argc, &argv, msg)) { fprintf(stderr, "flags error\n"); return 2; } } else { return 1; } } if (argc) return 1; NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, name); NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, type); if (mesh_id) NLA_PUT(msg, NL80211_ATTR_MESH_ID, strlen(mesh_id), mesh_id); return 0; nla_put_failure: return -ENOBUFS; }
static int handle_interface_add(struct nl80211_state *state, char *phy, char *dev, int argc, char **argv) { char *name; char *mesh_id = NULL; enum nl80211_iftype type; int tpset, err; struct nl_msg *msg; if (argc < 1) { fprintf(stderr, "not enough arguments\n"); return -1; } name = argv[0]; argc--; argv++; tpset = get_if_type(&argc, &argv, &type); if (tpset == 0) fprintf(stderr, "you must specify an interface type\n"); if (tpset <= 0) return -1; if (argc) { if (strcmp(argv[0], "mesh_id") != 0) { fprintf(stderr, "option %s not supported\n", argv[0]); return -1; } argc--; argv++; if (!argc) { fprintf(stderr, "not enough arguments\n"); return -1; } mesh_id = argv[0]; argc--; argv++; } if (argc) { fprintf(stderr, "too many arguments\n"); return -1; } msg = nlmsg_alloc(); if (!msg) { fprintf(stderr, "failed to allocate netlink msg\n"); return -1; } genlmsg_put(msg, 0, 0, genl_family_get_id(state->nl80211), 0, 0, NL80211_CMD_NEW_INTERFACE, 0); if (dev) NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(dev)); if (phy) return -1; /* XXX TODO */ NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, name); if (tpset) NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, type); if (mesh_id) NLA_PUT(msg, NL80211_ATTR_MESH_ID, strlen(mesh_id), mesh_id); if ((err = nl_send_auto_complete(state->nl_handle, msg)) < 0 || (err = nl_wait_for_ack(state->nl_handle)) < 0) { nla_put_failure: fprintf(stderr, "failed to create interface: %d\n", err); nlmsg_free(msg); return -1; } nlmsg_free(msg); return 0; }