1/*
2  PIM for Quagga
3  Copyright (C) 2008  Everton da Silva Marques
4
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9
10  This program is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  General Public License for more details.
14
15  You should have received a copy of the GNU General Public License
16  along with this program; see the file COPYING; if not, write to the
17  Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
18  MA 02110-1301 USA
19
20  $QuaggaId: $Format:%an, %ai, %h$ $
21*/
22
23#include <zebra.h>
24
25#include "if.h"
26#include "linklist.h"
27
28#include "pimd.h"
29#include "pim_vty.h"
30#include "pim_iface.h"
31#include "pim_cmd.h"
32#include "pim_str.h"
33#include "pim_ssmpingd.h"
34
35int pim_debug_config_write(struct vty *vty)
36{
37  int writes = 0;
38
39  if (PIM_DEBUG_IGMP_EVENTS) {
40    vty_out(vty, "debug igmp events%s", VTY_NEWLINE);
41    ++writes;
42  }
43  if (PIM_DEBUG_IGMP_PACKETS) {
44    vty_out(vty, "debug igmp packets%s", VTY_NEWLINE);
45    ++writes;
46  }
47  if (PIM_DEBUG_IGMP_TRACE) {
48    vty_out(vty, "debug igmp trace%s", VTY_NEWLINE);
49    ++writes;
50  }
51
52  if (PIM_DEBUG_MROUTE) {
53    vty_out(vty, "debug mroute%s", VTY_NEWLINE);
54    ++writes;
55  }
56
57  if (PIM_DEBUG_PIM_EVENTS) {
58    vty_out(vty, "debug pim events%s", VTY_NEWLINE);
59    ++writes;
60  }
61  if (PIM_DEBUG_PIM_PACKETS) {
62    vty_out(vty, "debug pim packets%s", VTY_NEWLINE);
63    ++writes;
64  }
65  if (PIM_DEBUG_PIM_PACKETDUMP_SEND) {
66    vty_out(vty, "debug pim packet-dump send%s", VTY_NEWLINE);
67    ++writes;
68  }
69  if (PIM_DEBUG_PIM_PACKETDUMP_RECV) {
70    vty_out(vty, "debug pim packet-dump receive%s", VTY_NEWLINE);
71    ++writes;
72  }
73  if (PIM_DEBUG_PIM_TRACE) {
74    vty_out(vty, "debug pim trace%s", VTY_NEWLINE);
75    ++writes;
76  }
77
78  if (PIM_DEBUG_ZEBRA) {
79    vty_out(vty, "debug pim zebra%s", VTY_NEWLINE);
80    ++writes;
81  }
82
83  if (PIM_DEBUG_SSMPINGD) {
84    vty_out(vty, "debug ssmpingd%s", VTY_NEWLINE);
85    ++writes;
86  }
87
88  return writes;
89}
90
91int pim_global_config_write(struct vty *vty)
92{
93  int writes = 0;
94
95  if (PIM_MROUTE_IS_ENABLED) {
96    vty_out(vty, "%s%s", PIM_CMD_IP_MULTICAST_ROUTING, VTY_NEWLINE);
97    ++writes;
98  }
99
100  if (qpim_ssmpingd_list) {
101    struct listnode *node;
102    struct ssmpingd_sock *ss;
103    vty_out(vty, "!%s", VTY_NEWLINE);
104    ++writes;
105    for (ALL_LIST_ELEMENTS_RO(qpim_ssmpingd_list, node, ss)) {
106      char source_str[100];
107      pim_inet4_dump("<src?>", ss->source_addr, source_str, sizeof(source_str));
108      vty_out(vty, "ip ssmpingd %s%s", source_str, VTY_NEWLINE);
109      ++writes;
110    }
111  }
112
113  return writes;
114}
115
116int pim_interface_config_write(struct vty *vty)
117{
118  int writes = 0;
119  struct listnode *node;
120  struct interface *ifp;
121
122  for (ALL_LIST_ELEMENTS_RO(iflist, node, ifp)) {
123
124    /* IF name */
125    vty_out(vty, "interface %s%s", ifp->name, VTY_NEWLINE);
126    ++writes;
127
128    if (ifp->info) {
129      struct pim_interface *pim_ifp = ifp->info;
130
131      /* IF ip pim ssm */
132      if (PIM_IF_TEST_PIM(pim_ifp->options)) {
133	vty_out(vty, " ip pim ssm%s", VTY_NEWLINE);
134	++writes;
135      }
136
137      /* IF ip igmp */
138      if (PIM_IF_TEST_IGMP(pim_ifp->options)) {
139	vty_out(vty, " ip igmp%s", VTY_NEWLINE);
140	++writes;
141      }
142
143      /* IF ip igmp query-interval */
144      vty_out(vty, " %s %d%s",
145	      PIM_CMD_IP_IGMP_QUERY_INTERVAL,
146	      pim_ifp->igmp_default_query_interval,
147	      VTY_NEWLINE);
148      ++writes;
149
150      /* IF ip igmp query-max-response-time */
151      vty_out(vty, " %s %d%s",
152	      PIM_CMD_IP_IGMP_QUERY_MAX_RESPONSE_TIME_DSEC,
153	      pim_ifp->igmp_query_max_response_time_dsec,
154	      VTY_NEWLINE);
155      ++writes;
156
157      /* IF ip igmp join */
158      if (pim_ifp->igmp_join_list) {
159	struct listnode *node;
160	struct igmp_join *ij;
161	for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_join_list, node, ij)) {
162	  char group_str[100];
163	  char source_str[100];
164	  pim_inet4_dump("<grp?>", ij->group_addr, group_str, sizeof(group_str));
165	  pim_inet4_dump("<src?>", ij->source_addr, source_str, sizeof(source_str));
166	  vty_out(vty, " ip igmp join %s %s%s",
167		  group_str, source_str,
168		  VTY_NEWLINE);
169	  ++writes;
170	}
171      }
172    }
173    vty_out(vty, "!%s", VTY_NEWLINE);
174    ++writes;
175  }
176
177  return writes;
178}
179