Changeset 14964 in vbox for trunk/src/VBox/Devices/Network/slirp/mbuf.c
- Timestamp:
- Dec 3, 2008 9:34:37 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 40325
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/slirp/mbuf.c
r14470 r14964 22 22 m_init(PNATState pData) 23 23 { 24 25 26 27 24 m_freelist.m_next = m_freelist.m_prev = &m_freelist; 25 m_usedlist.m_next = m_usedlist.m_prev = &m_usedlist; 26 mbuf_alloced = 0; 27 msize_init(pData); 28 28 } 29 29 … … 31 31 msize_init(PNATState pData) 32 32 { 33 34 35 36 37 msize = (if_mtu>if_mru?if_mtu:if_mru) +38 33 /* 34 * Find a nice value for msize 35 * XXX if_maxlinkhdr already in mtu 36 */ 37 msize = (if_mtu>if_mru ? if_mtu : if_mru) 38 + if_maxlinkhdr + sizeof(struct m_hdr ) + 6; 39 39 } 40 40 … … 50 50 m_get(PNATState pData) 51 51 { 52 register struct mbuf *m; 53 int flags = 0; 54 55 DEBUG_CALL("m_get"); 56 57 if (m_freelist.m_next == &m_freelist) { 58 m = (struct mbuf *)malloc(msize); 59 if (m == NULL) goto end_error; 60 mbuf_alloced++; 61 if (mbuf_alloced > mbuf_thresh) 62 flags = M_DOFREE; 63 if (mbuf_alloced > mbuf_max) 64 mbuf_max = mbuf_alloced; 65 } else { 66 m = m_freelist.m_next; 67 remque(pData, m); 68 } 69 70 /* Insert it in the used list */ 71 insque(pData, m,&m_usedlist); 72 m->m_flags = (flags | M_USEDLIST); 73 74 /* Initialise it */ 75 m->m_size = msize - sizeof(struct m_hdr); 76 m->m_data = m->m_dat; 77 m->m_len = 0; 78 m->m_nextpkt = 0; 79 m->m_prevpkt = 0; 52 register struct mbuf *m; 53 int flags = 0; 54 55 DEBUG_CALL("m_get"); 56 57 if (m_freelist.m_next == &m_freelist) 58 { 59 m = (struct mbuf *)malloc(msize); 60 if (m == NULL) goto 61 end_error; 62 mbuf_alloced++; 63 if (mbuf_alloced > mbuf_thresh) 64 flags = M_DOFREE; 65 if (mbuf_alloced > mbuf_max) 66 mbuf_max = mbuf_alloced; 67 } 68 else 69 { 70 m = m_freelist.m_next; 71 remque(pData, m); 72 } 73 74 /* Insert it in the used list */ 75 insque(pData, m, &m_usedlist); 76 m->m_flags = (flags | M_USEDLIST); 77 78 /* Initialise it */ 79 m->m_size = msize - sizeof(struct m_hdr); 80 m->m_data = m->m_dat; 81 m->m_len = 0; 82 m->m_nextpkt = 0; 83 m->m_prevpkt = 0; 84 80 85 end_error: 81 82 86 DEBUG_ARG("m = %lx", (long )m); 87 return m; 83 88 } 84 89 … … 87 92 { 88 93 89 DEBUG_CALL("m_free"); 90 DEBUG_ARG("m = %lx", (long )m); 91 92 if(m) { 94 DEBUG_CALL("m_free"); 95 DEBUG_ARG("m = %lx", (long )m); 96 97 if(m) 98 { 93 99 /* Remove from m_usedlist */ 94 100 if (m->m_flags & M_USEDLIST) 95 remque(pData, m);101 remque(pData, m); 96 102 97 103 /* If it's M_EXT, free() it */ 98 104 if (m->m_flags & M_EXT) 99 free(m->m_ext);105 free(m->m_ext); 100 106 101 107 /* 102 108 * Either free() it or put it on the free list 103 109 */ 104 if (m->m_flags & M_DOFREE) { 105 u32ptr_done(pData, ptr_to_u32(pData, m), m); 106 free(m); 107 mbuf_alloced--; 108 } else if ((m->m_flags & M_FREELIST) == 0) { 109 insque(pData, m,&m_freelist); 110 m->m_flags = M_FREELIST; /* Clobber other flags */ 111 } 112 } /* if(m) */ 110 if (m->m_flags & M_DOFREE) 111 { 112 u32ptr_done(pData, ptr_to_u32(pData, m), m); 113 free(m); 114 mbuf_alloced--; 115 } 116 else if ((m->m_flags & M_FREELIST) == 0) 117 { 118 insque(pData, m,&m_freelist); 119 m->m_flags = M_FREELIST; /* Clobber other flags */ 120 } 121 } /* if(m) */ 113 122 } 114 123 … … 121 130 m_cat(PNATState pData, register struct mbuf *m, register struct mbuf *n) 122 131 { 123 124 125 126 127 128 129 130 131 132 132 /* 133 * If there's no room, realloc 134 */ 135 if (M_FREEROOM(m) < n->m_len) 136 m_inc(m,m->m_size+MINCSIZE); 137 138 memcpy(m->m_data+m->m_len, n->m_data, n->m_len); 139 m->m_len += n->m_len; 140 141 m_free(pData, n); 133 142 } 134 143 … … 136 145 /* make m size bytes large */ 137 146 void 138 m_inc(m, size) 139 struct mbuf *m; 140 int size; 141 { 142 int datasize; 143 144 /* some compiles throw up on gotos. This one we can fake. */ 145 if(m->m_size>size) return; 146 147 if (m->m_flags & M_EXT) { 148 datasize = m->m_data - m->m_ext; 149 m->m_ext = (char *)realloc(m->m_ext,size); 150 /* if (m->m_ext == NULL) 151 * return (struct mbuf *)NULL; 152 */ 153 m->m_data = m->m_ext + datasize; 154 } else { 155 char *dat; 156 datasize = m->m_data - m->m_dat; 157 dat = (char *)malloc(size); 158 /* if (dat == NULL) 159 * return (struct mbuf *)NULL; 160 */ 161 memcpy(dat, m->m_dat, m->m_size); 162 163 m->m_ext = dat; 164 m->m_data = m->m_ext + datasize; 165 m->m_flags |= M_EXT; 166 } 167 168 m->m_size = size; 169 170 } 171 172 173 174 void 175 m_adj(m, len) 176 struct mbuf *m; 177 int len; 178 { 179 if (m == NULL) 180 return; 181 if (len >= 0) { 182 /* Trim from head */ 183 m->m_data += len; 184 m->m_len -= len; 185 } else { 186 /* Trim from tail */ 187 len = -len; 188 m->m_len -= len; 189 } 147 m_inc(struct mbuf *m, int size) 148 { 149 int datasize; 150 151 /* some compiles throw up on gotos. This one we can fake. */ 152 if (m->m_size>size) 153 return; 154 155 if (m->m_flags & M_EXT) 156 { 157 datasize = m->m_data - m->m_ext; 158 m->m_ext = (char *)realloc(m->m_ext,size); 159 #if 0 160 if (m->m_ext == NULL) 161 return (struct mbuf *)NULL; 162 #endif 163 m->m_data = m->m_ext + datasize; 164 } 165 else 166 { 167 char *dat; 168 datasize = m->m_data - m->m_dat; 169 dat = (char *)malloc(size); 170 #if 0 171 if (dat == NULL) 172 return (struct mbuf *)NULL; 173 #endif 174 memcpy(dat, m->m_dat, m->m_size); 175 176 m->m_ext = dat; 177 m->m_data = m->m_ext + datasize; 178 m->m_flags |= M_EXT; 179 } 180 181 m->m_size = size; 182 } 183 184 185 void 186 m_adj(struct mbuf *m, int len) 187 { 188 if (m == NULL) 189 return; 190 if (len >= 0) 191 { 192 /* Trim from head */ 193 m->m_data += len; 194 m->m_len -= len; 195 } 196 else 197 { 198 /* Trim from tail */ 199 len = -len; 200 m->m_len -= len; 201 } 190 202 } 191 203 … … 195 207 */ 196 208 int 197 m_copy(n, m, off, len) 198 struct mbuf *n, *m; 199 int off, len; 200 { 201 if (len > M_FREEROOM(n)) 202 return -1; 203 204 memcpy((n->m_data + n->m_len), (m->m_data + off), len); 205 n->m_len += len; 206 return 0; 209 m_copy(struct mbuf *n, struct mbuf *m, int off, int len) 210 { 211 if (len > M_FREEROOM(n)) 212 return -1; 213 214 memcpy((n->m_data + n->m_len), (m->m_data + off), len); 215 n->m_len += len; 216 return 0; 207 217 } 208 218 … … 216 226 dtom(PNATState pData, void *dat) 217 227 { 218 struct mbuf *m; 219 220 DEBUG_CALL("dtom"); 221 DEBUG_ARG("dat = %lx", (long )dat); 222 223 /* bug corrected for M_EXT buffers */ 224 for (m = m_usedlist.m_next; m != &m_usedlist; m = m->m_next) { 225 if (m->m_flags & M_EXT) { 226 if( (char *)dat>=m->m_ext && (char *)dat<(m->m_ext + m->m_size) ) 227 return m; 228 } else { 229 if( (char *)dat >= m->m_dat && (char *)dat<(m->m_dat + m->m_size) ) 230 return m; 231 } 232 } 233 234 DEBUG_ERROR((dfd, "dtom failed")); 235 236 return (struct mbuf *)0; 237 } 238 228 struct mbuf *m; 229 230 DEBUG_CALL("dtom"); 231 DEBUG_ARG("dat = %lx", (long )dat); 232 233 /* bug corrected for M_EXT buffers */ 234 for (m = m_usedlist.m_next; m != &m_usedlist; m = m->m_next) 235 { 236 if (m->m_flags & M_EXT) 237 { 238 if ( (char *)dat >= m->m_ext 239 && (char *)dat < (m->m_ext + m->m_size)) 240 return m; 241 } 242 else 243 { 244 if ( (char *)dat >= m->m_dat 245 && (char *)dat < (m->m_dat + m->m_size)) 246 return m; 247 } 248 } 249 250 DEBUG_ERROR((dfd, "dtom failed")); 251 252 return (struct mbuf *)0; 253 }
Note:
See TracChangeset
for help on using the changeset viewer.