]>
git.proxmox.com Git - mirror_frr.git/blob - ldpd/init.c
4 * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24 #include "ldp_debug.h"
26 static int gen_init_prms_tlv(struct ibuf
*, struct nbr
*);
29 send_init(struct nbr
*nbr
)
35 debug_msg_send("initialization: lsr-id %s", inet_ntoa(nbr
->id
));
37 size
= LDP_HDR_SIZE
+ LDP_MSG_SIZE
+ SESS_PRMS_SIZE
;
38 if ((buf
= ibuf_open(size
)) == NULL
)
41 err
|= gen_ldp_hdr(buf
, size
);
43 err
|= gen_msg_hdr(buf
, MSG_TYPE_INIT
, size
);
45 err
|= gen_init_prms_tlv(buf
, nbr
);
51 evbuf_enqueue(&nbr
->tcp
->wbuf
, buf
);
55 recv_init(struct nbr
*nbr
, char *buf
, uint16_t len
)
58 struct sess_prms_tlv sess
;
61 debug_msg_recv("initialization: lsr-id %s", inet_ntoa(nbr
->id
));
63 memcpy(&msg
, buf
, sizeof(msg
));
67 if (len
< SESS_PRMS_SIZE
) {
68 session_shutdown(nbr
, S_BAD_MSG_LEN
, msg
.id
, msg
.type
);
71 memcpy(&sess
, buf
, sizeof(sess
));
72 if (ntohs(sess
.length
) != SESS_PRMS_LEN
) {
73 session_shutdown(nbr
, S_BAD_TLV_LEN
, msg
.id
, msg
.type
);
76 if (ntohs(sess
.proto_version
) != LDP_VERSION
) {
77 session_shutdown(nbr
, S_BAD_PROTO_VER
, msg
.id
, msg
.type
);
80 if (ntohs(sess
.keepalive_time
) < MIN_KEEPALIVE
) {
81 session_shutdown(nbr
, S_KEEPALIVE_BAD
, msg
.id
, msg
.type
);
84 if (sess
.lsr_id
!= ldp_rtr_id_get(leconf
) ||
85 ntohs(sess
.lspace_id
) != 0) {
86 session_shutdown(nbr
, S_NO_HELLO
, msg
.id
, msg
.type
);
90 buf
+= SESS_PRMS_SIZE
;
91 len
-= SESS_PRMS_SIZE
;
93 /* Optional Parameters */
98 if (len
< sizeof(tlv
)) {
99 session_shutdown(nbr
, S_BAD_TLV_LEN
, msg
.id
, msg
.type
);
103 memcpy(&tlv
, buf
, TLV_HDR_SIZE
);
104 tlv_len
= ntohs(tlv
.length
);
105 if (tlv_len
+ TLV_HDR_SIZE
> len
) {
106 session_shutdown(nbr
, S_BAD_TLV_LEN
, msg
.id
, msg
.type
);
112 switch (ntohs(tlv
.type
)) {
113 case TLV_TYPE_ATMSESSIONPAR
:
114 session_shutdown(nbr
, S_BAD_TLV_VAL
, msg
.id
, msg
.type
);
116 case TLV_TYPE_FRSESSION
:
117 session_shutdown(nbr
, S_BAD_TLV_VAL
, msg
.id
, msg
.type
);
120 if (!(ntohs(tlv
.type
) & UNKNOWN_FLAG
))
121 send_notification_nbr(nbr
, S_UNKNOWN_TLV
,
123 /* ignore unknown tlv */
130 nbr
->keepalive
= min(nbr_get_keepalive(nbr
->af
, nbr
->id
),
131 ntohs(sess
.keepalive_time
));
133 max_pdu_len
= ntohs(sess
.max_pdu_len
);
135 * RFC 5036 - Section 3.5.3:
136 * "A value of 255 or less specifies the default maximum length of
139 if (max_pdu_len
<= 255)
140 max_pdu_len
= LDP_MAX_LEN
;
141 nbr
->max_pdu_len
= min(max_pdu_len
, LDP_MAX_LEN
);
143 nbr_fsm(nbr
, NBR_EVT_INIT_RCVD
);
149 gen_init_prms_tlv(struct ibuf
*buf
, struct nbr
*nbr
)
151 struct sess_prms_tlv parms
;
153 memset(&parms
, 0, sizeof(parms
));
154 parms
.type
= htons(TLV_TYPE_COMMONSESSION
);
155 parms
.length
= htons(SESS_PRMS_LEN
);
156 parms
.proto_version
= htons(LDP_VERSION
);
157 parms
.keepalive_time
= htons(nbr_get_keepalive(nbr
->af
, nbr
->id
));
160 parms
.max_pdu_len
= 0;
161 parms
.lsr_id
= nbr
->id
.s_addr
;
164 return (ibuf_add(buf
, &parms
, SESS_PRMS_SIZE
));