notifications.c revision 1.3 1 1.3 kefren /* $NetBSD: notifications.c,v 1.3 2013/07/11 05:45:23 kefren Exp $ */
2 1.1 kefren
3 1.1 kefren /*-
4 1.1 kefren * Copyright (c) 2010 The NetBSD Foundation, Inc.
5 1.1 kefren * All rights reserved.
6 1.1 kefren *
7 1.1 kefren * This code is derived from software contributed to The NetBSD Foundation
8 1.1 kefren * by Mihai Chelaru <kefren (at) NetBSD.org>
9 1.1 kefren *
10 1.1 kefren * Redistribution and use in source and binary forms, with or without
11 1.1 kefren * modification, are permitted provided that the following conditions
12 1.1 kefren * are met:
13 1.1 kefren * 1. Redistributions of source code must retain the above copyright
14 1.1 kefren * notice, this list of conditions and the following disclaimer.
15 1.1 kefren * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 kefren * notice, this list of conditions and the following disclaimer in the
17 1.1 kefren * documentation and/or other materials provided with the distribution.
18 1.1 kefren *
19 1.1 kefren * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 kefren * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 kefren * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 kefren * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 kefren * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 kefren * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 kefren * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 kefren * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 kefren * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 kefren * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 kefren * POSSIBILITY OF SUCH DAMAGE.
30 1.1 kefren */
31 1.1 kefren
32 1.1 kefren #include <arpa/inet.h>
33 1.1 kefren
34 1.1 kefren #include <stdlib.h>
35 1.1 kefren
36 1.1 kefren #include "ldp.h"
37 1.1 kefren #include "socketops.h"
38 1.1 kefren #include "tlv.h"
39 1.1 kefren #include "ldp_errors.h"
40 1.1 kefren #include "notifications.h"
41 1.1 kefren
42 1.1 kefren /* builds a notification TLV. Do not forget to free the result */
43 1.1 kefren struct notification_tlv *
44 1.1 kefren build_notification(uint32_t msg, uint32_t n)
45 1.1 kefren {
46 1.1 kefren struct notification_tlv *t;
47 1.2 christos t = malloc(sizeof(*t));
48 1.1 kefren
49 1.1 kefren if (!t) {
50 1.1 kefren fatalp("build_notification: malloc problem\n");
51 1.1 kefren return NULL;
52 1.2 christos }
53 1.1 kefren
54 1.1 kefren t->type = htons(LDP_NOTIFICATION);
55 1.1 kefren t->length = htons(sizeof(struct notification_tlv) - TLV_TYPE_LENGTH);
56 1.1 kefren t->status = htons(TLV_STATUS);
57 1.1 kefren t->st_len = sizeof(struct notification_tlv) - 2 * TLV_TYPE_LENGTH;
58 1.1 kefren t->st_code = htonl(n);
59 1.1 kefren t->msg_id = htonl(msg);
60 1.1 kefren t->msg_type = 0;
61 1.1 kefren return t;
62 1.1 kefren
63 1.1 kefren }
64 1.1 kefren
65 1.1 kefren int
66 1.3 kefren send_notification(const struct ldp_peer * p, uint32_t msg, uint32_t code)
67 1.1 kefren {
68 1.1 kefren struct notification_tlv *nt;
69 1.1 kefren int rv;
70 1.1 kefren
71 1.1 kefren if (p->state != LDP_PEER_CONNECTED && p->state != LDP_PEER_ESTABLISHED)
72 1.1 kefren return -1;
73 1.1 kefren
74 1.1 kefren nt = build_notification(msg, code);
75 1.1 kefren
76 1.1 kefren rv = send_tlv(p, (struct tlv *) nt);
77 1.1 kefren free(nt);
78 1.1 kefren return rv;
79 1.1 kefren }
80