altq_priq.c (416ba5c74546f32a993436a99516d35008e9f384) altq_priq.c (0a70aaf8f5d93454d0940a09b94deecd7aa5fa0d)
1/*-
2 * Copyright (C) 2000-2003
3 * Sony Computer Science Laboratories Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 276 unchanged lines hidden (view full) ---

285#ifndef ALTQ_RED
286 if (flags & PRCF_RED) {
287#ifdef ALTQ_DEBUG
288 printf("priq_class_create: RED not configured for PRIQ!\n");
289#endif
290 return (NULL);
291 }
292#endif
1/*-
2 * Copyright (C) 2000-2003
3 * Sony Computer Science Laboratories Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 276 unchanged lines hidden (view full) ---

285#ifndef ALTQ_RED
286 if (flags & PRCF_RED) {
287#ifdef ALTQ_DEBUG
288 printf("priq_class_create: RED not configured for PRIQ!\n");
289#endif
290 return (NULL);
291 }
292#endif
293#ifndef ALTQ_CODEL
294 if (flags & PRCF_CODEL) {
295#ifdef ALTQ_DEBUG
296 printf("priq_class_create: CODEL not configured for PRIQ!\n");
297#endif
298 return (NULL);
299 }
300#endif
293
294 if ((cl = pif->pif_classes[pri]) != NULL) {
295 /* modify the class instead of creating a new one */
296 s = splnet();
297 IFQ_LOCK(cl->cl_pif->pif_ifq);
298 if (!qempty(cl->cl_q))
299 priq_purgeq(cl);
300 IFQ_UNLOCK(cl->cl_pif->pif_ifq);
301 splx(s);
302#ifdef ALTQ_RIO
303 if (q_is_rio(cl->cl_q))
304 rio_destroy((rio_t *)cl->cl_red);
305#endif
306#ifdef ALTQ_RED
307 if (q_is_red(cl->cl_q))
308 red_destroy(cl->cl_red);
309#endif
301
302 if ((cl = pif->pif_classes[pri]) != NULL) {
303 /* modify the class instead of creating a new one */
304 s = splnet();
305 IFQ_LOCK(cl->cl_pif->pif_ifq);
306 if (!qempty(cl->cl_q))
307 priq_purgeq(cl);
308 IFQ_UNLOCK(cl->cl_pif->pif_ifq);
309 splx(s);
310#ifdef ALTQ_RIO
311 if (q_is_rio(cl->cl_q))
312 rio_destroy((rio_t *)cl->cl_red);
313#endif
314#ifdef ALTQ_RED
315 if (q_is_red(cl->cl_q))
316 red_destroy(cl->cl_red);
317#endif
318#ifdef ALTQ_CODEL
319 if (q_is_codel(cl->cl_q))
320 codel_destroy(cl->cl_codel);
321#endif
310 } else {
311 cl = malloc(sizeof(struct priq_class), M_DEVBUF,
312 M_NOWAIT | M_ZERO);
313 if (cl == NULL)
314 return (NULL);
315
316 cl->cl_q = malloc(sizeof(class_queue_t), M_DEVBUF,
317 M_NOWAIT | M_ZERO);

--- 4 unchanged lines hidden (view full) ---

322 pif->pif_classes[pri] = cl;
323 if (flags & PRCF_DEFAULTCLASS)
324 pif->pif_default = cl;
325 if (qlimit == 0)
326 qlimit = 50; /* use default */
327 qlimit(cl->cl_q) = qlimit;
328 qtype(cl->cl_q) = Q_DROPTAIL;
329 qlen(cl->cl_q) = 0;
322 } else {
323 cl = malloc(sizeof(struct priq_class), M_DEVBUF,
324 M_NOWAIT | M_ZERO);
325 if (cl == NULL)
326 return (NULL);
327
328 cl->cl_q = malloc(sizeof(class_queue_t), M_DEVBUF,
329 M_NOWAIT | M_ZERO);

--- 4 unchanged lines hidden (view full) ---

334 pif->pif_classes[pri] = cl;
335 if (flags & PRCF_DEFAULTCLASS)
336 pif->pif_default = cl;
337 if (qlimit == 0)
338 qlimit = 50; /* use default */
339 qlimit(cl->cl_q) = qlimit;
340 qtype(cl->cl_q) = Q_DROPTAIL;
341 qlen(cl->cl_q) = 0;
342 qsize(cl->cl_q) = 0;
330 cl->cl_flags = flags;
331 cl->cl_pri = pri;
332 if (pri > pif->pif_maxpri)
333 pif->pif_maxpri = pri;
334 cl->cl_pif = pif;
335 cl->cl_handle = qid;
336
337#ifdef ALTQ_RED

--- 27 unchanged lines hidden (view full) ---

365 qlimit(cl->cl_q) * 30/100,
366 red_flags, red_pkttime);
367 if (cl->cl_red == NULL)
368 goto err_ret;
369 qtype(cl->cl_q) = Q_RED;
370 }
371 }
372#endif /* ALTQ_RED */
343 cl->cl_flags = flags;
344 cl->cl_pri = pri;
345 if (pri > pif->pif_maxpri)
346 pif->pif_maxpri = pri;
347 cl->cl_pif = pif;
348 cl->cl_handle = qid;
349
350#ifdef ALTQ_RED

--- 27 unchanged lines hidden (view full) ---

378 qlimit(cl->cl_q) * 30/100,
379 red_flags, red_pkttime);
380 if (cl->cl_red == NULL)
381 goto err_ret;
382 qtype(cl->cl_q) = Q_RED;
383 }
384 }
385#endif /* ALTQ_RED */
386#ifdef ALTQ_CODEL
387 if (flags & PRCF_CODEL) {
388 cl->cl_codel = codel_alloc(5, 100, 0);
389 if (cl->cl_codel != NULL)
390 qtype(cl->cl_q) = Q_CODEL;
391 }
392#endif
373
374 return (cl);
375
376 err_ret:
377 if (cl->cl_red != NULL) {
378#ifdef ALTQ_RIO
379 if (q_is_rio(cl->cl_q))
380 rio_destroy((rio_t *)cl->cl_red);
381#endif
382#ifdef ALTQ_RED
383 if (q_is_red(cl->cl_q))
384 red_destroy(cl->cl_red);
385#endif
393
394 return (cl);
395
396 err_ret:
397 if (cl->cl_red != NULL) {
398#ifdef ALTQ_RIO
399 if (q_is_rio(cl->cl_q))
400 rio_destroy((rio_t *)cl->cl_red);
401#endif
402#ifdef ALTQ_RED
403 if (q_is_red(cl->cl_q))
404 red_destroy(cl->cl_red);
405#endif
406#ifdef ALTQ_CODEL
407 if (q_is_codel(cl->cl_q))
408 codel_destroy(cl->cl_codel);
409#endif
386 }
387 if (cl->cl_q != NULL)
388 free(cl->cl_q, M_DEVBUF);
389 free(cl, M_DEVBUF);
390 return (NULL);
391}
392
393static int

--- 31 unchanged lines hidden (view full) ---

425#ifdef ALTQ_RIO
426 if (q_is_rio(cl->cl_q))
427 rio_destroy((rio_t *)cl->cl_red);
428#endif
429#ifdef ALTQ_RED
430 if (q_is_red(cl->cl_q))
431 red_destroy(cl->cl_red);
432#endif
410 }
411 if (cl->cl_q != NULL)
412 free(cl->cl_q, M_DEVBUF);
413 free(cl, M_DEVBUF);
414 return (NULL);
415}
416
417static int

--- 31 unchanged lines hidden (view full) ---

449#ifdef ALTQ_RIO
450 if (q_is_rio(cl->cl_q))
451 rio_destroy((rio_t *)cl->cl_red);
452#endif
453#ifdef ALTQ_RED
454 if (q_is_red(cl->cl_q))
455 red_destroy(cl->cl_red);
456#endif
457#ifdef ALTQ_CODEL
458 if (q_is_codel(cl->cl_q))
459 codel_destroy(cl->cl_codel);
460#endif
433 }
434 free(cl->cl_q, M_DEVBUF);
435 free(cl, M_DEVBUF);
436 return (0);
437}
438
439/*
440 * priq_enqueue is an enqueue function to be registered to

--- 99 unchanged lines hidden (view full) ---

540 if (q_is_rio(cl->cl_q))
541 return rio_addq((rio_t *)cl->cl_red, cl->cl_q, m,
542 cl->cl_pktattr);
543#endif
544#ifdef ALTQ_RED
545 if (q_is_red(cl->cl_q))
546 return red_addq(cl->cl_red, cl->cl_q, m, cl->cl_pktattr);
547#endif
461 }
462 free(cl->cl_q, M_DEVBUF);
463 free(cl, M_DEVBUF);
464 return (0);
465}
466
467/*
468 * priq_enqueue is an enqueue function to be registered to

--- 99 unchanged lines hidden (view full) ---

568 if (q_is_rio(cl->cl_q))
569 return rio_addq((rio_t *)cl->cl_red, cl->cl_q, m,
570 cl->cl_pktattr);
571#endif
572#ifdef ALTQ_RED
573 if (q_is_red(cl->cl_q))
574 return red_addq(cl->cl_red, cl->cl_q, m, cl->cl_pktattr);
575#endif
576#ifdef ALTQ_CODEL
577 if (q_is_codel(cl->cl_q))
578 return codel_addq(cl->cl_codel, cl->cl_q, m);
579#endif
548 if (qlen(cl->cl_q) >= qlimit(cl->cl_q)) {
549 m_freem(m);
550 return (-1);
551 }
552
553 if (cl->cl_flags & PRCF_CLEARDSCP)
554 write_dsfield(m, cl->cl_pktattr, 0);
555

--- 8 unchanged lines hidden (view full) ---

564#ifdef ALTQ_RIO
565 if (q_is_rio(cl->cl_q))
566 return rio_getq((rio_t *)cl->cl_red, cl->cl_q);
567#endif
568#ifdef ALTQ_RED
569 if (q_is_red(cl->cl_q))
570 return red_getq(cl->cl_red, cl->cl_q);
571#endif
580 if (qlen(cl->cl_q) >= qlimit(cl->cl_q)) {
581 m_freem(m);
582 return (-1);
583 }
584
585 if (cl->cl_flags & PRCF_CLEARDSCP)
586 write_dsfield(m, cl->cl_pktattr, 0);
587

--- 8 unchanged lines hidden (view full) ---

596#ifdef ALTQ_RIO
597 if (q_is_rio(cl->cl_q))
598 return rio_getq((rio_t *)cl->cl_red, cl->cl_q);
599#endif
600#ifdef ALTQ_RED
601 if (q_is_red(cl->cl_q))
602 return red_getq(cl->cl_red, cl->cl_q);
603#endif
604#ifdef ALTQ_CODEL
605 if (q_is_codel(cl->cl_q))
606 return codel_getq(cl->cl_codel, cl->cl_q);
607#endif
572 return _getq(cl->cl_q);
573}
574
575static struct mbuf *
576priq_pollq(cl)
577 struct priq_class *cl;
578{
579 return qhead(cl->cl_q);

--- 28 unchanged lines hidden (view full) ---

608#ifdef ALTQ_RED
609 if (q_is_red(cl->cl_q))
610 red_getstats(cl->cl_red, &sp->red[0]);
611#endif
612#ifdef ALTQ_RIO
613 if (q_is_rio(cl->cl_q))
614 rio_getstats((rio_t *)cl->cl_red, &sp->red[0]);
615#endif
608 return _getq(cl->cl_q);
609}
610
611static struct mbuf *
612priq_pollq(cl)
613 struct priq_class *cl;
614{
615 return qhead(cl->cl_q);

--- 28 unchanged lines hidden (view full) ---

644#ifdef ALTQ_RED
645 if (q_is_red(cl->cl_q))
646 red_getstats(cl->cl_red, &sp->red[0]);
647#endif
648#ifdef ALTQ_RIO
649 if (q_is_rio(cl->cl_q))
650 rio_getstats((rio_t *)cl->cl_red, &sp->red[0]);
651#endif
616
652#ifdef ALTQ_CODEL
653 if (q_is_codel(cl->cl_q))
654 codel_getstats(cl->cl_codel, &sp->codel);
655#endif
617}
618
619/* convert a class handle to the corresponding class pointer */
620static struct priq_class *
621clh_to_clp(struct priq_if *pif, u_int32_t chandle)
622{
623 struct priq_class *cl;
624 int idx;

--- 407 unchanged lines hidden ---
656}
657
658/* convert a class handle to the corresponding class pointer */
659static struct priq_class *
660clh_to_clp(struct priq_if *pif, u_int32_t chandle)
661{
662 struct priq_class *cl;
663 int idx;

--- 407 unchanged lines hidden ---