netmap_freebsd.c (f9790aeb8869bfcedf111517bace712b390e6cc5) | netmap_freebsd.c (17885a7bfde9d164e45a9833bb172215c55739f9) |
---|---|
1/* | 1/* |
2 * Copyright (C) 2013 Universita` di Pisa. All rights reserved. | 2 * Copyright (C) 2013-2014 Universita` di Pisa. All rights reserved. |
3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the --- 70 unchanged lines hidden (view full) --- 81 } 82 ifp->if_input = gna->save_if_input; 83 gna->save_if_input = NULL; 84 } 85 86 return 0; 87} 88 | 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the --- 70 unchanged lines hidden (view full) --- 81 } 82 ifp->if_input = gna->save_if_input; 83 gna->save_if_input = NULL; 84 } 85 86 return 0; 87} 88 |
89 |
|
89/* 90 * Intercept the packet steering routine in the tx path, 91 * so that we can decide which queue is used for an mbuf. 92 * Second argument is non-zero to intercept, 0 to restore. 93 * | 90/* 91 * Intercept the packet steering routine in the tx path, 92 * so that we can decide which queue is used for an mbuf. 93 * Second argument is non-zero to intercept, 0 to restore. 94 * |
95 * actually we also need to redirect the if_transmit ? 96 * |
|
94 * XXX see if FreeBSD has such a mechanism 95 */ 96void | 97 * XXX see if FreeBSD has such a mechanism 98 */ 99void |
97netmap_catch_packet_steering(struct netmap_generic_adapter *na, int enable) | 100netmap_catch_tx(struct netmap_generic_adapter *gna, int enable) |
98{ | 101{ |
102 struct netmap_adapter *na = &gna->up.up; 103 struct ifnet *ifp = na->ifp; 104 |
|
99 if (enable) { | 105 if (enable) { |
106 na->if_transmit = ifp->if_transmit; 107 ifp->if_transmit = netmap_transmit; |
|
100 } else { | 108 } else { |
109 ifp->if_transmit = na->if_transmit; |
|
101 } 102} 103 | 110 } 111} 112 |
113 |
|
104/* Transmit routine used by generic_netmap_txsync(). Returns 0 on success 105 * and non-zero on error (which may be packet drops or other errors). 106 * addr and len identify the netmap buffer, m is the (preallocated) 107 * mbuf to use for transmissions. 108 * 109 * We should add a reference to the mbuf so the m_freem() at the end 110 * of the transmission does not consume resources. 111 * --- 9 unchanged lines hidden (view full) --- 121 void *addr, u_int len, u_int ring_nr) 122{ 123 int ret; 124 125 m->m_len = m->m_pkthdr.len = 0; 126 127 // copy data to the mbuf 128 m_copyback(m, 0, len, addr); | 114/* Transmit routine used by generic_netmap_txsync(). Returns 0 on success 115 * and non-zero on error (which may be packet drops or other errors). 116 * addr and len identify the netmap buffer, m is the (preallocated) 117 * mbuf to use for transmissions. 118 * 119 * We should add a reference to the mbuf so the m_freem() at the end 120 * of the transmission does not consume resources. 121 * --- 9 unchanged lines hidden (view full) --- 131 void *addr, u_int len, u_int ring_nr) 132{ 133 int ret; 134 135 m->m_len = m->m_pkthdr.len = 0; 136 137 // copy data to the mbuf 138 m_copyback(m, 0, len, addr); |
129 | |
130 // inc refcount. We are alone, so we can skip the atomic 131 atomic_fetchadd_int(m->m_ext.ref_cnt, 1); 132 m->m_flags |= M_FLOWID; 133 m->m_pkthdr.flowid = ring_nr; 134 m->m_pkthdr.rcvif = ifp; /* used for tx notification */ | 139 // inc refcount. We are alone, so we can skip the atomic 140 atomic_fetchadd_int(m->m_ext.ref_cnt, 1); 141 m->m_flags |= M_FLOWID; 142 m->m_pkthdr.flowid = ring_nr; 143 m->m_pkthdr.rcvif = ifp; /* used for tx notification */ |
135 ret = ifp->if_transmit(ifp, m); | 144 ret = NA(ifp)->if_transmit(ifp, m); |
136 return ret; 137} 138 | 145 return ret; 146} 147 |
148 |
|
139/* 140 * The following two functions are empty until we have a generic 141 * way to extract the info from the ifp 142 */ 143int 144generic_find_num_desc(struct ifnet *ifp, unsigned int *tx, unsigned int *rx) 145{ 146 D("called"); 147 return 0; 148} 149 | 149/* 150 * The following two functions are empty until we have a generic 151 * way to extract the info from the ifp 152 */ 153int 154generic_find_num_desc(struct ifnet *ifp, unsigned int *tx, unsigned int *rx) 155{ 156 D("called"); 157 return 0; 158} 159 |
160 |
|
150void 151generic_find_num_queues(struct ifnet *ifp, u_int *txq, u_int *rxq) 152{ 153 D("called"); 154 *txq = 1; 155 *rxq = 1; 156} 157 | 161void 162generic_find_num_queues(struct ifnet *ifp, u_int *txq, u_int *rxq) 163{ 164 D("called"); 165 *txq = 1; 166 *rxq = 1; 167} 168 |
169 |
|
158void netmap_mitigation_init(struct netmap_generic_adapter *na) 159{ 160 ND("called"); 161 na->mit_pending = 0; 162} 163 164 165void netmap_mitigation_start(struct netmap_generic_adapter *na) 166{ 167 ND("called"); 168} 169 | 170void netmap_mitigation_init(struct netmap_generic_adapter *na) 171{ 172 ND("called"); 173 na->mit_pending = 0; 174} 175 176 177void netmap_mitigation_start(struct netmap_generic_adapter *na) 178{ 179 ND("called"); 180} 181 |
182 |
|
170void netmap_mitigation_restart(struct netmap_generic_adapter *na) 171{ 172 ND("called"); 173} 174 | 183void netmap_mitigation_restart(struct netmap_generic_adapter *na) 184{ 185 ND("called"); 186} 187 |
188 |
|
175int netmap_mitigation_active(struct netmap_generic_adapter *na) 176{ 177 ND("called"); 178 return 0; 179} 180 | 189int netmap_mitigation_active(struct netmap_generic_adapter *na) 190{ 191 ND("called"); 192 return 0; 193} 194 |
195 |
|
181void netmap_mitigation_cleanup(struct netmap_generic_adapter *na) 182{ 183 ND("called"); 184} 185 | 196void netmap_mitigation_cleanup(struct netmap_generic_adapter *na) 197{ 198 ND("called"); 199} 200 |
201 |
|
186/* 187 * In order to track whether pages are still mapped, we hook into 188 * the standard cdev_pager and intercept the constructor and 189 * destructor. 190 */ 191 192struct netmap_vm_handle_t { 193 struct cdev *dev; 194 struct netmap_priv_d *priv; 195}; 196 | 202/* 203 * In order to track whether pages are still mapped, we hook into 204 * the standard cdev_pager and intercept the constructor and 205 * destructor. 206 */ 207 208struct netmap_vm_handle_t { 209 struct cdev *dev; 210 struct netmap_priv_d *priv; 211}; 212 |
213 |
|
197static int 198netmap_dev_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot, 199 vm_ooffset_t foff, struct ucred *cred, u_short *color) 200{ 201 struct netmap_vm_handle_t *vmh = handle; 202 D("handle %p size %jd prot %d foff %jd", 203 handle, (intmax_t)size, prot, (intmax_t)foff); 204 dev_ref(vmh->dev); --- 8 unchanged lines hidden (view full) --- 213 struct cdev *dev = vmh->dev; 214 struct netmap_priv_d *priv = vmh->priv; 215 D("handle %p", handle); 216 netmap_dtor(priv); 217 free(vmh, M_DEVBUF); 218 dev_rel(dev); 219} 220 | 214static int 215netmap_dev_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot, 216 vm_ooffset_t foff, struct ucred *cred, u_short *color) 217{ 218 struct netmap_vm_handle_t *vmh = handle; 219 D("handle %p size %jd prot %d foff %jd", 220 handle, (intmax_t)size, prot, (intmax_t)foff); 221 dev_ref(vmh->dev); --- 8 unchanged lines hidden (view full) --- 230 struct cdev *dev = vmh->dev; 231 struct netmap_priv_d *priv = vmh->priv; 232 D("handle %p", handle); 233 netmap_dtor(priv); 234 free(vmh, M_DEVBUF); 235 dev_rel(dev); 236} 237 |
238 |
|
221static int 222netmap_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, 223 int prot, vm_page_t *mres) 224{ 225 struct netmap_vm_handle_t *vmh = object->handle; 226 struct netmap_priv_d *priv = vmh->priv; 227 vm_paddr_t paddr; 228 vm_page_t page; --- 182 unchanged lines hidden --- | 239static int 240netmap_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, 241 int prot, vm_page_t *mres) 242{ 243 struct netmap_vm_handle_t *vmh = object->handle; 244 struct netmap_priv_d *priv = vmh->priv; 245 vm_paddr_t paddr; 246 vm_page_t page; --- 182 unchanged lines hidden --- |