本文整理汇总了C++中LIST_INSERT_HEAD函数的典型用法代码示例。如果您正苦于以下问题:C++ LIST_INSERT_HEAD函数的具体用法?C++ LIST_INSERT_HEAD怎么用?C++ LIST_INSERT_HEAD使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了LIST_INSERT_HEAD函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: isrlink
/*
* Establish an interrupt handler.
* Called by driver attach functions.
*/
void *
isrlink(int (*func)(void *), void *arg, int ipl, int priority)
{
struct isr *newisr, *curisr;
isr_list_t *list;
if ((ipl < 0) || (ipl >= NISR))
panic("isrlink: bad ipl %d", ipl);
newisr = (struct isr *)malloc(sizeof(struct isr), M_DEVBUF, M_NOWAIT);
if (newisr == NULL)
panic("isrlink: can't allocate space for isr");
/* Fill in the new entry. */
newisr->isr_func = func;
newisr->isr_arg = arg;
newisr->isr_ipl = ipl;
newisr->isr_priority = priority;
/*
* Some devices are particularly sensitive to interrupt
* handling latency. The DCA, for example, can lose many
* characters if its interrupt isn't handled with reasonable
* speed.
*
* To work around this problem, each device can give itself a
* "priority". An unbuffered DCA would give itself a higher
* priority than a SCSI device, for example.
*
* This is necessary because of the flat spl scheme employed by
* the hp300. Each device can be set from ipl 3 to ipl 5, which
* in turn means that splbio, splnet, and spltty must all be at
* spl5.
*
* Don't blame me...I just work here.
*/
/*
* Get the appropriate ISR list. If the list is empty, no
* additional work is necessary; we simply insert ourselves
* at the head of the list.
*/
list = &isr_list[ipl];
if (list->lh_first == NULL) {
LIST_INSERT_HEAD(list, newisr, isr_link);
goto done;
}
/*
* A little extra work is required. We traverse the list
* and place ourselves after any ISRs with our current (or
* higher) priority.
*/
for (curisr = list->lh_first; curisr->isr_link.le_next != NULL;
curisr = curisr->isr_link.le_next) {
if (newisr->isr_priority > curisr->isr_priority) {
LIST_INSERT_BEFORE(curisr, newisr, isr_link);
goto done;
}
}
/*
* We're the least important entry, it seems. We just go
* on the end.
*/
LIST_INSERT_AFTER(curisr, newisr, isr_link);
done:
return (newisr);
}
示例2: doi_register
void
doi_register (struct doi *doi)
{
LIST_INSERT_HEAD (&doi_tab, doi, link);
}
示例3: portpilot_helpers_create_dev
uint8_t portpilot_helpers_create_dev(libusb_device *device,
struct portpilot_ctx *pp_ctx, uint16_t max_packet_size,
uint8_t input_endpoint, uint8_t intf_num, uint8_t *dev_path,
uint8_t dev_path_len)
{
int32_t retval;
struct portpilot_dev *pp_dev = NULL;
//TODO: Split into new function?
//All info is ready, time to create struc, open device and add to list
pp_dev = calloc(sizeof(struct portpilot_dev), 1);
if (!pp_dev) {
fprintf(stderr, "Failed to allocate memory for PortPilot device\n");
return RETVAL_FAILURE;
}
if (pp_ctx->output_interval) {
pp_dev->agg_data = calloc(sizeof(struct portpilot_data), 1);
if (!pp_dev->agg_data) {
fprintf(stderr, "Failed to allocate memory for agg. data\n");
return RETVAL_FAILURE;
}
}
pp_dev->max_packet_size = max_packet_size;
pp_dev->input_endpoint = input_endpoint;
pp_dev->intf_num = intf_num;
retval = libusb_open(device, &(pp_dev->handle));
if (retval) {
fprintf(stderr, "Failed to open device: %s\n",
libusb_error_name(retval));
free(pp_dev);
return RETVAL_FAILURE;
}
if (libusb_kernel_driver_active(pp_dev->handle, intf_num) == 1) {
retval = libusb_detach_kernel_driver(pp_dev->handle, intf_num);
if (retval) {
fprintf(stderr, "Failed to detach kernel driver: %s\n",
libusb_error_name(retval));
libusb_close(pp_dev->handle);
free(pp_dev);
return RETVAL_FAILURE;
}
}
retval = libusb_claim_interface(pp_dev->handle, intf_num);
if (retval) {
fprintf(stderr, "Failed to claim interface: %s\n",
libusb_error_name(retval));
libusb_close(pp_dev->handle);
free(pp_dev);
return RETVAL_FAILURE;
}
//Try to read serial number from device. It is not critical if it is not
//present, the check for matching a desired serial has been done by the time
//we get here
portpilot_helpers_get_serial_num(device, pp_dev->serial_number,
MAX_USB_STR_LEN);
memcpy(pp_dev->path, dev_path, dev_path_len);
pp_dev->path_len = dev_path_len;
pp_dev->pp_ctx = pp_ctx;
LIST_INSERT_HEAD(&(pp_dev->pp_ctx->dev_head), pp_dev, next_dev);
++pp_ctx->dev_list_len;
fprintf(stdout, "Ready to start reading on device %s\n",
pp_dev->serial_number);
portpilot_helpers_start_reading_data(pp_dev);
return RETVAL_SUCCESS;
}
示例4: e1000phy_attach
static int
e1000phy_attach(device_t dev)
{
struct mii_softc *sc;
struct mii_attach_args *ma;
struct mii_data *mii;
const char *sep = "";
getenv_int("e1000phy_debug", &e1000phy_debug);
sc = device_get_softc(dev);
ma = device_get_ivars(dev);
sc->mii_dev = device_get_parent(dev);
mii = device_get_softc(sc->mii_dev);
LIST_INSERT_HEAD(&mii->mii_phys, sc, mii_list);
sc->mii_inst = mii->mii_instance;
sc->mii_phy = ma->mii_phyno;
sc->mii_service = e1000phy_service;
sc->mii_pdata = mii;
sc->mii_flags |= MIIF_NOISOLATE;
mii->mii_instance++;
e1000phy_reset(sc);
#define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL)
#define PRINT(s) printf("%s%s", sep, s); sep = ", "
#if 0
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst),
E1000_CR_ISOLATE);
#endif
device_printf(dev, " ");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_TX, IFM_FDX, sc->mii_inst),
E1000_CR_SPEED_1000 | E1000_CR_FULL_DUPLEX);
PRINT("1000baseTX-FDX");
/*
TODO - apparently 1000BT-simplex not supported?
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_TX, 0, sc->mii_inst),
E1000_CR_SPEED_1000);
PRINT("1000baseTX");
*/
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, sc->mii_inst),
E1000_CR_SPEED_100 | E1000_CR_FULL_DUPLEX);
PRINT("100baseTX-FDX");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst),
E1000_CR_SPEED_100);
PRINT("100baseTX");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, sc->mii_inst),
E1000_CR_SPEED_10 | E1000_CR_FULL_DUPLEX);
PRINT("10baseTX-FDX");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, sc->mii_inst),
E1000_CR_SPEED_10);
PRINT("10baseTX");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst), 0);
PRINT("auto");
printf("\n");
#undef ADD
#undef PRINT
MIIBUS_MEDIAINIT(sc->mii_dev);
return(0);
}
示例5: ikev2_process_cfg_request_attribs
static int
ikev2_process_cfg_request_attribs(struct ikev2_sa *ike_sa,
struct ikev2_child_sa *child_sa,
struct ikev2payl_config *cfg,
struct ikev2_child_param *param)
{
struct ikev2cfg_attrib *attr;
size_t bytes;
int attr_type;
unsigned int attr_len;
int ip4_address = 0;
int ip6_address = 0;
int af;
size_t addrsize;
uint8_t *addrbits;
struct rcf_address *addr;
int address_fail = 0;
int address_success = 0;
#ifdef DEBUG_TRACE
char addrstr[INET6_ADDRSTRLEN];
#endif
for (bytes = get_payload_length(cfg) - sizeof(*cfg),
attr = (struct ikev2cfg_attrib *)(cfg + 1);
bytes > 0;
bytes -= IKEV2CFG_ATTR_TOTALLENGTH(attr),
attr = IKEV2CFG_ATTR_NEXT(attr)) {
attr_type = IKEV2CFG_ATTR_TYPE(attr);
attr_len = IKEV2CFG_ATTR_LENGTH(attr);
TRACE((PLOGLOC, "attribute type %d length %d\n",
attr_type, attr_len));
assert(bytes >= sizeof(struct ikev2cfg_attrib));
switch (attr_type) {
case IKEV2_CFG_INTERNAL_IP4_ADDRESS:
TRACE((PLOGLOC, "INTERNAL_IP4_ADDRESS\n"));
if (++ip4_address > ike_max_ip4_alloc(ike_sa->rmconf)) {
TRACE((PLOGLOC,
"INTERNAL_IP4_ADDRESS request exceeds allocation limit (%d)\n",
ike_max_ip4_alloc(ike_sa->rmconf)));
++address_fail;
break;
}
af = AF_INET;
addrsize = sizeof(struct in_addr);
addrbits = (uint8_t *)(attr + 1);
if (attr_len != 0 && attr_len < addrsize) {
TRACE((PLOGLOC,
"bogus attribute length %d, ignoring content\n",
attr_len));
goto alloc_addr;
}
if (attr_len == 0 ||
get_uint32((uint32_t *)addrbits) == INADDR_ANY)
goto alloc_addr;
try_assign:
TRACE((PLOGLOC, "trying peer-specified address %s\n",
inet_ntop(af, addrbits, addrstr, sizeof(addrstr))));
addr = rc_addrpool_assign(ikev2_addresspool(ike_sa->rmconf),
af, addrbits);
if (addr) {
TRACE((PLOGLOC, "OK.\n"));
goto alloc_success;
}
TRACE((PLOGLOC, "failed, trying to allocate different address\n"));
/* go on */
alloc_addr:
addr = rc_addrpool_alloc_any(ikev2_addresspool(ike_sa->rmconf), af);
if (!addr) {
TRACE((PLOGLOC, "no address available for lease\n"));
++address_fail;
break;
}
TRACE((PLOGLOC, "allocated %s\n",
inet_ntop(af, addr->address, addrstr, sizeof(addrstr))));
alloc_success:
++address_success;
LIST_INSERT_HEAD(&child_sa->lease_list, addr, link_sa);
break;
case IKEV2_CFG_INTERNAL_IP6_ADDRESS:
if (++ip6_address > ike_max_ip6_alloc(ike_sa->rmconf)) {
TRACE((PLOGLOC,
"INTERNAL_IP6_ADDRESS request exceeds allocation limit (%d)\n",
ike_max_ip6_alloc(ike_sa->rmconf)));
++address_fail;
break;
}
af = AF_INET6;
addrsize = sizeof(struct in6_addr);
addrbits = (uint8_t *)(attr + 1);
if (attr_len != 0 &&
attr_len < sizeof(struct ikev2cfg_ip6addr)) {
TRACE((PLOGLOC,
//.........这里部分代码省略.........
示例6: ptstart
static void
ptstart(struct cam_periph *periph, union ccb *start_ccb)
{
struct pt_softc *softc;
struct bio *bp;
int s;
softc = (struct pt_softc *)periph->softc;
/*
* See if there is a buf with work for us to do..
*/
s = splbio();
bp = bioq_first(&softc->bio_queue);
if (periph->immediate_priority <= periph->pinfo.priority) {
CAM_DEBUG_PRINT(CAM_DEBUG_SUBTRACE,
("queuing for immediate ccb\n"));
start_ccb->ccb_h.ccb_state = PT_CCB_WAITING;
SLIST_INSERT_HEAD(&periph->ccb_list, &start_ccb->ccb_h,
periph_links.sle);
periph->immediate_priority = CAM_PRIORITY_NONE;
splx(s);
wakeup(&periph->ccb_list);
} else if (bp == NULL) {
splx(s);
xpt_release_ccb(start_ccb);
} else {
int oldspl;
bioq_remove(&softc->bio_queue, bp);
devstat_start_transaction(&softc->device_stats);
scsi_send_receive(&start_ccb->csio,
/*retries*/4,
ptdone,
MSG_SIMPLE_Q_TAG,
bp->bio_cmd == BIO_READ,
/*byte2*/0,
bp->bio_bcount,
bp->bio_data,
/*sense_len*/SSD_FULL_SIZE,
/*timeout*/softc->io_timeout);
start_ccb->ccb_h.ccb_state = PT_CCB_BUFFER_IO_UA;
/*
* Block out any asyncronous callbacks
* while we touch the pending ccb list.
*/
oldspl = splcam();
LIST_INSERT_HEAD(&softc->pending_ccbs, &start_ccb->ccb_h,
periph_links.le);
splx(oldspl);
start_ccb->ccb_h.ccb_bp = bp;
bp = bioq_first(&softc->bio_queue);
splx(s);
xpt_action(start_ccb);
if (bp != NULL) {
/* Have more work to do, so ensure we stay scheduled */
xpt_schedule(periph, /* XXX priority */1);
}
}
}
示例7: bsd_init
//.........这里部分代码省略.........
execargs_cache_lock = lck_mtx_alloc_init(proc_lck_grp, proc_lck_attr);
execargs_cache_size = bsd_simul_execs;
execargs_free_count = bsd_simul_execs;
execargs_cache = (vm_offset_t *)kalloc(bsd_simul_execs * sizeof(vm_offset_t));
bzero(execargs_cache, bsd_simul_execs * sizeof(vm_offset_t));
if (current_task() != kernel_task)
printf("bsd_init: We have a problem, "
"current task is not kernel task\n");
bsd_init_kprintf("calling get_bsdthread_info\n");
ut = (uthread_t)get_bsdthread_info(current_thread());
#if CONFIG_MACF
/*
* Initialize the MAC Framework
*/
mac_policy_initbsd();
kernproc->p_mac_enforce = 0;
#if defined (__i386__) || defined (__x86_64__)
/*
* We currently only support this on i386/x86_64, as that is the
* only lock code we have instrumented so far.
*/
check_policy_init(policy_check_flags);
#endif
#endif /* MAC */
/*
* Create process 0.
*/
proc_list_lock();
LIST_INSERT_HEAD(&allproc, kernproc, p_list);
kernproc->p_pgrp = &pgrp0;
LIST_INSERT_HEAD(PGRPHASH(0), &pgrp0, pg_hash);
LIST_INIT(&pgrp0.pg_members);
#ifdef CONFIG_FINE_LOCK_GROUPS
lck_mtx_init(&pgrp0.pg_mlock, proc_mlock_grp, proc_lck_attr);
#else
lck_mtx_init(&pgrp0.pg_mlock, proc_lck_grp, proc_lck_attr);
#endif
/* There is no other bsd thread this point and is safe without pgrp lock */
LIST_INSERT_HEAD(&pgrp0.pg_members, kernproc, p_pglist);
kernproc->p_listflag |= P_LIST_INPGRP;
kernproc->p_pgrpid = 0;
kernproc->p_uniqueid = 0;
pgrp0.pg_session = &session0;
pgrp0.pg_membercnt = 1;
session0.s_count = 1;
session0.s_leader = kernproc;
session0.s_listflags = 0;
#ifdef CONFIG_FINE_LOCK_GROUPS
lck_mtx_init(&session0.s_mlock, proc_mlock_grp, proc_lck_attr);
#else
lck_mtx_init(&session0.s_mlock, proc_lck_grp, proc_lck_attr);
#endif
LIST_INSERT_HEAD(SESSHASH(0), &session0, s_hash);
proc_list_unlock();
#if CONFIG_LCTX
kernproc->p_lctx = NULL;
#endif
示例8: in6_pcbbind_port
/*
* Bind port from sin6 to in6p.
*/
static int
in6_pcbbind_port(struct in6pcb *in6p, struct sockaddr_in6 *sin6, struct lwp *l)
{
struct inpcbtable *table = in6p->in6p_table;
struct socket *so = in6p->in6p_socket;
int wild = 0, reuseport = (so->so_options & SO_REUSEPORT);
int error;
if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0 &&
((so->so_proto->pr_flags & PR_CONNREQUIRED) == 0 ||
(so->so_options & SO_ACCEPTCONN) == 0))
wild = 1;
if (sin6->sin6_port != 0) {
enum kauth_network_req req;
#ifndef IPNOPRIVPORTS
if (ntohs(sin6->sin6_port) < IPV6PORT_RESERVED)
req = KAUTH_REQ_NETWORK_BIND_PRIVPORT;
else
#endif /* IPNOPRIVPORTS */
req = KAUTH_REQ_NETWORK_BIND_PORT;
error = kauth_authorize_network(l->l_cred, KAUTH_NETWORK_BIND,
req, so, sin6, NULL);
if (error)
return (EACCES);
}
if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) {
/*
* Treat SO_REUSEADDR as SO_REUSEPORT for multicast;
* allow compepte duplication of binding if
* SO_REUSEPORT is set, or if SO_REUSEADDR is set
* and a multicast address is bound on both
* new and duplicated sockets.
*/
if (so->so_options & SO_REUSEADDR)
reuseport = SO_REUSEADDR|SO_REUSEPORT;
}
if (sin6->sin6_port != 0) {
if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
#ifdef INET
struct inpcb *t;
struct vestigial_inpcb vestige;
t = in_pcblookup_port(table,
*(struct in_addr *)&sin6->sin6_addr.s6_addr32[3],
sin6->sin6_port, wild, &vestige);
if (t && (reuseport & t->inp_socket->so_options) == 0)
return (EADDRINUSE);
if (!t
&& vestige.valid
&& !(reuseport && vestige.reuse_port))
return EADDRINUSE;
#else
return (EADDRNOTAVAIL);
#endif
}
{
struct in6pcb *t;
struct vestigial_inpcb vestige;
t = in6_pcblookup_port(table, &sin6->sin6_addr,
sin6->sin6_port, wild, &vestige);
if (t && (reuseport & t->in6p_socket->so_options) == 0)
return (EADDRINUSE);
if (!t
&& vestige.valid
&& !(reuseport && vestige.reuse_port))
return EADDRINUSE;
}
}
if (sin6->sin6_port == 0) {
int e;
e = in6_pcbsetport(sin6, in6p, l);
if (e != 0)
return (e);
} else {
in6p->in6p_lport = sin6->sin6_port;
in6_pcbstate(in6p, IN6P_BOUND);
}
LIST_REMOVE(&in6p->in6p_head, inph_lhash);
LIST_INSERT_HEAD(IN6PCBHASH_PORT(table, in6p->in6p_lport),
&in6p->in6p_head, inph_lhash);
return (0);
}
示例9: mac_add_type
static int
mac_add_type(const char *name, const char *labels)
{
struct label_default *ld, *ld_new;
char *name_dup, *labels_dup;
/*
* Speculatively allocate all the memory now to avoid allocating
* later when we will someday hold a mutex.
*/
name_dup = strdup(name);
if (name_dup == NULL) {
errno = ENOMEM;
return (-1);
}
labels_dup = strdup(labels);
if (labels_dup == NULL) {
free(name_dup);
errno = ENOMEM;
return (-1);
}
ld_new = malloc(sizeof(*ld));
if (ld_new == NULL) {
free(name_dup);
free(labels_dup);
errno = ENOMEM;
return (-1);
}
/*
* If the type is already present, replace the current entry
* rather than add a new instance.
*/
for (ld = LIST_FIRST(&label_default_head); ld != NULL;
ld = LIST_NEXT(ld, ld_entries)) {
if (strcmp(name, ld->ld_name) == 0)
break;
}
if (ld != NULL) {
free(ld->ld_labels);
ld->ld_labels = labels_dup;
labels_dup = NULL;
} else {
ld = ld_new;
ld->ld_name = name_dup;
ld->ld_labels = labels_dup;
ld_new = NULL;
name_dup = NULL;
labels_dup = NULL;
LIST_INSERT_HEAD(&label_default_head, ld, ld_entries);
}
if (name_dup != NULL)
free(name_dup);
if (labels_dup != NULL)
free(labels_dup);
if (ld_new != NULL)
free(ld_new);
return (0);
}
示例10: bthidev_attach
//.........这里部分代码省略.........
if (prop_object_type(obj) == PROP_TYPE_NUMBER) {
sc->sc_ctlpsm = prop_number_integer_value(obj);
if (L2CAP_PSM_INVALID(sc->sc_ctlpsm)) {
aprint_error(" invalid %s\n", BTHIDEVcontrolpsm);
return;
}
}
obj = prop_dictionary_get(dict, BTHIDEVinterruptpsm);
if (prop_object_type(obj) == PROP_TYPE_NUMBER) {
sc->sc_intpsm = prop_number_integer_value(obj);
if (L2CAP_PSM_INVALID(sc->sc_intpsm)) {
aprint_error(" invalid %s\n", BTHIDEVinterruptpsm);
return;
}
}
obj = prop_dictionary_get(dict, BTHIDEVdescriptor);
if (prop_object_type(obj) == PROP_TYPE_DATA) {
dlen = prop_data_size(obj);
desc = prop_data_data_nocopy(obj);
} else {
aprint_error(" no %s\n", BTHIDEVdescriptor);
return;
}
obj = prop_dictionary_get(dict, BTHIDEVreconnect);
if (prop_object_type(obj) == PROP_TYPE_BOOL
&& !prop_bool_true(obj))
sc->sc_flags |= BTHID_RECONNECT;
/*
* Parse the descriptor and attach child devices, one per report.
*/
maxid = -1;
h.report_ID = 0;
d = hid_start_parse(desc, dlen, hid_none);
while (hid_get_item(d, &h)) {
if (h.report_ID > maxid)
maxid = h.report_ID;
}
hid_end_parse(d);
if (maxid < 0) {
aprint_error(" no reports found\n");
return;
}
aprint_normal("\n");
if (kthread_create(PRI_NONE, KTHREAD_MUSTJOIN, NULL, bthidev_process,
sc, &sc->sc_lwp, "%s", device_xname(self)) != 0) {
aprint_error_dev(self, "failed to create input thread\n");
return;
}
for (rep = 0 ; rep <= maxid ; rep++) {
if (hid_report_size(desc, dlen, hid_feature, rep) == 0
&& hid_report_size(desc, dlen, hid_input, rep) == 0
&& hid_report_size(desc, dlen, hid_output, rep) == 0)
continue;
bha.ba_vendor = vendor;
bha.ba_product = product;
bha.ba_desc = desc;
bha.ba_dlen = dlen;
bha.ba_input = bthidev_null;
bha.ba_feature = bthidev_null;
bha.ba_output = bthidev_output;
bha.ba_id = rep;
locs[BTHIDBUSCF_REPORTID] = rep;
dev = config_found_sm_loc(self, "bthidbus",
locs, &bha, bthidev_print, config_stdsubmatch);
if (dev != NULL) {
hidev = device_private(dev);
hidev->sc_dev = dev;
hidev->sc_parent = self;
hidev->sc_id = rep;
hidev->sc_input = bha.ba_input;
hidev->sc_feature = bha.ba_feature;
LIST_INSERT_HEAD(&sc->sc_list, hidev, sc_next);
}
}
pmf_device_register(self, NULL, NULL);
/*
* start bluetooth connections
*/
mutex_enter(bt_lock);
if ((sc->sc_flags & BTHID_RECONNECT) == 0
&& (err = bthidev_listen(sc)) != 0)
aprint_error_dev(self, "failed to listen (%d)\n", err);
if (sc->sc_flags & BTHID_CONNECTING)
bthidev_connect(sc);
mutex_exit(bt_lock);
}
示例11: ieee80211_ifattach
void
ieee80211_ifattach(struct ifnet *ifp)
{
struct ieee80211com *ic = (void *)ifp;
struct ieee80211_channel *c;
int i;
memcpy(((struct arpcom *)ifp)->ac_enaddr, ic->ic_myaddr,
ETHER_ADDR_LEN);
ether_ifattach(ifp);
ifp->if_output = ieee80211_output;
#if NBPFILTER > 0
bpfattach(&ic->ic_rawbpf, ifp, DLT_IEEE802_11,
sizeof(struct ieee80211_frame_addr4));
#endif
ieee80211_crypto_attach(ifp);
/*
* Fill in 802.11 available channel set, mark
* all available channels as active, and pick
* a default channel if not already specified.
*/
memset(ic->ic_chan_avail, 0, sizeof(ic->ic_chan_avail));
ic->ic_modecaps |= 1<<IEEE80211_MODE_AUTO;
for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
c = &ic->ic_channels[i];
if (c->ic_flags) {
/*
* Verify driver passed us valid data.
*/
if (i != ieee80211_chan2ieee(ic, c)) {
printf("%s: bad channel ignored; "
"freq %u flags %x number %u\n",
ifp->if_xname, c->ic_freq, c->ic_flags,
i);
c->ic_flags = 0; /* NB: remove */
continue;
}
setbit(ic->ic_chan_avail, i);
/*
* Identify mode capabilities.
*/
if (IEEE80211_IS_CHAN_A(c))
ic->ic_modecaps |= 1<<IEEE80211_MODE_11A;
if (IEEE80211_IS_CHAN_B(c))
ic->ic_modecaps |= 1<<IEEE80211_MODE_11B;
if (IEEE80211_IS_CHAN_PUREG(c))
ic->ic_modecaps |= 1<<IEEE80211_MODE_11G;
if (IEEE80211_IS_CHAN_T(c))
ic->ic_modecaps |= 1<<IEEE80211_MODE_TURBO;
}
}
/* validate ic->ic_curmode */
if ((ic->ic_modecaps & (1<<ic->ic_curmode)) == 0)
ic->ic_curmode = IEEE80211_MODE_AUTO;
ic->ic_des_chan = IEEE80211_CHAN_ANYC; /* any channel is ok */
ic->ic_scan_lock = IEEE80211_SCAN_UNLOCKED;
/* IEEE 802.11 defines a MTU >= 2290 */
ifp->if_capabilities |= IFCAP_VLAN_MTU;
ieee80211_setbasicrates(ic);
(void)ieee80211_setmode(ic, ic->ic_curmode);
if (ic->ic_lintval == 0)
ic->ic_lintval = 100; /* default sleep */
ic->ic_bmisstimeout = 7*ic->ic_lintval; /* default 7 beacons */
ic->ic_dtim_period = 1; /* all TIMs are DTIMs */
LIST_INSERT_HEAD(&ieee80211com_head, ic, ic_list);
ieee80211_node_attach(ifp);
ieee80211_proto_attach(ifp);
if_addgroup(ifp, "wlan");
ifp->if_priority = IF_WIRELESS_DEFAULT_PRIORITY;
}
示例12: ng_ksocket_finish_accept
/*
* Handle the first completed incoming connection, assumed to be already
* on the socket's so_comp queue.
*/
static void
ng_ksocket_finish_accept(priv_p priv)
{
struct socket *const head = priv->so;
struct socket *so;
struct sockaddr *sa = NULL;
struct ng_mesg *resp;
struct ng_ksocket_accept *resp_data;
node_p node;
priv_p priv2;
int len;
int error;
ACCEPT_LOCK();
so = TAILQ_FIRST(&head->so_comp);
if (so == NULL) { /* Should never happen */
ACCEPT_UNLOCK();
return;
}
TAILQ_REMOVE(&head->so_comp, so, so_list);
head->so_qlen--;
so->so_qstate &= ~SQ_COMP;
so->so_head = NULL;
SOCK_LOCK(so);
soref(so);
so->so_state |= SS_NBIO;
SOCK_UNLOCK(so);
ACCEPT_UNLOCK();
/* XXX KNOTE_UNLOCKED(&head->so_rcv.sb_sel.si_note, 0); */
soaccept(so, &sa);
len = OFFSETOF(struct ng_ksocket_accept, addr);
if (sa != NULL)
len += sa->sa_len;
NG_MKMESSAGE(resp, NGM_KSOCKET_COOKIE, NGM_KSOCKET_ACCEPT, len,
M_NOWAIT);
if (resp == NULL) {
soclose(so);
goto out;
}
resp->header.flags |= NGF_RESP;
resp->header.token = priv->response_token;
/* Clone a ksocket node to wrap the new socket */
error = ng_make_node_common(&ng_ksocket_typestruct, &node);
if (error) {
free(resp, M_NETGRAPH);
soclose(so);
goto out;
}
if (ng_ksocket_constructor(node) != 0) {
NG_NODE_UNREF(node);
free(resp, M_NETGRAPH);
soclose(so);
goto out;
}
priv2 = NG_NODE_PRIVATE(node);
priv2->so = so;
priv2->flags |= KSF_CLONED | KSF_EMBRYONIC;
/*
* Insert the cloned node into a list of embryonic children
* on the parent node. When a hook is created on the cloned
* node it will be removed from this list. When the parent
* is destroyed it will destroy any embryonic children it has.
*/
LIST_INSERT_HEAD(&priv->embryos, priv2, siblings);
SOCKBUF_LOCK(&so->so_rcv);
soupcall_set(so, SO_RCV, ng_ksocket_incoming, node);
SOCKBUF_UNLOCK(&so->so_rcv);
SOCKBUF_LOCK(&so->so_snd);
soupcall_set(so, SO_SND, ng_ksocket_incoming, node);
SOCKBUF_UNLOCK(&so->so_snd);
/* Fill in the response data and send it or return it to the caller */
resp_data = (struct ng_ksocket_accept *)resp->data;
resp_data->nodeid = NG_NODE_ID(node);
if (sa != NULL)
bcopy(sa, &resp_data->addr, sa->sa_len);
NG_SEND_MSG_ID(error, node, resp, priv->response_addr, 0);
out:
if (sa != NULL)
free(sa, M_SONAME);
}
示例13: pflog_clone_create
int
pflog_clone_create(struct if_clone *ifc, int unit)
#endif
{
struct ifnet *ifp;
struct pflog_softc *pflogif;
int s;
if (unit >= PFLOGIFS_MAX)
return (EINVAL);
if ((pflogif = malloc(sizeof(*pflogif),
M_DEVBUF, M_NOWAIT|M_ZERO)) == NULL)
return (ENOMEM);
pflogif->sc_unit = unit;
#ifdef __FreeBSD__
ifp = pflogif->sc_ifp = if_alloc(IFT_PFLOG);
if (ifp == NULL) {
free(pflogif, M_DEVBUF);
return (ENOSPC);
}
if_initname(ifp, ifc->ifc_name, unit);
#else
ifp = &pflogif->sc_if;
snprintf(ifp->if_xname, sizeof ifp->if_xname, "pflog%d", unit);
#endif
ifp->if_softc = pflogif;
ifp->if_mtu = PFLOGMTU;
ifp->if_ioctl = pflogioctl;
ifp->if_output = pflogoutput;
ifp->if_start = pflogstart;
#ifndef __FreeBSD__
ifp->if_type = IFT_PFLOG;
#endif
ifp->if_snd.ifq_maxlen = ifqmaxlen;
ifp->if_hdrlen = PFLOG_HDRLEN;
if_attach(ifp);
#ifndef __FreeBSD__
if_alloc_sadl(ifp);
#endif
#if NBPFILTER > 0
#ifdef __FreeBSD__
bpfattach(ifp, DLT_PFLOG, PFLOG_HDRLEN);
#else
bpfattach(&pflogif->sc_if.if_bpf, ifp, DLT_PFLOG, PFLOG_HDRLEN);
#endif
#endif
s = splnet();
#ifdef __FreeBSD__
/* XXX: Why pf(4) lock?! Better add a pflog lock?! */
PF_LOCK();
#endif
LIST_INSERT_HEAD(&pflogif_list, pflogif, sc_list);
pflogifs[unit] = ifp;
#ifdef __FreeBSD__
PF_UNLOCK();
#endif
splx(s);
return (0);
}
示例14: alloc
void *
alloc(size_t size)
{
struct ml *f, *bestf;
#ifndef ALLOC_FIRST_FIT
unsigned bestsize = 0xffffffff; /* greater than any real size */
#endif
char *help;
int failed;
#ifdef ALLOC_TRACE
printf("alloc(%zu)", size);
#endif
/*
* Account for overhead now, so that we don't get an
* "exact fit" which doesn't have enough space.
*/
size = ALIGN(size) + OVERHEAD;
#ifdef ALLOC_FIRST_FIT
/* scan freelist */
for (f = freelist.lh_first; f != NULL && (size_t)f->size < size;
f = f->list.le_next)
/* noop */ ;
bestf = f;
failed = (bestf == NULL);
#else
/* scan freelist */
bestf = NULL; /* XXXGCC: -Wuninitialized */
f = freelist.lh_first;
while (f != NULL) {
if ((size_t)f->size >= size) {
if ((size_t)f->size == size) /* exact match */
goto found;
if (f->size < bestsize) {
/* keep best fit */
bestf = f;
bestsize = f->size;
}
}
f = f->list.le_next;
}
/* no match in freelist if bestsize unchanged */
failed = (bestsize == 0xffffffff);
#endif
if (failed) { /* nothing found */
/*
* Allocate memory from the OpenFirmware, rounded
* to page size, and record the chunk size.
*/
size = roundup(size, NBPG);
help = OF_claim(NULL, (unsigned)size, NBPG);
if (help == (char *)-1)
panic("alloc: out of memory");
f = (struct ml *)help;
f->size = (unsigned)size;
#ifdef ALLOC_TRACE
printf("=%lx (new chunk size %u)\n",
(u_long)(help + OVERHEAD), f->size);
#endif
goto out;
}
/* we take the best fit */
f = bestf;
#ifndef ALLOC_FIRST_FIT
found:
#endif
/* remove from freelist */
LIST_REMOVE(f, list);
help = (char *)f;
#ifdef ALLOC_TRACE
printf("=%lx (origsize %u)\n", (u_long)(help + OVERHEAD), f->size);
#endif
out:
/* place on allocated list */
LIST_INSERT_HEAD(&allocatedlist, f, list);
return (help + OVERHEAD);
}
示例15: pthread_create
int
pthread_create(pthread_t *threadp, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg)
{
pthread_t thread;
pid_t tid;
int rc = 0;
if (!_threads_ready)
if ((rc = _rthread_init()))
return (rc);
thread = malloc(sizeof(*thread));
if (!thread)
return (errno);
memset(thread, 0, sizeof(*thread));
thread->donesem.lock = _SPINLOCK_UNLOCKED;
thread->flags_lock = _SPINLOCK_UNLOCKED;
thread->fn = start_routine;
thread->arg = arg;
if (attr)
thread->attr = *(*attr);
else {
thread->attr.stack_size = RTHREAD_STACK_SIZE_DEF;
thread->attr.guard_size = sysconf(_SC_PAGESIZE);
thread->attr.stack_size -= thread->attr.guard_size;
}
if (thread->attr.detach_state == PTHREAD_CREATE_DETACHED)
thread->flags |= THREAD_DETACHED;
_spinlock(&_thread_lock);
thread->stack = _rthread_alloc_stack(thread);
if (!thread->stack) {
rc = errno;
goto fail1;
}
LIST_INSERT_HEAD(&_thread_list, thread, threads);
tid = rfork_thread(RFPROC | RFTHREAD | RFMEM | RFNOWAIT,
thread->stack->sp, _rthread_start, thread);
if (tid == -1) {
rc = errno;
goto fail2;
}
/* new thread will appear _rthread_start */
thread->tid = tid;
thread->flags |= THREAD_CANCEL_ENABLE|THREAD_CANCEL_DEFERRED;
*threadp = thread;
/*
* Since _rthread_start() aquires the thread lock and due to the way
* signal delivery is implemented, this is not a race.
*/
if (thread->attr.create_suspended)
kill(thread->tid, SIGSTOP);
_spinunlock(&_thread_lock);
return (0);
fail2:
_rthread_free_stack(thread->stack);
LIST_REMOVE(thread, threads);
fail1:
_spinunlock(&_thread_lock);
_rthread_free(thread);
return (rc);
}