Commit ed8b330bccabb03c930ed1e4d72e341130f9b406
Committed by
Anthony Liguori
1 parent
976305b7
Don't send all gratuitous packets at once.
Use timer to separate them in time. Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
1 changed file
with
19 additions
and
5 deletions
savevm.c
@@ -116,23 +116,37 @@ static int announce_self_create(uint8_t *buf, | @@ -116,23 +116,37 @@ static int announce_self_create(uint8_t *buf, | ||
116 | return 64; /* len */ | 116 | return 64; /* len */ |
117 | } | 117 | } |
118 | 118 | ||
119 | -void qemu_announce_self(void) | 119 | +static void qemu_announce_self_once(void *opaque) |
120 | { | 120 | { |
121 | - int i, j, len; | 121 | + int i, len; |
122 | VLANState *vlan; | 122 | VLANState *vlan; |
123 | VLANClientState *vc; | 123 | VLANClientState *vc; |
124 | uint8_t buf[256]; | 124 | uint8_t buf[256]; |
125 | + static int count = SELF_ANNOUNCE_ROUNDS; | ||
126 | + QEMUTimer *timer = *(QEMUTimer **)opaque; | ||
125 | 127 | ||
126 | for (i = 0; i < MAX_NICS; i++) { | 128 | for (i = 0; i < MAX_NICS; i++) { |
127 | if (!nd_table[i].used) | 129 | if (!nd_table[i].used) |
128 | continue; | 130 | continue; |
129 | len = announce_self_create(buf, nd_table[i].macaddr); | 131 | len = announce_self_create(buf, nd_table[i].macaddr); |
130 | vlan = nd_table[i].vlan; | 132 | vlan = nd_table[i].vlan; |
131 | - for(vc = vlan->first_client; vc != NULL; vc = vc->next) { | ||
132 | - for (j=0; j < SELF_ANNOUNCE_ROUNDS; j++) | ||
133 | - vc->fd_read(vc->opaque, buf, len); | 133 | + for(vc = vlan->first_client; vc != NULL; vc = vc->next) { |
134 | + vc->fd_read(vc->opaque, buf, len); | ||
134 | } | 135 | } |
135 | } | 136 | } |
137 | + if (count--) { | ||
138 | + qemu_mod_timer(timer, qemu_get_clock(rt_clock) + 100); | ||
139 | + } else { | ||
140 | + qemu_del_timer(timer); | ||
141 | + qemu_free_timer(timer); | ||
142 | + } | ||
143 | +} | ||
144 | + | ||
145 | +void qemu_announce_self(void) | ||
146 | +{ | ||
147 | + static QEMUTimer *timer; | ||
148 | + timer = qemu_new_timer(rt_clock, qemu_announce_self_once, &timer); | ||
149 | + qemu_announce_self_once(&timer); | ||
136 | } | 150 | } |
137 | 151 | ||
138 | /***********************************************************/ | 152 | /***********************************************************/ |