xref: /openbmc/linux/drivers/net/xen-netback/xenbus.c (revision 146c8a77)
1 /*
2  * Xenbus code for netif backend
3  *
4  * Copyright (C) 2005 Rusty Russell <rusty@rustcorp.com.au>
5  * Copyright (C) 2005 XenSource Ltd
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 */
21 
22 #include "common.h"
23 
24 struct backend_info {
25 	struct xenbus_device *dev;
26 	struct xenvif *vif;
27 
28 	/* This is the state that will be reflected in xenstore when any
29 	 * active hotplug script completes.
30 	 */
31 	enum xenbus_state state;
32 
33 	enum xenbus_state frontend_state;
34 	struct xenbus_watch hotplug_status_watch;
35 	u8 have_hotplug_status_watch:1;
36 };
37 
38 static int connect_rings(struct backend_info *);
39 static void connect(struct backend_info *);
40 static void backend_create_xenvif(struct backend_info *be);
41 static void unregister_hotplug_status_watch(struct backend_info *be);
42 static void set_backend_state(struct backend_info *be,
43 			      enum xenbus_state state);
44 
45 static int netback_remove(struct xenbus_device *dev)
46 {
47 	struct backend_info *be = dev_get_drvdata(&dev->dev);
48 
49 	set_backend_state(be, XenbusStateClosed);
50 
51 	unregister_hotplug_status_watch(be);
52 	if (be->vif) {
53 		kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
54 		xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
55 		xenvif_free(be->vif);
56 		be->vif = NULL;
57 	}
58 	kfree(be);
59 	dev_set_drvdata(&dev->dev, NULL);
60 	return 0;
61 }
62 
63 
64 /**
65  * Entry point to this code when a new device is created.  Allocate the basic
66  * structures and switch to InitWait.
67  */
68 static int netback_probe(struct xenbus_device *dev,
69 			 const struct xenbus_device_id *id)
70 {
71 	const char *message;
72 	struct xenbus_transaction xbt;
73 	int err;
74 	int sg;
75 	struct backend_info *be = kzalloc(sizeof(struct backend_info),
76 					  GFP_KERNEL);
77 	if (!be) {
78 		xenbus_dev_fatal(dev, -ENOMEM,
79 				 "allocating backend structure");
80 		return -ENOMEM;
81 	}
82 
83 	be->dev = dev;
84 	dev_set_drvdata(&dev->dev, be);
85 
86 	sg = 1;
87 
88 	do {
89 		err = xenbus_transaction_start(&xbt);
90 		if (err) {
91 			xenbus_dev_fatal(dev, err, "starting transaction");
92 			goto fail;
93 		}
94 
95 		err = xenbus_printf(xbt, dev->nodename, "feature-sg", "%d", sg);
96 		if (err) {
97 			message = "writing feature-sg";
98 			goto abort_transaction;
99 		}
100 
101 		err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4",
102 				    "%d", sg);
103 		if (err) {
104 			message = "writing feature-gso-tcpv4";
105 			goto abort_transaction;
106 		}
107 
108 		/* We support rx-copy path. */
109 		err = xenbus_printf(xbt, dev->nodename,
110 				    "feature-rx-copy", "%d", 1);
111 		if (err) {
112 			message = "writing feature-rx-copy";
113 			goto abort_transaction;
114 		}
115 
116 		/*
117 		 * We don't support rx-flip path (except old guests who don't
118 		 * grok this feature flag).
119 		 */
120 		err = xenbus_printf(xbt, dev->nodename,
121 				    "feature-rx-flip", "%d", 0);
122 		if (err) {
123 			message = "writing feature-rx-flip";
124 			goto abort_transaction;
125 		}
126 
127 		err = xenbus_transaction_end(xbt, 0);
128 	} while (err == -EAGAIN);
129 
130 	if (err) {
131 		xenbus_dev_fatal(dev, err, "completing transaction");
132 		goto fail;
133 	}
134 
135 	/*
136 	 * Split event channels support, this is optional so it is not
137 	 * put inside the above loop.
138 	 */
139 	err = xenbus_printf(XBT_NIL, dev->nodename,
140 			    "feature-split-event-channels",
141 			    "%u", separate_tx_rx_irq);
142 	if (err)
143 		pr_debug("Error writing feature-split-event-channels\n");
144 
145 	err = xenbus_switch_state(dev, XenbusStateInitWait);
146 	if (err)
147 		goto fail;
148 
149 	be->state = XenbusStateInitWait;
150 
151 	/* This kicks hotplug scripts, so do it immediately. */
152 	backend_create_xenvif(be);
153 
154 	return 0;
155 
156 abort_transaction:
157 	xenbus_transaction_end(xbt, 1);
158 	xenbus_dev_fatal(dev, err, "%s", message);
159 fail:
160 	pr_debug("failed\n");
161 	netback_remove(dev);
162 	return err;
163 }
164 
165 
166 /*
167  * Handle the creation of the hotplug script environment.  We add the script
168  * and vif variables to the environment, for the benefit of the vif-* hotplug
169  * scripts.
170  */
171 static int netback_uevent(struct xenbus_device *xdev,
172 			  struct kobj_uevent_env *env)
173 {
174 	struct backend_info *be = dev_get_drvdata(&xdev->dev);
175 	char *val;
176 
177 	val = xenbus_read(XBT_NIL, xdev->nodename, "script", NULL);
178 	if (IS_ERR(val)) {
179 		int err = PTR_ERR(val);
180 		xenbus_dev_fatal(xdev, err, "reading script");
181 		return err;
182 	} else {
183 		if (add_uevent_var(env, "script=%s", val)) {
184 			kfree(val);
185 			return -ENOMEM;
186 		}
187 		kfree(val);
188 	}
189 
190 	if (!be || !be->vif)
191 		return 0;
192 
193 	return add_uevent_var(env, "vif=%s", be->vif->dev->name);
194 }
195 
196 
197 static void backend_create_xenvif(struct backend_info *be)
198 {
199 	int err;
200 	long handle;
201 	struct xenbus_device *dev = be->dev;
202 
203 	if (be->vif != NULL)
204 		return;
205 
206 	err = xenbus_scanf(XBT_NIL, dev->nodename, "handle", "%li", &handle);
207 	if (err != 1) {
208 		xenbus_dev_fatal(dev, err, "reading handle");
209 		return;
210 	}
211 
212 	be->vif = xenvif_alloc(&dev->dev, dev->otherend_id, handle);
213 	if (IS_ERR(be->vif)) {
214 		err = PTR_ERR(be->vif);
215 		be->vif = NULL;
216 		xenbus_dev_fatal(dev, err, "creating interface");
217 		return;
218 	}
219 
220 	kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
221 }
222 
223 static void backend_disconnect(struct backend_info *be)
224 {
225 	if (be->vif)
226 		xenvif_disconnect(be->vif);
227 }
228 
229 static void backend_connect(struct backend_info *be)
230 {
231 	if (be->vif)
232 		connect(be);
233 }
234 
235 static inline void backend_switch_state(struct backend_info *be,
236 					enum xenbus_state state)
237 {
238 	struct xenbus_device *dev = be->dev;
239 
240 	pr_debug("%s -> %s\n", dev->nodename, xenbus_strstate(state));
241 	be->state = state;
242 
243 	/* If we are waiting for a hotplug script then defer the
244 	 * actual xenbus state change.
245 	 */
246 	if (!be->have_hotplug_status_watch)
247 		xenbus_switch_state(dev, state);
248 }
249 
250 /* Handle backend state transitions:
251  *
252  * The backend state starts in InitWait and the following transitions are
253  * allowed.
254  *
255  * InitWait -> Connected
256  *
257  *    ^    \         |
258  *    |     \        |
259  *    |      \       |
260  *    |       \      |
261  *    |        \     |
262  *    |         \    |
263  *    |          V   V
264  *
265  *  Closed  <-> Closing
266  *
267  * The state argument specifies the eventual state of the backend and the
268  * function transitions to that state via the shortest path.
269  */
270 static void set_backend_state(struct backend_info *be,
271 			      enum xenbus_state state)
272 {
273 	while (be->state != state) {
274 		switch (be->state) {
275 		case XenbusStateClosed:
276 			switch (state) {
277 			case XenbusStateInitWait:
278 			case XenbusStateConnected:
279 				pr_info("%s: prepare for reconnect\n",
280 					be->dev->nodename);
281 				backend_switch_state(be, XenbusStateInitWait);
282 				break;
283 			case XenbusStateClosing:
284 				backend_switch_state(be, XenbusStateClosing);
285 				break;
286 			default:
287 				BUG();
288 			}
289 			break;
290 		case XenbusStateInitWait:
291 			switch (state) {
292 			case XenbusStateConnected:
293 				backend_connect(be);
294 				backend_switch_state(be, XenbusStateConnected);
295 				break;
296 			case XenbusStateClosing:
297 			case XenbusStateClosed:
298 				backend_switch_state(be, XenbusStateClosing);
299 				break;
300 			default:
301 				BUG();
302 			}
303 			break;
304 		case XenbusStateConnected:
305 			switch (state) {
306 			case XenbusStateInitWait:
307 			case XenbusStateClosing:
308 			case XenbusStateClosed:
309 				backend_disconnect(be);
310 				backend_switch_state(be, XenbusStateClosing);
311 				break;
312 			default:
313 				BUG();
314 			}
315 			break;
316 		case XenbusStateClosing:
317 			switch (state) {
318 			case XenbusStateInitWait:
319 			case XenbusStateConnected:
320 			case XenbusStateClosed:
321 				backend_switch_state(be, XenbusStateClosed);
322 				break;
323 			default:
324 				BUG();
325 			}
326 			break;
327 		default:
328 			BUG();
329 		}
330 	}
331 }
332 
333 /**
334  * Callback received when the frontend's state changes.
335  */
336 static void frontend_changed(struct xenbus_device *dev,
337 			     enum xenbus_state frontend_state)
338 {
339 	struct backend_info *be = dev_get_drvdata(&dev->dev);
340 
341 	pr_debug("%s -> %s\n", dev->otherend, xenbus_strstate(frontend_state));
342 
343 	be->frontend_state = frontend_state;
344 
345 	switch (frontend_state) {
346 	case XenbusStateInitialising:
347 		set_backend_state(be, XenbusStateInitWait);
348 		break;
349 
350 	case XenbusStateInitialised:
351 		break;
352 
353 	case XenbusStateConnected:
354 		set_backend_state(be, XenbusStateConnected);
355 		break;
356 
357 	case XenbusStateClosing:
358 		set_backend_state(be, XenbusStateClosing);
359 		break;
360 
361 	case XenbusStateClosed:
362 		set_backend_state(be, XenbusStateClosed);
363 		if (xenbus_dev_is_online(dev))
364 			break;
365 		/* fall through if not online */
366 	case XenbusStateUnknown:
367 		set_backend_state(be, XenbusStateClosed);
368 		device_unregister(&dev->dev);
369 		break;
370 
371 	default:
372 		xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
373 				 frontend_state);
374 		break;
375 	}
376 }
377 
378 
379 static void xen_net_read_rate(struct xenbus_device *dev,
380 			      unsigned long *bytes, unsigned long *usec)
381 {
382 	char *s, *e;
383 	unsigned long b, u;
384 	char *ratestr;
385 
386 	/* Default to unlimited bandwidth. */
387 	*bytes = ~0UL;
388 	*usec = 0;
389 
390 	ratestr = xenbus_read(XBT_NIL, dev->nodename, "rate", NULL);
391 	if (IS_ERR(ratestr))
392 		return;
393 
394 	s = ratestr;
395 	b = simple_strtoul(s, &e, 10);
396 	if ((s == e) || (*e != ','))
397 		goto fail;
398 
399 	s = e + 1;
400 	u = simple_strtoul(s, &e, 10);
401 	if ((s == e) || (*e != '\0'))
402 		goto fail;
403 
404 	*bytes = b;
405 	*usec = u;
406 
407 	kfree(ratestr);
408 	return;
409 
410  fail:
411 	pr_warn("Failed to parse network rate limit. Traffic unlimited.\n");
412 	kfree(ratestr);
413 }
414 
415 static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
416 {
417 	char *s, *e, *macstr;
418 	int i;
419 
420 	macstr = s = xenbus_read(XBT_NIL, dev->nodename, "mac", NULL);
421 	if (IS_ERR(macstr))
422 		return PTR_ERR(macstr);
423 
424 	for (i = 0; i < ETH_ALEN; i++) {
425 		mac[i] = simple_strtoul(s, &e, 16);
426 		if ((s == e) || (*e != ((i == ETH_ALEN-1) ? '\0' : ':'))) {
427 			kfree(macstr);
428 			return -ENOENT;
429 		}
430 		s = e+1;
431 	}
432 
433 	kfree(macstr);
434 	return 0;
435 }
436 
437 static void unregister_hotplug_status_watch(struct backend_info *be)
438 {
439 	if (be->have_hotplug_status_watch) {
440 		unregister_xenbus_watch(&be->hotplug_status_watch);
441 		kfree(be->hotplug_status_watch.node);
442 	}
443 	be->have_hotplug_status_watch = 0;
444 }
445 
446 static void hotplug_status_changed(struct xenbus_watch *watch,
447 				   const char **vec,
448 				   unsigned int vec_size)
449 {
450 	struct backend_info *be = container_of(watch,
451 					       struct backend_info,
452 					       hotplug_status_watch);
453 	char *str;
454 	unsigned int len;
455 
456 	str = xenbus_read(XBT_NIL, be->dev->nodename, "hotplug-status", &len);
457 	if (IS_ERR(str))
458 		return;
459 	if (len == sizeof("connected")-1 && !memcmp(str, "connected", len)) {
460 		/* Complete any pending state change */
461 		xenbus_switch_state(be->dev, be->state);
462 
463 		/* Not interested in this watch anymore. */
464 		unregister_hotplug_status_watch(be);
465 	}
466 	kfree(str);
467 }
468 
469 static void connect(struct backend_info *be)
470 {
471 	int err;
472 	struct xenbus_device *dev = be->dev;
473 
474 	err = connect_rings(be);
475 	if (err)
476 		return;
477 
478 	err = xen_net_read_mac(dev, be->vif->fe_dev_addr);
479 	if (err) {
480 		xenbus_dev_fatal(dev, err, "parsing %s/mac", dev->nodename);
481 		return;
482 	}
483 
484 	xen_net_read_rate(dev, &be->vif->credit_bytes,
485 			  &be->vif->credit_usec);
486 	be->vif->remaining_credit = be->vif->credit_bytes;
487 
488 	unregister_hotplug_status_watch(be);
489 	err = xenbus_watch_pathfmt(dev, &be->hotplug_status_watch,
490 				   hotplug_status_changed,
491 				   "%s/%s", dev->nodename, "hotplug-status");
492 	if (!err)
493 		be->have_hotplug_status_watch = 1;
494 
495 	netif_wake_queue(be->vif->dev);
496 }
497 
498 
499 static int connect_rings(struct backend_info *be)
500 {
501 	struct xenvif *vif = be->vif;
502 	struct xenbus_device *dev = be->dev;
503 	unsigned long tx_ring_ref, rx_ring_ref;
504 	unsigned int tx_evtchn, rx_evtchn, rx_copy;
505 	int err;
506 	int val;
507 
508 	err = xenbus_gather(XBT_NIL, dev->otherend,
509 			    "tx-ring-ref", "%lu", &tx_ring_ref,
510 			    "rx-ring-ref", "%lu", &rx_ring_ref, NULL);
511 	if (err) {
512 		xenbus_dev_fatal(dev, err,
513 				 "reading %s/ring-ref",
514 				 dev->otherend);
515 		return err;
516 	}
517 
518 	/* Try split event channels first, then single event channel. */
519 	err = xenbus_gather(XBT_NIL, dev->otherend,
520 			    "event-channel-tx", "%u", &tx_evtchn,
521 			    "event-channel-rx", "%u", &rx_evtchn, NULL);
522 	if (err < 0) {
523 		err = xenbus_scanf(XBT_NIL, dev->otherend,
524 				   "event-channel", "%u", &tx_evtchn);
525 		if (err < 0) {
526 			xenbus_dev_fatal(dev, err,
527 					 "reading %s/event-channel(-tx/rx)",
528 					 dev->otherend);
529 			return err;
530 		}
531 		rx_evtchn = tx_evtchn;
532 	}
533 
534 	err = xenbus_scanf(XBT_NIL, dev->otherend, "request-rx-copy", "%u",
535 			   &rx_copy);
536 	if (err == -ENOENT) {
537 		err = 0;
538 		rx_copy = 0;
539 	}
540 	if (err < 0) {
541 		xenbus_dev_fatal(dev, err, "reading %s/request-rx-copy",
542 				 dev->otherend);
543 		return err;
544 	}
545 	if (!rx_copy)
546 		return -EOPNOTSUPP;
547 
548 	if (vif->dev->tx_queue_len != 0) {
549 		if (xenbus_scanf(XBT_NIL, dev->otherend,
550 				 "feature-rx-notify", "%d", &val) < 0)
551 			val = 0;
552 		if (val)
553 			vif->can_queue = 1;
554 		else
555 			/* Must be non-zero for pfifo_fast to work. */
556 			vif->dev->tx_queue_len = 1;
557 	}
558 
559 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg",
560 			 "%d", &val) < 0)
561 		val = 0;
562 	vif->can_sg = !!val;
563 
564 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4",
565 			 "%d", &val) < 0)
566 		val = 0;
567 	vif->gso = !!val;
568 
569 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4-prefix",
570 			 "%d", &val) < 0)
571 		val = 0;
572 	vif->gso_prefix = !!val;
573 
574 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-no-csum-offload",
575 			 "%d", &val) < 0)
576 		val = 0;
577 	vif->ip_csum = !val;
578 
579 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-ipv6-csum-offload",
580 			 "%d", &val) < 0)
581 		val = 0;
582 	vif->ipv6_csum = !!val;
583 
584 	/* Map the shared frame, irq etc. */
585 	err = xenvif_connect(vif, tx_ring_ref, rx_ring_ref,
586 			     tx_evtchn, rx_evtchn);
587 	if (err) {
588 		xenbus_dev_fatal(dev, err,
589 				 "mapping shared-frames %lu/%lu port tx %u rx %u",
590 				 tx_ring_ref, rx_ring_ref,
591 				 tx_evtchn, rx_evtchn);
592 		return err;
593 	}
594 	return 0;
595 }
596 
597 
598 /* ** Driver Registration ** */
599 
600 
601 static const struct xenbus_device_id netback_ids[] = {
602 	{ "vif" },
603 	{ "" }
604 };
605 
606 
607 static DEFINE_XENBUS_DRIVER(netback, ,
608 	.probe = netback_probe,
609 	.remove = netback_remove,
610 	.uevent = netback_uevent,
611 	.otherend_changed = frontend_changed,
612 );
613 
614 int xenvif_xenbus_init(void)
615 {
616 	return xenbus_register_backend(&netback_driver);
617 }
618 
619 void xenvif_xenbus_fini(void)
620 {
621 	return xenbus_unregister_driver(&netback_driver);
622 }
623