aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/core/netpoll.c99
1 files changed, 48 insertions, 51 deletions
diff --git a/net/core/netpoll.c b/net/core/netpoll.c
index 0d1de3c47a01..0746c81c57b0 100644
--- a/net/core/netpoll.c
+++ b/net/core/netpoll.c
@@ -78,7 +78,7 @@ static void queue_process(void *p)
78} 78}
79 79
80static int checksum_udp(struct sk_buff *skb, struct udphdr *uh, 80static int checksum_udp(struct sk_buff *skb, struct udphdr *uh,
81 unsigned short ulen, u32 saddr, u32 daddr) 81 unsigned short ulen, u32 saddr, u32 daddr)
82{ 82{
83 unsigned int psum; 83 unsigned int psum;
84 84
@@ -144,12 +144,11 @@ static void service_arp_queue(struct netpoll_info *npi)
144 arp_reply(skb); 144 arp_reply(skb);
145 skb = skb_dequeue(&npi->arp_tx); 145 skb = skb_dequeue(&npi->arp_tx);
146 } 146 }
147 return;
148} 147}
149 148
150void netpoll_poll(struct netpoll *np) 149void netpoll_poll(struct netpoll *np)
151{ 150{
152 if(!np->dev || !netif_running(np->dev) || !np->dev->poll_controller) 151 if (!np->dev || !netif_running(np->dev) || !np->dev->poll_controller)
153 return; 152 return;
154 153
155 /* Process pending work on NIC */ 154 /* Process pending work on NIC */
@@ -194,7 +193,7 @@ static void zap_completion_queue(void)
194 while (clist != NULL) { 193 while (clist != NULL) {
195 struct sk_buff *skb = clist; 194 struct sk_buff *skb = clist;
196 clist = clist->next; 195 clist = clist->next;
197 if(skb->destructor) 196 if (skb->destructor)
198 dev_kfree_skb_any(skb); /* put this one back */ 197 dev_kfree_skb_any(skb); /* put this one back */
199 else 198 else
200 __kfree_skb(skb); 199 __kfree_skb(skb);
@@ -217,7 +216,7 @@ repeat:
217 if (!skb) 216 if (!skb)
218 skb = skb_dequeue(&skb_pool); 217 skb = skb_dequeue(&skb_pool);
219 218
220 if(!skb) { 219 if (!skb) {
221 if (++count < 10) { 220 if (++count < 10) {
222 netpoll_poll(np); 221 netpoll_poll(np);
223 goto repeat; 222 goto repeat;
@@ -243,12 +242,11 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
243 } 242 }
244 243
245 /* don't get messages out of order, and no recursion */ 244 /* don't get messages out of order, and no recursion */
246 if ( skb_queue_len(&npinfo->txq) == 0 245 if (skb_queue_len(&npinfo->txq) == 0 &&
247 && npinfo->poll_owner != smp_processor_id() 246 npinfo->poll_owner != smp_processor_id() &&
248 && netif_tx_trylock(dev)) { 247 netif_tx_trylock(dev)) {
249
250 /* try until next clock tick */ 248 /* try until next clock tick */
251 for(tries = jiffies_to_usecs(1)/USEC_PER_POLL; tries > 0; --tries) { 249 for (tries = jiffies_to_usecs(1)/USEC_PER_POLL; tries > 0; --tries) {
252 if (!netif_queue_stopped(dev)) 250 if (!netif_queue_stopped(dev))
253 status = dev->hard_start_xmit(skb, dev); 251 status = dev->hard_start_xmit(skb, dev);
254 252
@@ -384,8 +382,8 @@ static void arp_reply(struct sk_buff *skb)
384 382
385 if (np->dev->hard_header && 383 if (np->dev->hard_header &&
386 np->dev->hard_header(send_skb, skb->dev, ptype, 384 np->dev->hard_header(send_skb, skb->dev, ptype,
387 np->remote_mac, np->local_mac, 385 np->remote_mac, np->local_mac,
388 send_skb->len) < 0) { 386 send_skb->len) < 0) {
389 kfree_skb(send_skb); 387 kfree_skb(send_skb);
390 return; 388 return;
391 } 389 }
@@ -423,7 +421,6 @@ int __netpoll_rx(struct sk_buff *skb)
423 struct netpoll_info *npi = skb->dev->npinfo; 421 struct netpoll_info *npi = skb->dev->npinfo;
424 struct netpoll *np = npi->rx_np; 422 struct netpoll *np = npi->rx_np;
425 423
426
427 if (!np) 424 if (!np)
428 goto out; 425 goto out;
429 if (skb->dev->type != ARPHRD_ETHER) 426 if (skb->dev->type != ARPHRD_ETHER)
@@ -496,47 +493,47 @@ int netpoll_parse_options(struct netpoll *np, char *opt)
496{ 493{
497 char *cur=opt, *delim; 494 char *cur=opt, *delim;
498 495
499 if(*cur != '@') { 496 if (*cur != '@') {
500 if ((delim = strchr(cur, '@')) == NULL) 497 if ((delim = strchr(cur, '@')) == NULL)
501 goto parse_failed; 498 goto parse_failed;
502 *delim=0; 499 *delim = 0;
503 np->local_port=simple_strtol(cur, NULL, 10); 500 np->local_port = simple_strtol(cur, NULL, 10);
504 cur=delim; 501 cur = delim;
505 } 502 }
506 cur++; 503 cur++;
507 printk(KERN_INFO "%s: local port %d\n", np->name, np->local_port); 504 printk(KERN_INFO "%s: local port %d\n", np->name, np->local_port);
508 505
509 if(*cur != '/') { 506 if (*cur != '/') {
510 if ((delim = strchr(cur, '/')) == NULL) 507 if ((delim = strchr(cur, '/')) == NULL)
511 goto parse_failed; 508 goto parse_failed;
512 *delim=0; 509 *delim = 0;
513 np->local_ip=ntohl(in_aton(cur)); 510 np->local_ip = ntohl(in_aton(cur));
514 cur=delim; 511 cur = delim;
515 512
516 printk(KERN_INFO "%s: local IP %d.%d.%d.%d\n", 513 printk(KERN_INFO "%s: local IP %d.%d.%d.%d\n",
517 np->name, HIPQUAD(np->local_ip)); 514 np->name, HIPQUAD(np->local_ip));
518 } 515 }
519 cur++; 516 cur++;
520 517
521 if ( *cur != ',') { 518 if (*cur != ',') {
522 /* parse out dev name */ 519 /* parse out dev name */
523 if ((delim = strchr(cur, ',')) == NULL) 520 if ((delim = strchr(cur, ',')) == NULL)
524 goto parse_failed; 521 goto parse_failed;
525 *delim=0; 522 *delim = 0;
526 strlcpy(np->dev_name, cur, sizeof(np->dev_name)); 523 strlcpy(np->dev_name, cur, sizeof(np->dev_name));
527 cur=delim; 524 cur = delim;
528 } 525 }
529 cur++; 526 cur++;
530 527
531 printk(KERN_INFO "%s: interface %s\n", np->name, np->dev_name); 528 printk(KERN_INFO "%s: interface %s\n", np->name, np->dev_name);
532 529
533 if ( *cur != '@' ) { 530 if (*cur != '@') {
534 /* dst port */ 531 /* dst port */
535 if ((delim = strchr(cur, '@')) == NULL) 532 if ((delim = strchr(cur, '@')) == NULL)
536 goto parse_failed; 533 goto parse_failed;
537 *delim=0; 534 *delim = 0;
538 np->remote_port=simple_strtol(cur, NULL, 10); 535 np->remote_port = simple_strtol(cur, NULL, 10);
539 cur=delim; 536 cur = delim;
540 } 537 }
541 cur++; 538 cur++;
542 printk(KERN_INFO "%s: remote port %d\n", np->name, np->remote_port); 539 printk(KERN_INFO "%s: remote port %d\n", np->name, np->remote_port);
@@ -544,42 +541,41 @@ int netpoll_parse_options(struct netpoll *np, char *opt)
544 /* dst ip */ 541 /* dst ip */
545 if ((delim = strchr(cur, '/')) == NULL) 542 if ((delim = strchr(cur, '/')) == NULL)
546 goto parse_failed; 543 goto parse_failed;
547 *delim=0; 544 *delim = 0;
548 np->remote_ip=ntohl(in_aton(cur)); 545 np->remote_ip = ntohl(in_aton(cur));
549 cur=delim+1; 546 cur = delim + 1;
550 547
551 printk(KERN_INFO "%s: remote IP %d.%d.%d.%d\n", 548 printk(KERN_INFO "%s: remote IP %d.%d.%d.%d\n",
552 np->name, HIPQUAD(np->remote_ip)); 549 np->name, HIPQUAD(np->remote_ip));
553 550
554 if( *cur != 0 ) 551 if (*cur != 0) {
555 {
556 /* MAC address */ 552 /* MAC address */
557 if ((delim = strchr(cur, ':')) == NULL) 553 if ((delim = strchr(cur, ':')) == NULL)
558 goto parse_failed; 554 goto parse_failed;
559 *delim=0; 555 *delim = 0;
560 np->remote_mac[0]=simple_strtol(cur, NULL, 16); 556 np->remote_mac[0] = simple_strtol(cur, NULL, 16);
561 cur=delim+1; 557 cur = delim + 1;
562 if ((delim = strchr(cur, ':')) == NULL) 558 if ((delim = strchr(cur, ':')) == NULL)
563 goto parse_failed; 559 goto parse_failed;
564 *delim=0; 560 *delim = 0;
565 np->remote_mac[1]=simple_strtol(cur, NULL, 16); 561 np->remote_mac[1] = simple_strtol(cur, NULL, 16);
566 cur=delim+1; 562 cur = delim + 1;
567 if ((delim = strchr(cur, ':')) == NULL) 563 if ((delim = strchr(cur, ':')) == NULL)
568 goto parse_failed; 564 goto parse_failed;
569 *delim=0; 565 *delim = 0;
570 np->remote_mac[2]=simple_strtol(cur, NULL, 16); 566 np->remote_mac[2] = simple_strtol(cur, NULL, 16);
571 cur=delim+1; 567 cur = delim + 1;
572 if ((delim = strchr(cur, ':')) == NULL) 568 if ((delim = strchr(cur, ':')) == NULL)
573 goto parse_failed; 569 goto parse_failed;
574 *delim=0; 570 *delim = 0;
575 np->remote_mac[3]=simple_strtol(cur, NULL, 16); 571 np->remote_mac[3] = simple_strtol(cur, NULL, 16);
576 cur=delim+1; 572 cur = delim + 1;
577 if ((delim = strchr(cur, ':')) == NULL) 573 if ((delim = strchr(cur, ':')) == NULL)
578 goto parse_failed; 574 goto parse_failed;
579 *delim=0; 575 *delim = 0;
580 np->remote_mac[4]=simple_strtol(cur, NULL, 16); 576 np->remote_mac[4] = simple_strtol(cur, NULL, 16);
581 cur=delim+1; 577 cur = delim + 1;
582 np->remote_mac[5]=simple_strtol(cur, NULL, 16); 578 np->remote_mac[5] = simple_strtol(cur, NULL, 16);
583 } 579 }
584 580
585 printk(KERN_INFO "%s: remote ethernet address " 581 printk(KERN_INFO "%s: remote ethernet address "
@@ -735,7 +731,8 @@ int netpoll_setup(struct netpoll *np)
735 return err; 731 return err;
736} 732}
737 733
738static int __init netpoll_init(void) { 734static int __init netpoll_init(void)
735{
739 skb_queue_head_init(&skb_pool); 736 skb_queue_head_init(&skb_pool);
740 return 0; 737 return 0;
741} 738}