Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/netmap/netmap_freebsd.c
Show First 20 Lines • Show All 264 Lines • ▼ Show 20 Lines | |||||
void * | void * | ||||
nm_os_send_up(struct ifnet *ifp, struct mbuf *m, struct mbuf *prev) | nm_os_send_up(struct ifnet *ifp, struct mbuf *m, struct mbuf *prev) | ||||
{ | { | ||||
NA(ifp)->if_input(ifp, m); | NA(ifp)->if_input(ifp, m); | ||||
return NULL; | return NULL; | ||||
} | } | ||||
int | int | ||||
nm_os_mbuf_has_offld(struct mbuf *m) | nm_os_mbuf_has_csum_offld(struct mbuf *m) | ||||
{ | { | ||||
return m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP | CSUM_SCTP | | return m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP | CSUM_SCTP | | ||||
CSUM_TCP_IPV6 | CSUM_UDP_IPV6 | | CSUM_TCP_IPV6 | CSUM_UDP_IPV6 | | ||||
CSUM_SCTP_IPV6 | CSUM_TSO); | CSUM_SCTP_IPV6); | ||||
} | } | ||||
int | |||||
nm_os_mbuf_has_seg_offld(struct mbuf *m) | |||||
{ | |||||
return m->m_pkthdr.csum_flags & CSUM_TSO; | |||||
} | |||||
static void | static void | ||||
freebsd_generic_rx_handler(struct ifnet *ifp, struct mbuf *m) | freebsd_generic_rx_handler(struct ifnet *ifp, struct mbuf *m) | ||||
{ | { | ||||
int stolen; | int stolen; | ||||
if (!NM_NA_VALID(ifp)) { | if (!NM_NA_VALID(ifp)) { | ||||
RD(1, "Warning: got RX packet for invalid emulated adapter"); | RD(1, "Warning: got RX packet for invalid emulated adapter"); | ||||
return; | return; | ||||
▲ Show 20 Lines • Show All 339 Lines • ▼ Show 20 Lines | struct nm_os_extmem { | ||||
vm_offset_t kva; | vm_offset_t kva; | ||||
vm_offset_t size; | vm_offset_t size; | ||||
uintptr_t scan; | uintptr_t scan; | ||||
}; | }; | ||||
void | void | ||||
nm_os_extmem_delete(struct nm_os_extmem *e) | nm_os_extmem_delete(struct nm_os_extmem *e) | ||||
{ | { | ||||
D("freeing %jx bytes", (uintmax_t)e->size); | D("freeing %zx bytes", (size_t)e->size); | ||||
vm_map_remove(kernel_map, e->kva, e->kva + e->size); | vm_map_remove(kernel_map, e->kva, e->kva + e->size); | ||||
nm_os_free(e); | nm_os_free(e); | ||||
} | } | ||||
char * | char * | ||||
nm_os_extmem_nextpage(struct nm_os_extmem *e) | nm_os_extmem_nextpage(struct nm_os_extmem *e) | ||||
{ | { | ||||
char *rv = NULL; | char *rv = NULL; | ||||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | nm_os_extmem_create(unsigned long p, struct nmreq_pools_info *pi, int *perror) | ||||
* are mmap()ing it all exit | * are mmap()ing it all exit | ||||
*/ | */ | ||||
e->kva = vm_map_min(kernel_map); | e->kva = vm_map_min(kernel_map); | ||||
e->size = obj->size << PAGE_SHIFT; | e->size = obj->size << PAGE_SHIFT; | ||||
rv = vm_map_find(kernel_map, obj, 0, &e->kva, e->size, 0, | rv = vm_map_find(kernel_map, obj, 0, &e->kva, e->size, 0, | ||||
VMFS_OPTIMAL_SPACE, VM_PROT_READ | VM_PROT_WRITE, | VMFS_OPTIMAL_SPACE, VM_PROT_READ | VM_PROT_WRITE, | ||||
VM_PROT_READ | VM_PROT_WRITE, 0); | VM_PROT_READ | VM_PROT_WRITE, 0); | ||||
if (rv != KERN_SUCCESS) { | if (rv != KERN_SUCCESS) { | ||||
D("vm_map_find(%jx) failed", (uintmax_t)e->size); | D("vm_map_find(%zx) failed", (size_t)e->size); | ||||
goto out_rel; | goto out_rel; | ||||
} | } | ||||
rv = vm_map_wire(kernel_map, e->kva, e->kva + e->size, | rv = vm_map_wire(kernel_map, e->kva, e->kva + e->size, | ||||
VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES); | VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES); | ||||
if (rv != KERN_SUCCESS) { | if (rv != KERN_SUCCESS) { | ||||
D("vm_map_wire failed"); | D("vm_map_wire failed"); | ||||
goto out_rem; | goto out_rem; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 820 Lines • ▼ Show 20 Lines | if (error == ENOENT) | ||||
error = ENXIO; | error = ENXIO; | ||||
goto out; | goto out; | ||||
} | } | ||||
error = netmap_ioctl(priv, cmd, data, td, /*nr_body_is_user=*/1); | error = netmap_ioctl(priv, cmd, data, td, /*nr_body_is_user=*/1); | ||||
out: | out: | ||||
CURVNET_RESTORE(); | CURVNET_RESTORE(); | ||||
return error; | return error; | ||||
} | |||||
void | |||||
nm_os_onattach(struct ifnet *ifp) | |||||
{ | |||||
} | |||||
void | |||||
nm_os_onenter(struct ifnet *ifp) | |||||
{ | |||||
struct netmap_adapter *na = NA(ifp); | |||||
na->if_transmit = ifp->if_transmit; | |||||
ifp->if_transmit = netmap_transmit; | |||||
ifp->if_capenable |= IFCAP_NETMAP; | |||||
} | |||||
void | |||||
nm_os_onexit(struct ifnet *ifp) | |||||
{ | |||||
struct netmap_adapter *na = NA(ifp); | |||||
ifp->if_transmit = na->if_transmit; | |||||
ifp->if_capenable &= ~IFCAP_NETMAP; | |||||
} | } | ||||
extern struct cdevsw netmap_cdevsw; /* XXX used in netmap.c, should go elsewhere */ | extern struct cdevsw netmap_cdevsw; /* XXX used in netmap.c, should go elsewhere */ | ||||
struct cdevsw netmap_cdevsw = { | struct cdevsw netmap_cdevsw = { | ||||
.d_version = D_VERSION, | .d_version = D_VERSION, | ||||
.d_name = "netmap", | .d_name = "netmap", | ||||
.d_open = netmap_open, | .d_open = netmap_open, | ||||
.d_mmap_single = netmap_mmap_single, | .d_mmap_single = netmap_mmap_single, | ||||
▲ Show 20 Lines • Show All 67 Lines • Show Last 20 Lines |